diff --git a/internal/checks/checker.go b/internal/checker/checker.go similarity index 99% rename from internal/checks/checker.go rename to internal/checker/checker.go index 82b7d6e..8f3fcd1 100644 --- a/internal/checks/checker.go +++ b/internal/checker/checker.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" diff --git a/internal/checks/checker_test.go b/internal/checker/checker_test.go similarity index 99% rename from internal/checks/checker_test.go rename to internal/checker/checker_test.go index d3dbb18..e33c127 100644 --- a/internal/checks/checker_test.go +++ b/internal/checker/checker_test.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "testing" diff --git a/internal/checks/http_checker.go b/internal/checker/http_checker.go similarity index 99% rename from internal/checks/http_checker.go rename to internal/checker/http_checker.go index 3cf4d47..7f8cf1b 100644 --- a/internal/checks/http_checker.go +++ b/internal/checker/http_checker.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" diff --git a/internal/checks/http_checker_test.go b/internal/checker/http_checker_test.go similarity index 95% rename from internal/checks/http_checker_test.go rename to internal/checker/http_checker_test.go index c1c4c7b..ef181d0 100644 --- a/internal/checks/http_checker_test.go +++ b/internal/checker/http_checker_test.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" @@ -93,7 +93,12 @@ func TestHTTPChecker(t *testing.T) { t.Run("Invalid URL for HTTP check", func(t *testing.T) { t.Parallel() - _, err := newHTTPChecker("example", "://invalid-url") + checker, err := newHTTPChecker("example", "://invalid-url") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + err = checker.Check(context.Background()) // Run the check to trigger the error. if err == nil { t.Fatal("expected an error, got none") } diff --git a/internal/checks/icmp_checker.go b/internal/checker/icmp_checker.go similarity index 99% rename from internal/checks/icmp_checker.go rename to internal/checker/icmp_checker.go index 7505c2f..effcc8e 100644 --- a/internal/checks/icmp_checker.go +++ b/internal/checker/icmp_checker.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" diff --git a/internal/checks/icmp_checker_test.go b/internal/checker/icmp_checker_test.go similarity index 99% rename from internal/checks/icmp_checker_test.go rename to internal/checker/icmp_checker_test.go index 52c2f61..7a073a4 100644 --- a/internal/checks/icmp_checker_test.go +++ b/internal/checker/icmp_checker_test.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" diff --git a/internal/checks/icmp_factory.go b/internal/checker/icmp_factory.go similarity index 99% rename from internal/checks/icmp_factory.go rename to internal/checker/icmp_factory.go index 0c26129..26854fd 100644 --- a/internal/checks/icmp_factory.go +++ b/internal/checker/icmp_factory.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" diff --git a/internal/checks/icmp_factory_test.go b/internal/checker/icmp_factory_test.go similarity index 99% rename from internal/checks/icmp_factory_test.go rename to internal/checker/icmp_factory_test.go index cfeab00..d6e322e 100644 --- a/internal/checks/icmp_factory_test.go +++ b/internal/checker/icmp_factory_test.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" diff --git a/internal/checks/tcp_checker.go b/internal/checker/tcp_checker.go similarity index 98% rename from internal/checks/tcp_checker.go rename to internal/checker/tcp_checker.go index f6caf8e..3ec85db 100644 --- a/internal/checks/tcp_checker.go +++ b/internal/checker/tcp_checker.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" diff --git a/internal/checks/tcp_checker_test.go b/internal/checker/tcp_checker_test.go similarity index 99% rename from internal/checks/tcp_checker_test.go rename to internal/checker/tcp_checker_test.go index 65988ce..94665b6 100644 --- a/internal/checks/tcp_checker_test.go +++ b/internal/checker/tcp_checker_test.go @@ -1,4 +1,4 @@ -package checks +package checker import ( "context" diff --git a/internal/config/http_flags.go b/internal/config/http_flags.go index 4eca302..796aed3 100644 --- a/internal/config/http_flags.go +++ b/internal/config/http_flags.go @@ -5,7 +5,7 @@ import ( "strconv" "time" - "github.com/containeroo/portpatrol/internal/checks" + "github.com/containeroo/portpatrol/internal/checker" "github.com/containeroo/portpatrol/pkg/httputils" ) @@ -21,13 +21,13 @@ const ( ) // parseHTTPCheckerOptions parses HTTP checker-specific options from parameters. -func parseHTTPCheckerOptions(params map[string]string) ([]checks.Option, error) { - var opts []checks.Option +func parseHTTPCheckerOptions(params map[string]string) ([]checker.Option, error) { + var opts []checker.Option unrecognizedParams := trackUnusedParams(params) // HTTP Method if method, ok := params[ParamHTTPMethod]; ok && method != "" { - opts = append(opts, checks.WithHTTPMethod(method)) + opts = append(opts, checker.WithHTTPMethod(method)) delete(unrecognizedParams, ParamHTTPMethod) } @@ -48,7 +48,7 @@ func parseHTTPCheckerOptions(params map[string]string) ([]checks.Option, error) if err != nil { return nil, fmt.Errorf("invalid %q: %w", ParamHTTPHeaders, err) } - opts = append(opts, checks.WithHTTPHeaders(headers)) + opts = append(opts, checker.WithHTTPHeaders(headers)) delete(unrecognizedParams, ParamHTTPHeaders) } @@ -58,7 +58,7 @@ func parseHTTPCheckerOptions(params map[string]string) ([]checks.Option, error) if err != nil { return nil, fmt.Errorf("invalid %q: %w", ParamHTTPExpectedStatusCodes, err) } - opts = append(opts, checks.WithExpectedStatusCodes(codes)) + opts = append(opts, checker.WithExpectedStatusCodes(codes)) delete(unrecognizedParams, ParamHTTPExpectedStatusCodes) } @@ -68,7 +68,7 @@ func parseHTTPCheckerOptions(params map[string]string) ([]checks.Option, error) if err != nil { return nil, fmt.Errorf("invalid %q: %w", ParamHTTPSkipTLSVerify, err) } - opts = append(opts, checks.WithHTTPSkipTLSVerify(skip)) + opts = append(opts, checker.WithHTTPSkipTLSVerify(skip)) delete(unrecognizedParams, ParamHTTPSkipTLSVerify) } @@ -78,7 +78,7 @@ func parseHTTPCheckerOptions(params map[string]string) ([]checks.Option, error) if err != nil || timeout <= 0 { return nil, fmt.Errorf("invalid %q: %w", ParamHTTPTimeout, err) } - opts = append(opts, checks.WithHTTPTimeout(timeout)) + opts = append(opts, checker.WithHTTPTimeout(timeout)) delete(unrecognizedParams, ParamHTTPTimeout) } diff --git a/internal/config/icmp_flags.go b/internal/config/icmp_flags.go index 620dceb..3bc09ff 100644 --- a/internal/config/icmp_flags.go +++ b/internal/config/icmp_flags.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/containeroo/portpatrol/internal/checks" + "github.com/containeroo/portpatrol/internal/checker" ) const ( @@ -13,8 +13,8 @@ const ( ) // parseICMPCheckerOptions parses ICMP checker-specific options from parameters. -func parseICMPCheckerOptions(params map[string]string) ([]checks.Option, error) { - var opts []checks.Option +func parseICMPCheckerOptions(params map[string]string) ([]checker.Option, error) { + var opts []checker.Option unrecognizedParams := trackUnusedParams(params) // ICMP Read Timeout @@ -23,7 +23,7 @@ func parseICMPCheckerOptions(params map[string]string) ([]checks.Option, error) if err != nil { return nil, fmt.Errorf("invalid %q: %w", ParamICMPReadTimeout, err) } - opts = append(opts, checks.WithICMPReadTimeout(readTimeout)) + opts = append(opts, checker.WithICMPReadTimeout(readTimeout)) delete(unrecognizedParams, ParamICMPReadTimeout) } @@ -33,7 +33,7 @@ func parseICMPCheckerOptions(params map[string]string) ([]checks.Option, error) if err != nil { return nil, fmt.Errorf("invalid %q: %w", ParamICMPWriteTimeout, err) } - opts = append(opts, checks.WithICMPWriteTimeout(writeTimeout)) + opts = append(opts, checker.WithICMPWriteTimeout(writeTimeout)) delete(unrecognizedParams, ParamICMPWriteTimeout) } diff --git a/internal/config/parser.go b/internal/config/parser.go index 922bbeb..758c3f0 100644 --- a/internal/config/parser.go +++ b/internal/config/parser.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/containeroo/portpatrol/internal/checks" + "github.com/containeroo/portpatrol/internal/checker" ) const ( @@ -19,7 +19,7 @@ const ( // TargetChecker represents a checker with its interval. type TargetChecker struct { Interval time.Duration - Checker checks.Checker + Checker checker.Checker } // LoadTargetCheckers creates a slice of TargetChecker based on the provided target configurations. @@ -42,7 +42,7 @@ func LoadTargetCheckers(targets map[string]map[string]string, defaultInterval ti checkTypeStr = parts[0] } - checkType, err := checks.GetCheckTypeFromString(checkTypeStr) + checkType, err := checker.GetCheckTypeFromString(checkTypeStr) if err != nil { return nil, fmt.Errorf("unsupported check type %q for target %q", checkTypeStr, targetName) } @@ -75,7 +75,7 @@ func LoadTargetCheckers(targets map[string]map[string]string, defaultInterval ti } // Create the checker using the functional options - chk, err := checks.NewChecker(checkType, name, address, options...) + chk, err := checker.NewChecker(checkType, name, address, options...) if err != nil { return nil, fmt.Errorf("failed to create checker for target %q: %w", targetName, err) } @@ -90,13 +90,13 @@ func LoadTargetCheckers(targets map[string]map[string]string, defaultInterval ti } // collectCheckerOptions collects functional options for a specific check type. -func collectCheckerOptions(checkType checks.CheckType, params map[string]string, targetName string) ([]checks.Option, error) { +func collectCheckerOptions(checkType checker.CheckType, params map[string]string, targetName string) ([]checker.Option, error) { switch checkType { - case checks.HTTP: + case checker.HTTP: return parseHTTPCheckerOptions(params) - case checks.TCP: + case checker.TCP: return parseTCPCheckerOptions(params) - case checks.ICMP: + case checker.ICMP: return parseICMPCheckerOptions(params) default: return nil, fmt.Errorf("unsupported check type for target %q", targetName) diff --git a/internal/config/tcp_flags.go b/internal/config/tcp_flags.go index e5e1ba7..3cc2596 100644 --- a/internal/config/tcp_flags.go +++ b/internal/config/tcp_flags.go @@ -4,14 +4,14 @@ import ( "fmt" "time" - "github.com/containeroo/portpatrol/internal/checks" + "github.com/containeroo/portpatrol/internal/checker" ) const ParamTCPTimeout string = "timeout" // parseTCPCheckerOptions parses TCP checker-specific options from parameters. -func parseTCPCheckerOptions(params map[string]string) ([]checks.Option, error) { - var opts []checks.Option +func parseTCPCheckerOptions(params map[string]string) ([]checker.Option, error) { + var opts []checker.Option unrecognizedParams := trackUnusedParams(params) // TCP Timeout @@ -20,7 +20,7 @@ func parseTCPCheckerOptions(params map[string]string) ([]checks.Option, error) { if err != nil { return nil, fmt.Errorf("invalid %q: %w", ParamTCPTimeout, err) } - opts = append(opts, checks.WithTCPTimeout(timeout)) + opts = append(opts, checker.WithTCPTimeout(timeout)) delete(unrecognizedParams, ParamTCPTimeout) } diff --git a/internal/wait/wait.go b/internal/wait/wait.go index f2c12e9..2b09c21 100644 --- a/internal/wait/wait.go +++ b/internal/wait/wait.go @@ -6,11 +6,11 @@ import ( "log/slog" "time" - "github.com/containeroo/portpatrol/internal/checks" + "github.com/containeroo/portpatrol/internal/checker" ) // WaitUntilReady continuously attempts to connect to the specified target until it becomes available or the context is canceled. -func WaitUntilReady(ctx context.Context, interval time.Duration, checker checks.Checker, logger *slog.Logger) error { +func WaitUntilReady(ctx context.Context, interval time.Duration, checker checker.Checker, logger *slog.Logger) error { logger = logger.With( slog.String("target", checker.GetName()), slog.String("type", checker.GetType()), diff --git a/internal/wait/wait_test.go b/internal/wait/wait_test.go index 7a0c530..9dc71ed 100644 --- a/internal/wait/wait_test.go +++ b/internal/wait/wait_test.go @@ -9,7 +9,7 @@ import ( "testing" "time" - "github.com/containeroo/portpatrol/internal/checks" + "github.com/containeroo/portpatrol/internal/checker" ) // TestWaitUntilReady_ReadyHTTP ensures WaitUntilReady returns success when the HTTP target is ready. @@ -17,13 +17,13 @@ func TestWaitUntilReady_ReadyHTTP(t *testing.T) { t.Parallel() server := &http.Server{Addr: ":9082"} - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + http.HandleFunc("/ready", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) go func() { _ = server.ListenAndServe() }() defer server.Close() - checker, err := checks.NewChecker(checks.HTTP, "HTTPServer", "http://localhost:9082") + checker, err := checker.NewChecker(checker.HTTP, "HTTPServer", "http://localhost:9082/ready") if err != nil { t.Fatalf("Failed to create HTTPChecker: %v", err) } @@ -50,14 +50,14 @@ func TestWaitUntilReady_HTTPFailsInitially(t *testing.T) { t.Parallel() server := &http.Server{Addr: ":9083"} - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + http.HandleFunc("/fail", func(w http.ResponseWriter, r *http.Request) { time.Sleep(500 * time.Millisecond) // Simulate a delayed start w.WriteHeader(http.StatusOK) }) go func() { _ = server.ListenAndServe() }() defer server.Close() - checker, err := checks.NewChecker(checks.HTTP, "HTTPServer", "http://localhost:9083") + checker, err := checker.NewChecker(checker.HTTP, "HTTPServer", "http://localhost:9083/fail") if err != nil { t.Fatalf("Failed to create HTTPChecker: %v", err) } @@ -84,13 +84,14 @@ func TestWaitUntilReady_HTTPContextCanceled(t *testing.T) { t.Parallel() server := &http.Server{Addr: ":9084"} - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + http.HandleFunc("/canceled", func(w http.ResponseWriter, r *http.Request) { + time.Sleep(500 * time.Millisecond) w.WriteHeader(http.StatusOK) }) go func() { _ = server.ListenAndServe() }() defer server.Close() - checker, err := checks.NewChecker(checks.HTTP, "HTTPServer", "http://localhost:9084") + checker, err := checker.NewChecker(checker.HTTP, "HTTPServer", "http://localhost:9084/canceled") if err != nil { t.Fatalf("Failed to create HTTPChecker: %v", err) } @@ -122,7 +123,7 @@ func TestWaitUntilReady_ReadyTCP(t *testing.T) { } defer ln.Close() - checker, err := checks.NewChecker(checks.TCP, "TCPServer", "localhost:9085") + checker, err := checker.NewChecker(checker.TCP, "TCPServer", "localhost:9085") if err != nil { t.Fatalf("Failed to create TCPChecker: %v", err) } @@ -163,7 +164,7 @@ func TestWaitUntilReady_TCPFailsInitially(t *testing.T) { } }() - checker, err := checks.NewChecker(checks.TCP, "TCPServer", "localhost:9086") + checker, err := checker.NewChecker(checker.TCP, "TCPServer", "localhost:9086") if err != nil { t.Fatalf("Failed to create TCPChecker: %v", err) } @@ -189,7 +190,7 @@ func TestWaitUntilReady_TCPFailsInitially(t *testing.T) { func TestWaitUntilReady_TCPContextCanceled(t *testing.T) { t.Parallel() - checker, err := checks.NewChecker(checks.TCP, "TCPServer", "localhost:9087") + checker, err := checker.NewChecker(checker.TCP, "TCPServer", "localhost:9087") if err != nil { t.Fatalf("Failed to create TCPChecker: %v", err) }