Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
49c7aefc97 |
@@ -2984,7 +2984,7 @@ webhooker/
|
|||||||
│ │ └── resetpw.go # `webhooker resetpw`: set an account's password, stopped deployments only
|
│ │ └── resetpw.go # `webhooker resetpw`: set an account's password, stopped deployments only
|
||||||
│ ├── config/
|
│ ├── config/
|
||||||
│ │ ├── config.go # Configuration loading from environment variables
|
│ │ ├── config.go # Configuration loading from environment variables
|
||||||
│ │ └── configtest/ # Test support: ClearEnv, an empty environment for one test
|
│ │ └── configtest/ # Test support: ClearEnvForTest, an empty environment for one test
|
||||||
│ ├── database/
|
│ ├── database/
|
||||||
│ │ ├── base_model.go # BaseModel with UUID primary keys
|
│ │ ├── base_model.go # BaseModel with UUID primary keys
|
||||||
│ │ ├── database.go # GORM connection, migrations, admin seed
|
│ │ ├── database.go # GORM connection, migrations, admin seed
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ const dockerStopGrace = 10 * time.Second
|
|||||||
// fx.New applies options before it executes invokes, so the timeout
|
// fx.New applies options before it executes invokes, so the timeout
|
||||||
// is set whether or not the graph itself can be constructed here.
|
// is set whether or not the graph itself can be constructed here.
|
||||||
func TestNewApp_StopTimeout(t *testing.T) {
|
func TestNewApp_StopTimeout(t *testing.T) {
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("DATA_DIR", t.TempDir())
|
t.Setenv("DATA_DIR", t.TempDir())
|
||||||
|
|
||||||
got := newApp().StopTimeout()
|
got := newApp().StopTimeout()
|
||||||
@@ -75,7 +75,7 @@ func freePort(t *testing.T) int {
|
|||||||
// anything is built, and the run of logger.New, which happens before
|
// anything is built, and the run of logger.New, which happens before
|
||||||
// the configuration sets the level.
|
// the configuration sets the level.
|
||||||
func TestNewApp_SendsFxEventsToTheLogger(t *testing.T) {
|
func TestNewApp_SendsFxEventsToTheLogger(t *testing.T) {
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("DATA_DIR", t.TempDir())
|
t.Setenv("DATA_DIR", t.TempDir())
|
||||||
t.Setenv("PORT", strconv.Itoa(freePort(t)))
|
t.Setenv("PORT", strconv.Itoa(freePort(t)))
|
||||||
t.Setenv("DEBUG", "true")
|
t.Setenv("DEBUG", "true")
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ func TestEnvironmentConfig(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
if tt.envValue != "" {
|
if tt.envValue != "" {
|
||||||
t.Setenv(
|
t.Setenv(
|
||||||
@@ -197,7 +197,7 @@ func TestRetentionSweepInterval(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
@@ -336,7 +336,7 @@ func TestSessionIdleTimeout(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
@@ -389,7 +389,7 @@ func TestDefaultDataDir(t *testing.T) {
|
|||||||
t.Run("env="+name, func(t *testing.T) {
|
t.Run("env="+name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
if env != "" {
|
if env != "" {
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", env)
|
t.Setenv("WEBHOOKER_ENVIRONMENT", env)
|
||||||
@@ -434,7 +434,7 @@ func TestDataDirHelper(t *testing.T) {
|
|||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
if set != "" {
|
if set != "" {
|
||||||
t.Setenv("DATA_DIR", set)
|
t.Setenv("DATA_DIR", set)
|
||||||
@@ -499,7 +499,7 @@ func TestReceiverRateLimit(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
@@ -615,7 +615,7 @@ func TestTrustedProxies(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
@@ -726,7 +726,7 @@ func TestAllowedEgressCIDRs(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
@@ -798,7 +798,7 @@ func TestEgressAllowlistWarning(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", config.EnvironmentDev)
|
t.Setenv("WEBHOOKER_ENVIRONMENT", config.EnvironmentDev)
|
||||||
|
|
||||||
if tt.allowed != "" {
|
if tt.allowed != "" {
|
||||||
@@ -934,7 +934,7 @@ func TestMetricsAuthConfig(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
if tt.username.set {
|
if tt.username.set {
|
||||||
t.Setenv("METRICS_USERNAME", tt.username.value)
|
t.Setenv("METRICS_USERNAME", tt.username.value)
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ClearEnv unsets every variable in the process environment
|
// ClearEnvForTest unsets every variable in the process environment
|
||||||
// for the rest of the test, so a test sees only the variables it sets
|
// for the rest of the test, so a test sees only the variables it sets
|
||||||
// itself, not whatever the developer's shell exports. When the test
|
// itself, not whatever the developer's shell exports. When the test
|
||||||
// ends it leaves the environment exactly as it found it: each variable
|
// ends it leaves the environment exactly as it found it: each variable
|
||||||
// it unset is put back, and any variable added since is removed.
|
// it unset is put back, and any variable added since is removed.
|
||||||
func ClearEnv(t *testing.T) {
|
func ClearEnvForTest(t *testing.T) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
present := make(map[string]bool)
|
present := make(map[string]bool)
|
||||||
|
|||||||
@@ -40,9 +40,9 @@ func writeDotEnv(t *testing.T, contents string) string {
|
|||||||
// normally rather than be refused for a file it was never meant to
|
// normally rather than be refused for a file it was never meant to
|
||||||
// have.
|
// have.
|
||||||
//
|
//
|
||||||
//nolint:paralleltest // ClearEnv uses t.Setenv.
|
//nolint:paralleltest // ClearEnvForTest uses t.Setenv.
|
||||||
func TestLoadDotEnv_MissingFileIsFine(t *testing.T) {
|
func TestLoadDotEnv_MissingFileIsFine(t *testing.T) {
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
absent := filepath.Join(t.TempDir(), config.DotEnvPath)
|
absent := filepath.Join(t.TempDir(), config.DotEnvPath)
|
||||||
require.NoError(t, config.LoadDotEnvFileForTest(absent))
|
require.NoError(t, config.LoadDotEnvFileForTest(absent))
|
||||||
@@ -55,9 +55,9 @@ func TestLoadDotEnv_MissingFileIsFine(t *testing.T) {
|
|||||||
// reaches the environment, which is the whole reason the file is read
|
// reaches the environment, which is the whole reason the file is read
|
||||||
// at all.
|
// at all.
|
||||||
//
|
//
|
||||||
//nolint:paralleltest // ClearEnv uses t.Setenv.
|
//nolint:paralleltest // ClearEnvForTest uses t.Setenv.
|
||||||
func TestLoadDotEnv_AppliesValues(t *testing.T) {
|
func TestLoadDotEnv_AppliesValues(t *testing.T) {
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
path := writeDotEnv(t, "# a comment\n"+dotEnvKey+"=from-dot-env\n")
|
path := writeDotEnv(t, "# a comment\n"+dotEnvKey+"=from-dot-env\n")
|
||||||
|
|
||||||
@@ -83,9 +83,9 @@ func TestLoadDotEnv_RealEnvironmentWins(t *testing.T) {
|
|||||||
// reverts to its default; the process used to start that way with no
|
// reverts to its default; the process used to start that way with no
|
||||||
// log line naming the file at all.
|
// log line naming the file at all.
|
||||||
//
|
//
|
||||||
//nolint:paralleltest // ClearEnv uses t.Setenv.
|
//nolint:paralleltest // ClearEnvForTest uses t.Setenv.
|
||||||
func TestLoadDotEnv_MalformedFileAborts(t *testing.T) {
|
func TestLoadDotEnv_MalformedFileAborts(t *testing.T) {
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
path := writeDotEnv(
|
path := writeDotEnv(
|
||||||
t, malformedDotEnv+dotEnvKey+"=from-dot-env\n",
|
t, malformedDotEnv+dotEnvKey+"=from-dot-env\n",
|
||||||
@@ -133,7 +133,7 @@ func TestLoadDotEnv_UnreadableFileAborts(t *testing.T) {
|
|||||||
//
|
//
|
||||||
//nolint:paralleltest // t.Chdir moves the whole process.
|
//nolint:paralleltest // t.Chdir moves the whole process.
|
||||||
func TestLoadDotEnv_ReadsTheWorkingDirectory(t *testing.T) {
|
func TestLoadDotEnv_ReadsTheWorkingDirectory(t *testing.T) {
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
dir := t.TempDir()
|
dir := t.TempDir()
|
||||||
require.NoError(t, os.WriteFile(
|
require.NoError(t, os.WriteFile(
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ func TestEnvBool(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
t.Setenv(testEnvKey, tt.value)
|
t.Setenv(testEnvKey, tt.value)
|
||||||
@@ -170,7 +170,7 @@ func runEnvIntCases(
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
t.Setenv(testEnvKey, tt.value)
|
t.Setenv(testEnvKey, tt.value)
|
||||||
@@ -311,7 +311,7 @@ func TestEnvBindAddress(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
t.Setenv(testEnvKey, tt.value)
|
t.Setenv(testEnvKey, tt.value)
|
||||||
@@ -477,7 +477,7 @@ func TestNewRejectsBadEnvValues(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
||||||
t.Setenv(tt.key, tt.value)
|
t.Setenv(tt.key, tt.value)
|
||||||
|
|
||||||
@@ -639,7 +639,7 @@ func sentryEnvValueCases() []badEnvValueCase {
|
|||||||
// break the legitimate unset case: absent variables still get their
|
// break the legitimate unset case: absent variables still get their
|
||||||
// documented defaults.
|
// documented defaults.
|
||||||
func TestNewUsesDefaultsWhenUnset(t *testing.T) {
|
func TestNewUsesDefaultsWhenUnset(t *testing.T) {
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
t.Setenv("WEBHOOKER_ENVIRONMENT", "dev")
|
||||||
|
|
||||||
cfg, err := buildConfig(t)
|
cfg, err := buildConfig(t)
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ func TestEnvSentryDSN(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// Cannot use t.Parallel() here because t.Setenv
|
// Cannot use t.Parallel() here because t.Setenv
|
||||||
// is incompatible with parallel subtests.
|
// is incompatible with parallel subtests.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
if tt.set {
|
if tt.set {
|
||||||
t.Setenv(envKeySentryDSN, tt.value)
|
t.Setenv(envKeySentryDSN, tt.value)
|
||||||
|
|||||||
@@ -10,19 +10,19 @@ import (
|
|||||||
"sneak.berlin/go/webhooker/internal/config/configtest"
|
"sneak.berlin/go/webhooker/internal/config/configtest"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TestClearEnv_RemovesAddedVariables pins that a variable set
|
// TestClearEnvForTest_RemovesAddedVariables pins that a variable set
|
||||||
// after the clear other than through t.Setenv, as a test's .env file
|
// after the clear other than through t.Setenv, as a test's .env file
|
||||||
// sets one, is gone once the test ends, so it cannot reach the tests
|
// sets one, is gone once the test ends, so it cannot reach the tests
|
||||||
// that run after it.
|
// that run after it.
|
||||||
//
|
//
|
||||||
//nolint:paralleltest // ClearEnv uses t.Setenv.
|
//nolint:paralleltest // ClearEnvForTest uses t.Setenv.
|
||||||
func TestClearEnv_RemovesAddedVariables(t *testing.T) {
|
func TestClearEnvForTest_RemovesAddedVariables(t *testing.T) {
|
||||||
// The outer clear keeps a value of the key exported in the shell
|
// The outer clear keeps a value of the key exported in the shell
|
||||||
// from making it a variable the inner clear has to put back.
|
// from making it a variable the inner clear has to put back.
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
t.Run("loads a .env file after the clear", func(t *testing.T) {
|
t.Run("loads a .env file after the clear", func(t *testing.T) {
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
|
|
||||||
path := writeDotEnv(t, dotEnvKey+"=from-dot-env\n")
|
path := writeDotEnv(t, dotEnvKey+"=from-dot-env\n")
|
||||||
require.NoError(t, config.LoadDotEnvFileForTest(path))
|
require.NoError(t, config.LoadDotEnvFileForTest(path))
|
||||||
@@ -13,14 +13,14 @@ import (
|
|||||||
"sneak.berlin/go/webhooker/internal/database"
|
"sneak.berlin/go/webhooker/internal/database"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewWebhookDBManager creates a WebhookDBManager backed by the given
|
// NewTestWebhookDBManager creates a WebhookDBManager backed by the given
|
||||||
// data directory, logging at DEBUG to standard error.
|
// data directory, logging at DEBUG to standard error.
|
||||||
func NewWebhookDBManager(
|
func NewTestWebhookDBManager(
|
||||||
t *testing.T, dataDir string,
|
t *testing.T, dataDir string,
|
||||||
) *database.WebhookDBManager {
|
) *database.WebhookDBManager {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
return NewWebhookDBManagerWithLogger(
|
return NewTestWebhookDBManagerWithLogger(
|
||||||
t,
|
t,
|
||||||
dataDir,
|
dataDir,
|
||||||
slog.New(slog.NewTextHandler(
|
slog.New(slog.NewTextHandler(
|
||||||
@@ -30,14 +30,14 @@ func NewWebhookDBManager(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWebhookDBManagerWithLogger is NewWebhookDBManager with the
|
// NewTestWebhookDBManagerWithLogger is NewTestWebhookDBManager with the
|
||||||
// logger supplied by the caller. The per-webhook databases this manager
|
// logger supplied by the caller. The per-webhook databases this manager
|
||||||
// opens hand that logger to gormlog, so a test that needs to see the SQL
|
// opens hand that logger to gormlog, so a test that needs to see the SQL
|
||||||
// the service emits can capture it.
|
// the service emits can capture it.
|
||||||
//
|
//
|
||||||
// It is built through database.NewWebhookDBManager on a lifecycle that
|
// It is built through database.NewWebhookDBManager on a lifecycle that
|
||||||
// is never started, so nothing closes its databases but the caller.
|
// is never started, so nothing closes its databases but the caller.
|
||||||
func NewWebhookDBManagerWithLogger(
|
func NewTestWebhookDBManagerWithLogger(
|
||||||
t *testing.T, dataDir string, log *slog.Logger,
|
t *testing.T, dataDir string, log *slog.Logger,
|
||||||
) *database.WebhookDBManager {
|
) *database.WebhookDBManager {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ func TestOpenPurgesLeakedTargetRows(t *testing.T) {
|
|||||||
// Create the file the way the application does, so the targets
|
// Create the file the way the application does, so the targets
|
||||||
// table has exactly the shape AutoMigrate gives it, then write
|
// table has exactly the shape AutoMigrate gives it, then write
|
||||||
// a leaked row into it the way the association upsert did.
|
// a leaked row into it the way the association upsert did.
|
||||||
initial := databasetest.NewWebhookDBManager(t, dataDir)
|
initial := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err := initial.GetDB(webhookID)
|
_, err := initial.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -157,7 +157,7 @@ func TestOpenPurgesLeakedTargetRows(t *testing.T) {
|
|||||||
clearEventDBSweptMarker(t, seed)
|
clearEventDBSweptMarker(t, seed)
|
||||||
require.NoError(t, seed.Close())
|
require.NoError(t, seed.Close())
|
||||||
|
|
||||||
mgr := databasetest.NewWebhookDBManager(t, dataDir)
|
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err = mgr.GetDB(webhookID)
|
_, err = mgr.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -173,7 +173,7 @@ func TestOpenPurgesLeakedTargetRows(t *testing.T) {
|
|||||||
|
|
||||||
// Idempotent: a second open leaves it at zero and does not
|
// Idempotent: a second open leaves it at zero and does not
|
||||||
// error.
|
// error.
|
||||||
again := databasetest.NewWebhookDBManager(t, dataDir)
|
again := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err = again.GetDB(webhookID)
|
_, err = again.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -196,7 +196,7 @@ func TestOpenPurgeRemovesCredentialBytes(t *testing.T) {
|
|||||||
webhookID := uuid.New().String()
|
webhookID := uuid.New().String()
|
||||||
credential := "T00000000/B00000000/" + uuid.New().String()
|
credential := "T00000000/B00000000/" + uuid.New().String()
|
||||||
|
|
||||||
initial := databasetest.NewWebhookDBManager(t, dataDir)
|
initial := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err := initial.GetDB(webhookID)
|
_, err := initial.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -231,7 +231,7 @@ func TestOpenPurgeRemovesCredentialBytes(t *testing.T) {
|
|||||||
"seeded credential is not in the file, so this test proves nothing",
|
"seeded credential is not in the file, so this test proves nothing",
|
||||||
)
|
)
|
||||||
|
|
||||||
mgr := databasetest.NewWebhookDBManager(t, dataDir)
|
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err = mgr.GetDB(webhookID)
|
_, err = mgr.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -259,7 +259,7 @@ func TestOpenRevacuumsAfterIncompleteSweep(t *testing.T) {
|
|||||||
webhookID := uuid.New().String()
|
webhookID := uuid.New().String()
|
||||||
credential := "T00000000/B00000000/" + uuid.New().String()
|
credential := "T00000000/B00000000/" + uuid.New().String()
|
||||||
|
|
||||||
initial := databasetest.NewWebhookDBManager(t, dataDir)
|
initial := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err := initial.GetDB(webhookID)
|
_, err := initial.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -299,7 +299,7 @@ func TestOpenRevacuumsAfterIncompleteSweep(t *testing.T) {
|
|||||||
"test proves nothing",
|
"test proves nothing",
|
||||||
)
|
)
|
||||||
|
|
||||||
mgr := databasetest.NewWebhookDBManager(t, dataDir)
|
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err = mgr.GetDB(webhookID)
|
_, err = mgr.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -326,7 +326,7 @@ func TestOpenSkipsSweptDatabase(t *testing.T) {
|
|||||||
dataDir := eventDBDataDir(t)
|
dataDir := eventDBDataDir(t)
|
||||||
webhookID := uuid.New().String()
|
webhookID := uuid.New().String()
|
||||||
|
|
||||||
mgr := databasetest.NewWebhookDBManager(t, dataDir)
|
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err := mgr.GetDB(webhookID)
|
_, err := mgr.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -348,7 +348,7 @@ func TestOpenSkipsSweptDatabase(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, marked.Close())
|
require.NoError(t, marked.Close())
|
||||||
|
|
||||||
again := databasetest.NewWebhookDBManager(t, dataDir)
|
again := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
_, err = again.GetDB(webhookID)
|
_, err = again.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -379,7 +379,7 @@ func TestOpenSucceedsWithoutTargetsTable(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, seed.Close())
|
require.NoError(t, seed.Close())
|
||||||
|
|
||||||
mgr := databasetest.NewWebhookDBManager(t, dataDir)
|
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
db, err := mgr.GetDB(webhookID)
|
db, err := mgr.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -397,7 +397,7 @@ func TestEventDBCreateOmitsAssociations(t *testing.T) {
|
|||||||
dataDir := eventDBDataDir(t)
|
dataDir := eventDBDataDir(t)
|
||||||
webhookID := uuid.New().String()
|
webhookID := uuid.New().String()
|
||||||
|
|
||||||
mgr := databasetest.NewWebhookDBManager(t, dataDir)
|
mgr := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
|
|
||||||
db, err := mgr.GetDB(webhookID)
|
db, err := mgr.GetDB(webhookID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ func TestWebhookDBManager_ConcurrentFirstTouchOpensOnce(t *testing.T) {
|
|||||||
|
|
||||||
var logs bytes.Buffer
|
var logs bytes.Buffer
|
||||||
|
|
||||||
mgr := databasetest.NewWebhookDBManagerWithLogger(
|
mgr := databasetest.NewTestWebhookDBManagerWithLogger(
|
||||||
t,
|
t,
|
||||||
t.TempDir(),
|
t.TempDir(),
|
||||||
slog.New(slog.NewTextHandler(&logs, nil)),
|
slog.New(slog.NewTextHandler(&logs, nil)),
|
||||||
@@ -309,7 +309,7 @@ func TestWebhookDBManager_LostDatabaseIsLogged(t *testing.T) {
|
|||||||
|
|
||||||
var logs bytes.Buffer
|
var logs bytes.Buffer
|
||||||
|
|
||||||
mgr := databasetest.NewWebhookDBManagerWithLogger(
|
mgr := databasetest.NewTestWebhookDBManagerWithLogger(
|
||||||
t,
|
t,
|
||||||
t.TempDir(),
|
t.TempDir(),
|
||||||
slog.New(slog.NewTextHandler(&logs, nil)),
|
slog.New(slog.NewTextHandler(&logs, nil)),
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func setupArchiveTest(t *testing.T) *archiveEnv {
|
|||||||
|
|
||||||
eng := delivery.NewTestEngineWithDB(
|
eng := delivery.NewTestEngineWithDB(
|
||||||
mainDB,
|
mainDB,
|
||||||
databasetest.NewWebhookDBManager(t, dataDir),
|
databasetest.NewTestWebhookDBManager(t, dataDir),
|
||||||
log,
|
log,
|
||||||
&http.Client{Timeout: 5 * time.Second},
|
&http.Client{Timeout: 5 * time.Second},
|
||||||
1,
|
1,
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ func iDBManager(
|
|||||||
) *database.WebhookDBManager {
|
) *database.WebhookDBManager {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
return databasetest.NewWebhookDBManager(t, t.TempDir())
|
return databasetest.NewTestWebhookDBManager(t, t.TempDir())
|
||||||
}
|
}
|
||||||
|
|
||||||
func iSeedWebhookDB(
|
func iSeedWebhookDB(
|
||||||
@@ -1137,7 +1137,7 @@ func TestRecoverInFlight_ReportsAMissingWebhookDatabase(t *testing.T) {
|
|||||||
|
|
||||||
var logs bytes.Buffer
|
var logs bytes.Buffer
|
||||||
|
|
||||||
dbMgr := databasetest.NewWebhookDBManagerWithLogger(
|
dbMgr := databasetest.NewTestWebhookDBManagerWithLogger(
|
||||||
t, t.TempDir(), slog.New(slog.NewTextHandler(&logs, nil)),
|
t, t.TempDir(), slog.New(slog.NewTextHandler(&logs, nil)),
|
||||||
)
|
)
|
||||||
t.Cleanup(func() { _ = dbMgr.CloseAll() })
|
t.Cleanup(func() { _ = dbMgr.CloseAll() })
|
||||||
@@ -1187,7 +1187,7 @@ func TestRecoverInFlight_SkipsAWebhookDeletedAfterTheListIsRead(
|
|||||||
).Error)
|
).Error)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
dbMgr := databasetest.NewWebhookDBManager(t, t.TempDir())
|
dbMgr := databasetest.NewTestWebhookDBManager(t, t.TempDir())
|
||||||
t.Cleanup(func() { _ = dbMgr.CloseAll() })
|
t.Cleanup(func() { _ = dbMgr.CloseAll() })
|
||||||
|
|
||||||
engine := delivery.NewTestEngineWithDB(
|
engine := delivery.NewTestEngineWithDB(
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ func TestQueueDepthSample_LogsNoBoundValue(t *testing.T) {
|
|||||||
))
|
))
|
||||||
|
|
||||||
mainDB := qdMainDB(t, log)
|
mainDB := qdMainDB(t, log)
|
||||||
dbMgr := databasetest.NewWebhookDBManagerWithLogger(
|
dbMgr := databasetest.NewTestWebhookDBManagerWithLogger(
|
||||||
t, t.TempDir(), log,
|
t, t.TempDir(), log,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -460,13 +460,8 @@ func TestArchiveExport_OneFileOpenAtATime(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// heapPeak is an io.Writer that discards what it is given and records
|
// heapPeak is an io.Writer that discards what it is given and records
|
||||||
// the largest heap it saw at a write. It collects garbage twice before
|
// the largest heap it saw at a write. It collects garbage before each
|
||||||
// each reading, so the heap it reads is what is still held. Once is not
|
// reading, so the heap it reads is what is still held.
|
||||||
// enough: the libraries the export calls (regexp, under GORM's table
|
|
||||||
// names, and encoding/json among them) cache buffers in a sync.Pool,
|
|
||||||
// which keeps them through one collection, so after one the reading
|
|
||||||
// counts however many happen to be cached. That varies from run to run
|
|
||||||
// by about as much as the limit in TestArchiveExport_Streams.
|
|
||||||
type heapPeak struct {
|
type heapPeak struct {
|
||||||
max uint64
|
max uint64
|
||||||
}
|
}
|
||||||
@@ -474,7 +469,6 @@ type heapPeak struct {
|
|||||||
func (p *heapPeak) Write(b []byte) (int, error) {
|
func (p *heapPeak) Write(b []byte) (int, error) {
|
||||||
var m runtime.MemStats
|
var m runtime.MemStats
|
||||||
|
|
||||||
runtime.GC()
|
|
||||||
runtime.GC()
|
runtime.GC()
|
||||||
runtime.ReadMemStats(&m)
|
runtime.ReadMemStats(&m)
|
||||||
p.max = max(p.max, m.HeapAlloc)
|
p.max = max(p.max, m.HeapAlloc)
|
||||||
@@ -504,8 +498,6 @@ func exportHeapGrowth(t *testing.T, rows, bodySize int) uint64 {
|
|||||||
|
|
||||||
export := listExport(t, path)
|
export := listExport(t, path)
|
||||||
|
|
||||||
// Twice, for the reason heapPeak gives.
|
|
||||||
runtime.GC()
|
|
||||||
runtime.GC()
|
runtime.GC()
|
||||||
|
|
||||||
var start runtime.MemStats
|
var start runtime.MemStats
|
||||||
|
|||||||
@@ -336,7 +336,7 @@ func TestArchivePathAt(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
dataDir := t.TempDir()
|
dataDir := t.TempDir()
|
||||||
dbMgr := databasetest.NewWebhookDBManager(t, dataDir)
|
dbMgr := databasetest.NewTestWebhookDBManager(t, dataDir)
|
||||||
webhook := &database.Webhook{
|
webhook := &database.Webhook{
|
||||||
BaseModel: database.BaseModel{ID: "wh-id"}, Name: "Orders",
|
BaseModel: database.BaseModel{ID: "wh-id"}, Name: "Orders",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ func readFirstBootSecrets(
|
|||||||
func bootAtDebug(t *testing.T, dataDir string) string {
|
func bootAtDebug(t *testing.T, dataDir string) string {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
configtest.ClearEnv(t)
|
configtest.ClearEnvForTest(t)
|
||||||
t.Setenv("DEBUG", "true")
|
t.Setenv("DEBUG", "true")
|
||||||
t.Setenv("DATA_DIR", dataDir)
|
t.Setenv("DATA_DIR", dataDir)
|
||||||
|
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ func TestUserRoute_Unauthenticated_RedirectedByMiddleware(t *testing.T) {
|
|||||||
|
|
||||||
t.Cleanup(app.RequireStop)
|
t.Cleanup(app.RequireStop)
|
||||||
|
|
||||||
mw := middlewaretest.New(t, log.Get(), cfg, sess)
|
mw := middlewaretest.NewForTest(t, log.Get(), cfg, sess)
|
||||||
|
|
||||||
var handlerReached bool
|
var handlerReached bool
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ func postTargetCreate(
|
|||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
logBuf := new(bytes.Buffer)
|
logBuf := new(bytes.Buffer)
|
||||||
mw := middlewaretest.New(
|
mw := middlewaretest.NewForTest(
|
||||||
t,
|
t,
|
||||||
slog.New(slog.NewJSONHandler(
|
slog.New(slog.NewJSONHandler(
|
||||||
logBuf, &slog.HandlerOptions{Level: slog.LevelInfo},
|
logBuf, &slog.HandlerOptions{Level: slog.LevelInfo},
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ func limitedServer(
|
|||||||
const sendBuffer = 4 << 10
|
const sendBuffer = 4 << 10
|
||||||
|
|
||||||
logBuf := new(bytes.Buffer)
|
logBuf := new(bytes.Buffer)
|
||||||
mw := middlewaretest.New(
|
mw := middlewaretest.NewForTest(
|
||||||
t,
|
t,
|
||||||
slog.New(slog.NewJSONHandler(logBuf, nil)),
|
slog.New(slog.NewJSONHandler(logBuf, nil)),
|
||||||
&config.Config{Environment: config.EnvironmentDev},
|
&config.Config{Environment: config.EnvironmentDev},
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ func capturingMiddleware(t *testing.T) (*middleware.Middleware, *bytes.Buffer) {
|
|||||||
TrustedProxies: trustedProxies("192.0.2.1/32"),
|
TrustedProxies: trustedProxies("192.0.2.1/32"),
|
||||||
}
|
}
|
||||||
|
|
||||||
return middlewaretest.New(t, log, cfg, nil), buf
|
return middlewaretest.NewForTest(t, log, cfg, nil), buf
|
||||||
}
|
}
|
||||||
|
|
||||||
// capturingTextMiddleware is capturingMiddleware for the other handler
|
// capturingTextMiddleware is capturingMiddleware for the other handler
|
||||||
@@ -108,7 +108,7 @@ func capturingTextMiddleware(
|
|||||||
TrustedProxies: trustedProxies("192.0.2.1/32"),
|
TrustedProxies: trustedProxies("192.0.2.1/32"),
|
||||||
}
|
}
|
||||||
|
|
||||||
return middlewaretest.New(t, log, cfg, nil), buf
|
return middlewaretest.NewForTest(t, log, cfg, nil), buf
|
||||||
}
|
}
|
||||||
|
|
||||||
// accessLogRouter mirrors the production route shapes that an
|
// accessLogRouter mirrors the production route shapes that an
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ func clientLogLines(
|
|||||||
TrustedProxies: trustedProxies(trustedProxyCIDR),
|
TrustedProxies: trustedProxies(trustedProxyCIDR),
|
||||||
}
|
}
|
||||||
|
|
||||||
m := middlewaretest.New(
|
m := middlewaretest.NewForTest(
|
||||||
t, log, cfg, newTestSessionManager(t, cfg),
|
t, log, cfg, newTestSessionManager(t, cfg),
|
||||||
)
|
)
|
||||||
handler := m.Logging()(site.build(m))
|
handler := m.Logging()(site.build(m))
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ func capturingBoundMiddleware(
|
|||||||
|
|
||||||
sess := newTestSessionManager(t, cfg)
|
sess := newTestSessionManager(t, cfg)
|
||||||
|
|
||||||
return middlewaretest.New(t, log, cfg, sess), buf
|
return middlewaretest.NewForTest(t, log, cfg, sess), buf
|
||||||
}
|
}
|
||||||
|
|
||||||
// unreachable is a next-handler that fails the test if the middleware
|
// unreachable is a next-handler that fails the test if the middleware
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ func metricsTestRouter(
|
|||||||
Environment: "prod",
|
Environment: "prod",
|
||||||
ReceiverRateLimit: receiverLimit,
|
ReceiverRateLimit: receiverLimit,
|
||||||
}
|
}
|
||||||
m := middlewaretest.New(
|
m := middlewaretest.NewForTest(
|
||||||
t, log, cfg, newTestSessionManager(t, cfg),
|
t, log, cfg, newTestSessionManager(t, cfg),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -456,11 +456,11 @@ func TestMetrics_StatusAndSizeStillRecorded(t *testing.T) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestMetrics_WorksOnMiddlewaretestNew pins that a Middleware built
|
// TestMetrics_WorksOnNewForTestMiddleware pins that a Middleware built
|
||||||
// by middlewaretest.New has a recorder of its own: its Metrics()
|
// by middlewaretest.NewForTest has a recorder of its own: its Metrics()
|
||||||
// serves a request instead of panicking, and a second one does not
|
// serves a request instead of panicking, and a second one does not
|
||||||
// collide with the first.
|
// collide with the first.
|
||||||
func TestMetrics_WorksOnMiddlewaretestNew(t *testing.T) {
|
func TestMetrics_WorksOnNewForTestMiddleware(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
log := slog.New(slog.DiscardHandler)
|
log := slog.New(slog.DiscardHandler)
|
||||||
@@ -470,7 +470,7 @@ func TestMetrics_WorksOnMiddlewaretestNew(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
for range 2 {
|
for range 2 {
|
||||||
h := middlewaretest.New(t, log, cfg, nil).Metrics()(ok)
|
h := middlewaretest.NewForTest(t, log, cfg, nil).Metrics()(ok)
|
||||||
|
|
||||||
req := httptest.NewRequestWithContext(
|
req := httptest.NewRequestWithContext(
|
||||||
t.Context(), http.MethodGet, okRoute, nil,
|
t.Context(), http.MethodGet, okRoute, nil,
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ func testMiddlewareWithIdleTimeout(
|
|||||||
|
|
||||||
sessManager := newTestSessionManager(t, cfg)
|
sessManager := newTestSessionManager(t, cfg)
|
||||||
|
|
||||||
m := middlewaretest.New(t, log, cfg, sessManager)
|
m := middlewaretest.NewForTest(t, log, cfg, sessManager)
|
||||||
|
|
||||||
return m, sessManager
|
return m, sessManager
|
||||||
}
|
}
|
||||||
@@ -943,7 +943,7 @@ func metricsAuthMiddleware(
|
|||||||
MetricsPassword: "secret",
|
MetricsPassword: "secret",
|
||||||
}
|
}
|
||||||
|
|
||||||
return middlewaretest.New(
|
return middlewaretest.NewForTest(
|
||||||
t, log, cfg, newTestSessionManager(t, cfg),
|
t, log, cfg, newTestSessionManager(t, cfg),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,12 +14,12 @@ import (
|
|||||||
"sneak.berlin/go/webhooker/internal/session"
|
"sneak.berlin/go/webhooker/internal/session"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New builds a Middleware through middleware.New, on a
|
// NewForTest builds a Middleware through middleware.New, on a
|
||||||
// lifecycle that is never started.
|
// lifecycle that is never started.
|
||||||
//
|
//
|
||||||
// Its metrics recorder writes to a fresh registry of its own, so
|
// Its metrics recorder writes to a fresh registry of its own, so
|
||||||
// Metrics() works on it and two of them never collide.
|
// Metrics() works on it and two of them never collide.
|
||||||
func New(
|
func NewForTest(
|
||||||
t *testing.T,
|
t *testing.T,
|
||||||
log *slog.Logger,
|
log *slog.Logger,
|
||||||
cfg *config.Config,
|
cfg *config.Config,
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ func rateLimitMiddleware(
|
|||||||
&slog.HandlerOptions{Level: slog.LevelDebug},
|
&slog.HandlerOptions{Level: slog.LevelDebug},
|
||||||
))
|
))
|
||||||
|
|
||||||
return middlewaretest.New(t, log, cfg, nil)
|
return middlewaretest.NewForTest(t, log, cfg, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// trustedProxies parses CIDR strings for a test Config.
|
// trustedProxies parses CIDR strings for a test Config.
|
||||||
|
|||||||
Reference in New Issue
Block a user