blob: d476579c884b6731b08fcef119f6bf441a2924fb [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package tefmocheck
import (
"fmt"
"testing"
)
func TestStringInLogCheck(t *testing.T) {
const killerString = "KILLER STRING"
const exceptString = "Don't die!"
exceptBlock := &logBlock{
startString: "skip_test",
endString: "end_test",
}
exceptBlock2 := &logBlock{
startString: "block_start",
endString: "block_end",
}
c := stringInLogCheck{
String: killerString,
OnlyOnStates: []string{},
ExceptString: exceptString,
ExceptBlocks: []*logBlock{exceptBlock, exceptBlock2},
ExceptSuccessfulSwarmingResult: true,
Type: serialLogType,
}
gotName := c.Name()
wantName := "string_in_log/serial_log.txt/KILLER_STRING"
if gotName != wantName {
t.Errorf("c.Name() returned %q, want %q", gotName, wantName)
}
for _, tc := range []struct {
name string
testingOutputs TestingOutputs
states []string
swarmingResultState string
shouldMatch bool
}{
{
name: "should match if string in serial",
testingOutputs: TestingOutputs{
SerialLog: []byte(fmt.Sprintf("PREFIX %s SUFFIX", killerString)),
},
shouldMatch: true,
},
{
name: "exceptSuccessfulSwarmingResult",
testingOutputs: TestingOutputs{
SerialLog: []byte(fmt.Sprintf("PREFIX %s SUFFIX", killerString)),
},
swarmingResultState: "COMPLETED",
shouldMatch: false,
}, {
name: "should not match if string in other log",
testingOutputs: TestingOutputs{
SerialLog: []byte("gentle string"),
SwarmingOutput: []byte(killerString),
},
shouldMatch: false,
}, {
name: "should not match if except_string in log",
testingOutputs: TestingOutputs{
SerialLog: []byte(killerString + exceptString),
},
shouldMatch: false,
}, {
name: "should match if string before except_block",
testingOutputs: TestingOutputs{
SerialLog: []byte(fmt.Sprintf("PREFIX %s ... %s output %s SUFFIX", killerString, exceptBlock.startString, exceptBlock.endString)),
},
shouldMatch: true,
}, {
name: "should match if string after except_block",
testingOutputs: TestingOutputs{
SerialLog: []byte(fmt.Sprintf("PREFIX %s output %s ... %s SUFFIX", exceptBlock.startString, exceptBlock.endString, killerString)),
},
shouldMatch: true,
}, {
name: "should not match if string in except_block",
testingOutputs: TestingOutputs{
SerialLog: []byte(
fmt.Sprintf(
"PREFIX %s %s output %s SUFFIX %s %s %s",
exceptBlock.startString, killerString, exceptBlock.endString,
exceptBlock2.startString, killerString, exceptBlock2.endString)),
},
shouldMatch: false,
}, {
name: "should match if string in both except_block and outside except_block",
testingOutputs: TestingOutputs{
SerialLog: []byte(fmt.Sprintf(
"PREFIX %s ... %s %s %s %s %s %s SUFFIX",
killerString, exceptBlock.startString, killerString, exceptBlock.endString,
exceptBlock2.startString, killerString, exceptBlock2.endString,
)),
},
shouldMatch: true,
}, {
name: "should match if swaring task state is in expected states",
testingOutputs: TestingOutputs{
SerialLog: []byte(killerString),
},
states: []string{"STATE_1", "STATE_2"},
swarmingResultState: "STATE_1",
shouldMatch: true,
}, {
name: "should not match if swaring task state is not in expected states",
testingOutputs: TestingOutputs{
SerialLog: []byte(killerString),
},
states: []string{"STATE_1", "STATE_2"},
swarmingResultState: "NO_STATE",
shouldMatch: false,
},
} {
t.Run(tc.name, func(t *testing.T) {
// It accesses this field for DebugText().
tc.testingOutputs.SwarmingSummary = &SwarmingTaskSummary{Results: &SwarmingRpcsTaskResult{TaskId: "abc", State: tc.swarmingResultState}}
c.OnlyOnStates = tc.states
if c.Check(&tc.testingOutputs) != tc.shouldMatch {
t.Errorf("c.Check(%q) returned %v, expected %v", string(tc.testingOutputs.SerialLog), !tc.shouldMatch, tc.shouldMatch)
}
c.DebugText() // minimal coverage, check it doesn't crash.
})
}
}