@ -125,6 +125,7 @@ func TestFailedStartupExitCode(t *testing.T) {
if testing . Short ( ) {
t . Skip ( "skipping test in short mode." )
}
t . Parallel ( )
fakeInputFile := "fake-input-file"
expectedExitStatus := 2
@ -211,83 +212,125 @@ func TestWALSegmentSizeBounds(t *testing.T) {
if testing . Short ( ) {
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 } {
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" ) )
// 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 )
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
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 ( )
require . Error ( t , err )
var exitError * exec . ExitError
require . ErrorAs ( t , err , & exitError )
status := exitError . Sys ( ) . ( syscall . WaitStatus )
require . Equal ( t , expectedExitStatus , status . ExitStatus ( ) )
err = prom . Wait ( )
require . Error ( t , err )
var exitError * exec . ExitError
require . ErrorAs ( t , err , & exitError )
status := exitError . Sys ( ) . ( syscall . WaitStatus )
require . Equal ( t , tc . exitCode , status . ExitStatus ( ) )
} )
}
}
func TestMaxBlockChunkSegmentSizeBounds ( t * testing . T ) {
t . Parallel ( )
if testing . Short ( ) {
t . Skip ( "skipping test in short mode." )
}
t . Parallel ( )
for size , expectedExitStatus := range map [ string ] int { "512KB" : 1 , "1MB" : 0 } {
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" ) )
// 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 )
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
for _ , tc := range [ ] struct {
size string
exitCode int
} {
{
size : "512KB" ,
exitCode : 1 ,
} ,
{
size : "1MB" ,
exitCode : 0 ,
} ,
} {
t . Run ( tc . size , func ( t * testing . T ) {
t . Parallel ( )
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" ) )
// 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 )
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 ( )
require . Error ( t , err )
var exitError * exec . ExitError
require . ErrorAs ( t , err , & exitError )
status := exitError . Sys ( ) . ( syscall . WaitStatus )
require . Equal ( t , expectedExitStatus , status . ExitStatus ( ) )
err = prom . Wait ( )
require . Error ( t , err )
var exitError * exec . ExitError
require . ErrorAs ( t , err , & exitError )
status := exitError . Sys ( ) . ( syscall . WaitStatus )
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 ) {
t . Parallel ( )
prom := exec . Command ( promPath , "-test.main" , "--agent" , "--web.listen-address=0.0.0.0:0" , "--config.file=" + agentConfig )
require . NoError ( t , prom . Start ( ) )
@ -371,6 +416,8 @@ func TestAgentSuccessfulStartup(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 )
output := bytes . Buffer { }
@ -398,6 +445,8 @@ func TestAgentFailedStartupWithServerFlag(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 )
require . NoError ( t , prom . Start ( ) )
@ -419,6 +468,7 @@ func TestModeSpecificFlags(t *testing.T) {
if testing . Short ( ) {
t . Skip ( "skipping test in short mode." )
}
t . Parallel ( )
testcases := [ ] struct {
mode string
@ -433,6 +483,7 @@ func TestModeSpecificFlags(t *testing.T) {
for _ , tc := range testcases {
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" }
if tc . mode == "agent" {
@ -484,6 +535,8 @@ func TestDocumentation(t *testing.T) {
if runtime . GOOS == "windows" {
t . SkipNow ( )
}
t . Parallel ( )
ctx , cancel := context . WithTimeout ( context . Background ( ) , 5 * time . Second )
defer cancel ( )
@ -508,6 +561,8 @@ func TestDocumentation(t *testing.T) {
}
func TestRwProtoMsgFlagParser ( t * testing . T ) {
t . Parallel ( )
defaultOpts := config . RemoteWriteProtoMsgs {
config . RemoteWriteProtoMsgV1 , config . RemoteWriteProtoMsgV2 ,
}