From 01cb87808708ef047bb82cc8083ef19708ea3f54 Mon Sep 17 00:00:00 2001 From: a Date: Tue, 18 Jun 2024 20:08:38 -0500 Subject: [PATCH] noot --- caddy.go | 2 +- caddytest/caddytest.go | 77 +++++++++-------------------------- caddytest/caddytest_assert.go | 3 +- caddytest/testing_harness.go | 16 +++++++- 4 files changed, 37 insertions(+), 61 deletions(-) diff --git a/caddy.go b/caddy.go index 9aba97fa..2c18053a 100644 --- a/caddy.go +++ b/caddy.go @@ -780,7 +780,7 @@ func exitProcess(ctx context.Context, logger *zap.Logger) { logger.Error("unclean shutdown") } // check if we are in test environment, and dont call exit if we are - if flag.Lookup("test.v") == nil || strings.Contains(os.Args[0], ".test") { + if flag.Lookup("test.v") == nil || !strings.Contains(os.Args[0], ".test") { os.Exit(exitCode) } }() diff --git a/caddytest/caddytest.go b/caddytest/caddytest.go index f22a09ef..44ae991e 100644 --- a/caddytest/caddytest.go +++ b/caddytest/caddytest.go @@ -4,7 +4,6 @@ import ( "context" "crypto/tls" "encoding/json" - "errors" "fmt" "io" "log" @@ -12,15 +11,11 @@ import ( "net/http" "net/http/cookiejar" "os" - "path" - "reflect" - "runtime" "strings" "time" caddycmd "github.com/caddyserver/caddy/v2/cmd" - "github.com/caddyserver/caddy/v2/caddyconfig" // plug in Caddy modules here _ "github.com/caddyserver/caddy/v2/modules/standard" ) @@ -96,7 +91,7 @@ func (tc *Tester) CleanupCaddy() error { }() _, err := http.Post(fmt.Sprintf("http://localhost:%d/stop", Default.AdminPort), "", nil) if err != nil { - return fmt.Errorf("couldn't stop caddytest server") + return fmt.Errorf("couldn't stop caddytest server: %w", err) } time.Sleep(200 * time.Millisecond) for retries := 0; retries < 10; retries++ { @@ -112,7 +107,6 @@ func (tc *Tester) CleanupCaddy() error { // LoadConfig loads the config to the tester server and also ensures that the config was loaded func (tc *Tester) LoadConfig(rawConfig string, configType string) error { - originalRawConfig := rawConfig // normalize JSON config if configType == "json" { var conf any @@ -157,56 +151,32 @@ func (tc *Tester) LoadConfig(rawConfig string, configType string) error { } tc.configLoaded = true - return tc.ensureConfigRunning(originalRawConfig, configType) + + // if the config is not loaded at this point, it is a bug in caddy's config.Load + // the contract for config.Load states that the config must be loaded before it returns, and that it will + // error if the config fails to apply + return nil } -func (tc *Tester) ensureConfigRunning(rawConfig string, configType string) error { - expectedBytes := []byte(rawConfig) - if configType != "json" { - adapter := caddyconfig.GetAdapter(configType) - if adapter == nil { - return fmt.Errorf("adapter of config type is missing: %s", configType) - } - expectedBytes, _, _ = adapter.Adapt([]byte(rawConfig), nil) - } - - var expected any - err := json.Unmarshal(expectedBytes, &expected) - if err != nil { - return err - } - +func (tc *Tester) GetCurrentConfig(receiver any) error { client := &http.Client{ Timeout: Default.LoadRequestTimeout, } - fetchConfig := func(client *http.Client) any { - resp, err := client.Get(fmt.Sprintf("http://localhost:%d/config/", Default.AdminPort)) - if err != nil { - return nil - } - defer resp.Body.Close() - actualBytes, err := io.ReadAll(resp.Body) - if err != nil { - return nil - } - var actual any - err = json.Unmarshal(actualBytes, &actual) - if err != nil { - return nil - } - return actual + resp, err := client.Get(fmt.Sprintf("http://localhost:%d/config/", Default.AdminPort)) + if err != nil { + return err } - - // TODO: does this really need to be tried more than once? - // Caddy should block until the new config is loaded, which means needing to wait is a caddy bug - for retries := 3; retries > 0; retries-- { - if reflect.DeepEqual(expected, fetchConfig(client)) { - return nil - } - time.Sleep(1 * time.Second) + defer resp.Body.Close() + actualBytes, err := io.ReadAll(resp.Body) + if err != nil { + return err } - return errors.New("EnsureConfigRunning: POSTed configuration isn't active") + err = json.Unmarshal(actualBytes, receiver) + if err != nil { + return err + } + return nil } const initConfig = `{ @@ -258,15 +228,6 @@ func isCaddyAdminRunning() error { return nil } -func getIntegrationDir() string { - _, filename, _, ok := runtime.Caller(1) - if !ok { - panic("unable to determine the current file path") - } - - return path.Dir(filename) -} - // CreateTestingTransport creates a testing transport that forces call dialing connections to happen locally func CreateTestingTransport() *http.Transport { dialer := net.Dialer{ diff --git a/caddytest/caddytest_assert.go b/caddytest/caddytest_assert.go index 359538ad..cfb01935 100644 --- a/caddytest/caddytest_assert.go +++ b/caddytest/caddytest_assert.go @@ -19,12 +19,13 @@ func AssertLoadError(t *testing.T, rawConfig string, configType string, expected require.NoError(t, err) err = tc.LaunchCaddy() require.NoError(t, err) - defer tc.CleanupCaddy() err = tc.LoadConfig(rawConfig, configType) if !strings.Contains(err.Error(), expectedError) { t.Errorf("expected error \"%s\" but got \"%s\"", expectedError, err.Error()) } + err = tc.CleanupCaddy() + require.NoError(t, err) } // CompareAdapt adapts a config and then compares it against an expected result diff --git a/caddytest/testing_harness.go b/caddytest/testing_harness.go index 581d2f7e..f1743097 100644 --- a/caddytest/testing_harness.go +++ b/caddytest/testing_harness.go @@ -6,7 +6,9 @@ import ( "fmt" "io" "net/http" + "path" "regexp" + "runtime" "testing" "github.com/stretchr/testify/require" @@ -21,6 +23,15 @@ func prependCaddyFilePath(rawConfig string) string { return r } +func getIntegrationDir() string { + _, filename, _, ok := runtime.Caller(1) + if !ok { + panic("unable to determine the current file path") + } + + return path.Dir(filename) +} + var ( matchKey = regexp.MustCompile(`(/[\w\d\.]+\.key)`) matchCert = regexp.MustCompile(`(/[\w\d\.]+\.crt)`) @@ -64,7 +75,9 @@ func (tc *TestHarness) init() { tc.tester = tester err = tc.tester.LaunchCaddy() if err != nil { - tc.t.Errorf("Failed to launch caddy tester: %s", err) + tc.t.Errorf("Failed to launch caddy server: %s", err) + tc.t.FailNow() + return } // cleanup tc.t.Cleanup(func() { @@ -87,6 +100,7 @@ func (tc *TestHarness) init() { err = tc.tester.CleanupCaddy() if err != nil { tc.t.Errorf("failed to clean up caddy instance: %s", err) + tc.t.FailNow() } }) }