Browse Source

test(cmd/prometheus): speed up test execution by t.Parallel() when possible

turn some loops into subtests to make use of t.Parallel()

requires Go 1.22 to make use of https://go.dev/blog/loopvar-preview

Signed-off-by: machine424 <ayoubmrini424@gmail.com>
pull/14618/head
machine424 4 months ago
parent
commit
cf128a0472
No known key found for this signature in database
GPG Key ID: A4B001A4FDEE017D
  1. 183
      cmd/prometheus/main_test.go
  2. 1
      cmd/prometheus/main_unix_test.go
  3. 2
      cmd/prometheus/query_log_test.go

183
cmd/prometheus/main_test.go

@ -125,6 +125,7 @@ func TestFailedStartupExitCode(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping test in short mode.") t.Skip("skipping test in short mode.")
} }
t.Parallel()
fakeInputFile := "fake-input-file" fakeInputFile := "fake-input-file"
expectedExitStatus := 2 expectedExitStatus := 2
@ -211,83 +212,125 @@ func TestWALSegmentSizeBounds(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping test in short mode.") t.Skip("skipping test in short mode.")
} }
t.Parallel()
for _, tc := range []struct {
size string
exitCode int
}{
{
size: "9MB",
exitCode: 1,
},
{
size: "257MB",
exitCode: 1,
},
{
size: "10",
exitCode: 2,
},
{
size: "1GB",
exitCode: 1,
},
{
size: "12MB",
exitCode: 0,
},
} {
t.Run(tc.size, func(t *testing.T) {
t.Parallel()
prom := exec.Command(promPath, "-test.main", "--storage.tsdb.wal-segment-size="+tc.size, "--web.listen-address=0.0.0.0:0", "--config.file="+promConfig, "--storage.tsdb.path="+filepath.Join(t.TempDir(), "data"))
// Log stderr in case of failure.
stderr, err := prom.StderrPipe()
require.NoError(t, err)
go func() {
slurp, _ := io.ReadAll(stderr)
t.Log(string(slurp))
}()
err = prom.Start()
require.NoError(t, err)
for size, expectedExitStatus := range map[string]int{"9MB": 1, "257MB": 1, "10": 2, "1GB": 1, "12MB": 0} { if tc.exitCode == 0 {
prom := exec.Command(promPath, "-test.main", "--storage.tsdb.wal-segment-size="+size, "--web.listen-address=0.0.0.0:0", "--config.file="+promConfig, "--storage.tsdb.path="+filepath.Join(t.TempDir(), "data")) done := make(chan error, 1)
go func() { done <- prom.Wait() }()
// Log stderr in case of failure. select {
stderr, err := prom.StderrPipe() case err := <-done:
require.NoError(t, err) require.Fail(t, "prometheus should be still running: %v", err)
go func() { case <-time.After(startupTime):
slurp, _ := io.ReadAll(stderr) prom.Process.Kill()
t.Log(string(slurp)) <-done
}() }
return
err = prom.Start()
require.NoError(t, err)
if expectedExitStatus == 0 {
done := make(chan error, 1)
go func() { done <- prom.Wait() }()
select {
case err := <-done:
require.Fail(t, "prometheus should be still running: %v", err)
case <-time.After(startupTime):
prom.Process.Kill()
<-done
} }
continue
}
err = prom.Wait() err = prom.Wait()
require.Error(t, err) require.Error(t, err)
var exitError *exec.ExitError var exitError *exec.ExitError
require.ErrorAs(t, err, &exitError) require.ErrorAs(t, err, &exitError)
status := exitError.Sys().(syscall.WaitStatus) status := exitError.Sys().(syscall.WaitStatus)
require.Equal(t, expectedExitStatus, status.ExitStatus()) require.Equal(t, tc.exitCode, status.ExitStatus())
})
} }
} }
func TestMaxBlockChunkSegmentSizeBounds(t *testing.T) { func TestMaxBlockChunkSegmentSizeBounds(t *testing.T) {
t.Parallel()
if testing.Short() { if testing.Short() {
t.Skip("skipping test in short mode.") t.Skip("skipping test in short mode.")
} }
t.Parallel()
for size, expectedExitStatus := range map[string]int{"512KB": 1, "1MB": 0} { for _, tc := range []struct {
prom := exec.Command(promPath, "-test.main", "--storage.tsdb.max-block-chunk-segment-size="+size, "--web.listen-address=0.0.0.0:0", "--config.file="+promConfig, "--storage.tsdb.path="+filepath.Join(t.TempDir(), "data")) size string
exitCode int
// Log stderr in case of failure. }{
stderr, err := prom.StderrPipe() {
require.NoError(t, err) size: "512KB",
go func() { exitCode: 1,
slurp, _ := io.ReadAll(stderr) },
t.Log(string(slurp)) {
}() size: "1MB",
exitCode: 0,
err = prom.Start() },
require.NoError(t, err) } {
t.Run(tc.size, func(t *testing.T) {
if expectedExitStatus == 0 { t.Parallel()
done := make(chan error, 1) prom := exec.Command(promPath, "-test.main", "--storage.tsdb.max-block-chunk-segment-size="+tc.size, "--web.listen-address=0.0.0.0:0", "--config.file="+promConfig, "--storage.tsdb.path="+filepath.Join(t.TempDir(), "data"))
go func() { done <- prom.Wait() }()
select { // Log stderr in case of failure.
case err := <-done: stderr, err := prom.StderrPipe()
require.Fail(t, "prometheus should be still running: %v", err) require.NoError(t, err)
case <-time.After(startupTime): go func() {
prom.Process.Kill() slurp, _ := io.ReadAll(stderr)
<-done t.Log(string(slurp))
}()
err = prom.Start()
require.NoError(t, err)
if tc.exitCode == 0 {
done := make(chan error, 1)
go func() { done <- prom.Wait() }()
select {
case err := <-done:
require.Fail(t, "prometheus should be still running: %v", err)
case <-time.After(startupTime):
prom.Process.Kill()
<-done
}
return
} }
continue
}
err = prom.Wait() err = prom.Wait()
require.Error(t, err) require.Error(t, err)
var exitError *exec.ExitError var exitError *exec.ExitError
require.ErrorAs(t, err, &exitError) require.ErrorAs(t, err, &exitError)
status := exitError.Sys().(syscall.WaitStatus) status := exitError.Sys().(syscall.WaitStatus)
require.Equal(t, expectedExitStatus, status.ExitStatus()) require.Equal(t, tc.exitCode, status.ExitStatus())
})
} }
} }
@ -353,6 +396,8 @@ func getCurrentGaugeValuesFor(t *testing.T, reg prometheus.Gatherer, metricNames
} }
func TestAgentSuccessfulStartup(t *testing.T) { func TestAgentSuccessfulStartup(t *testing.T) {
t.Parallel()
prom := exec.Command(promPath, "-test.main", "--agent", "--web.listen-address=0.0.0.0:0", "--config.file="+agentConfig) prom := exec.Command(promPath, "-test.main", "--agent", "--web.listen-address=0.0.0.0:0", "--config.file="+agentConfig)
require.NoError(t, prom.Start()) require.NoError(t, prom.Start())
@ -371,6 +416,8 @@ func TestAgentSuccessfulStartup(t *testing.T) {
} }
func TestAgentFailedStartupWithServerFlag(t *testing.T) { func TestAgentFailedStartupWithServerFlag(t *testing.T) {
t.Parallel()
prom := exec.Command(promPath, "-test.main", "--agent", "--storage.tsdb.path=.", "--web.listen-address=0.0.0.0:0", "--config.file="+promConfig) prom := exec.Command(promPath, "-test.main", "--agent", "--storage.tsdb.path=.", "--web.listen-address=0.0.0.0:0", "--config.file="+promConfig)
output := bytes.Buffer{} output := bytes.Buffer{}
@ -398,6 +445,8 @@ func TestAgentFailedStartupWithServerFlag(t *testing.T) {
} }
func TestAgentFailedStartupWithInvalidConfig(t *testing.T) { func TestAgentFailedStartupWithInvalidConfig(t *testing.T) {
t.Parallel()
prom := exec.Command(promPath, "-test.main", "--agent", "--web.listen-address=0.0.0.0:0", "--config.file="+promConfig) prom := exec.Command(promPath, "-test.main", "--agent", "--web.listen-address=0.0.0.0:0", "--config.file="+promConfig)
require.NoError(t, prom.Start()) require.NoError(t, prom.Start())
@ -419,6 +468,7 @@ func TestModeSpecificFlags(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping test in short mode.") t.Skip("skipping test in short mode.")
} }
t.Parallel()
testcases := []struct { testcases := []struct {
mode string mode string
@ -433,6 +483,7 @@ func TestModeSpecificFlags(t *testing.T) {
for _, tc := range testcases { for _, tc := range testcases {
t.Run(fmt.Sprintf("%s mode with option %s", tc.mode, tc.arg), func(t *testing.T) { t.Run(fmt.Sprintf("%s mode with option %s", tc.mode, tc.arg), func(t *testing.T) {
t.Parallel()
args := []string{"-test.main", tc.arg, t.TempDir(), "--web.listen-address=0.0.0.0:0"} args := []string{"-test.main", tc.arg, t.TempDir(), "--web.listen-address=0.0.0.0:0"}
if tc.mode == "agent" { if tc.mode == "agent" {
@ -484,6 +535,8 @@ func TestDocumentation(t *testing.T) {
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
t.SkipNow() t.SkipNow()
} }
t.Parallel()
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel() defer cancel()
@ -508,6 +561,8 @@ func TestDocumentation(t *testing.T) {
} }
func TestRwProtoMsgFlagParser(t *testing.T) { func TestRwProtoMsgFlagParser(t *testing.T) {
t.Parallel()
defaultOpts := config.RemoteWriteProtoMsgs{ defaultOpts := config.RemoteWriteProtoMsgs{
config.RemoteWriteProtoMsgV1, config.RemoteWriteProtoMsgV2, config.RemoteWriteProtoMsgV1, config.RemoteWriteProtoMsgV2,
} }

1
cmd/prometheus/main_unix_test.go

@ -34,6 +34,7 @@ func TestStartupInterrupt(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping test in short mode.") t.Skip("skipping test in short mode.")
} }
t.Parallel()
port := fmt.Sprintf(":%d", testutil.RandomUnprivilegedPort(t)) port := fmt.Sprintf(":%d", testutil.RandomUnprivilegedPort(t))

2
cmd/prometheus/query_log_test.go

@ -456,6 +456,7 @@ func TestQueryLog(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping test in short mode.") t.Skip("skipping test in short mode.")
} }
t.Parallel()
cwd, err := os.Getwd() cwd, err := os.Getwd()
require.NoError(t, err) require.NoError(t, err)
@ -474,6 +475,7 @@ func TestQueryLog(t *testing.T) {
} }
t.Run(p.String(), func(t *testing.T) { t.Run(p.String(), func(t *testing.T) {
t.Parallel()
p.run(t) p.run(t)
}) })
} }

Loading…
Cancel
Save