Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/query/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ Valid statuses are:
- `crash`
- `skip`
- `assert`
- `precondition_failed`

> NOTE: `ok` is the status of the test harness setup. Individual subtests will have
> a status of `pass` - it may be necessary to search for both.
Expand Down
137 changes: 137 additions & 0 deletions api/query/cache/index/index_filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,143 @@ func TestBindExecute_TestStatus(t *testing.T) {
}), resultSet(t, srs))
}

func TestBindExecute_TestStatus_PreconditionFailed(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
loader := NewMockReportLoader(ctrl)
idx, err := NewShardedWPTIndex(loader, testNumShards)
assert.Nil(t, err)

// Two matching (sub)tests Chrome(Status=FAIL):
// <"/a/b/c", nil> and </"d/e/f", "sub">.
match1Name := "/a/b/c"
match2Name := "/d/e/f"
match2Sub := "sub"
data := []testRunData{
//
// [0]: Chrome test run.
//
{
shared.TestRun{ID: 1},
&metrics.TestResultsReport{
Results: []*metrics.TestResults{
{
Test: match1Name,
Status: "FAIL",
},
{
Test: match2Name,
Status: "OK",
Subtests: []metrics.SubTest{
{
Name: match2Sub,
Status: "PASS",
},
{
Name: "other sub",
Status: "PRECONDITION_FAILED",
},
},
},
{
Test: "m/n/o",
Status: "PRECONDITION_FAILED",
},
},
},
},
//
// [1] Safari test run: Several result values differ or are missing. One
// test does not appear in Chrome, but does appear here.
//
{
shared.TestRun{ID: 2},
&metrics.TestResultsReport{
Results: []*metrics.TestResults{
{
Test: match1Name,
Status: "PASS",
},
{
Test: match2Name,
Status: "OK",
Subtests: []metrics.SubTest{
{
Name: match2Sub,
Status: "FAIL",
},
{
Name: "other sub",
Status: "PRECONDITION_FAILED",
},
},
},
{
Test: "m/n/o",
Status: "PRECONDITION_FAILED",
},

},
},
},
}

// Set BrowserName imperatively to avoid multi-layer type embedding.
data[0].run.BrowserName = "chrome"
data[1].run.BrowserName = "safari"

runs := mockTestRuns(loader, idx, data)

p := shared.ParseProductSpecUnsafe("Chrome")
q := query.TestStatusNeq{
Product: &p,
Status: shared.TestStatusPreconditionFailed,
}
srs := planAndExecute(t, runs, idx, q)

assert.Equal(t, 2, len(srs))
assert.Equal(t, resultSet(t, []shared.SearchResult{
{
Test: match1Name,
LegacyStatus: []shared.LegacySearchRunResult{
// Run [0]: Chrome: match1Name status is FAIL: 0 / 1.
{
Passes: 0,
Total: 1,
Status: "",
NewAggProcess: true,
},
// Run [1]: Safari: match1Name status is PASS: 1 / 1.
{
Passes: 1,
Total: 1,
Status: "",
NewAggProcess: true,
},
},
},
{
Test: match2Name,
LegacyStatus: []shared.LegacySearchRunResult{
// Run [0]: Chrome: harness status OK + subtest "sub" has PASS: 1 / 1.
{
Passes: 1,
Total: 1,
Status: "O",
NewAggProcess: true,
},
// Run [1]: Safari: harness status OK + subtest "sub" has FAIL: 0 / 1.
{
Passes: 0,
Total: 1,
Status: "O",
NewAggProcess: true,
},
},
},
}), resultSet(t, srs))
}

func TestBindExecute_Link(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
Expand Down
53 changes: 32 additions & 21 deletions shared/statuses.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ const (
// status is supported by, at least, Mozilla.
TestStatusAssert TestStatus = 9

// TestStatusPreconditionFailed indicates the test or subtest is optional
// or is not relevant to the current test set up.
TestStatusPreconditionFailed TestStatus = 10

// TestStatusNameUnknown is the string representation for an uninitialized
// TestStatus and should not be used.
TestStatusNameUnknown string = "UNKNOWN"
Expand Down Expand Up @@ -89,6 +93,11 @@ const (
// Mozilla.
TestStatusNameAssert string = "ASSERT"

// TestStatusNamePreconditionFailed is the string representation of a test
// result that indicates the test or subtest is optional or is not relevant
// to the current test set up.
TestStatusNamePreconditionFailed string = "PRECONDITION_FAILED"

// TestStatusDefault is the default value used when a status string cannot be
// interpreted.
TestStatusDefault TestStatus = TestStatusUnknown
Expand All @@ -99,30 +108,32 @@ const (
)

var testStatusValues = map[string]TestStatus{
"MISSING": TestStatusUnknown,
TestStatusNameUnknown: TestStatusUnknown,
TestStatusNamePass: TestStatusPass,
TestStatusNameOK: TestStatusOK,
TestStatusNameError: TestStatusError,
TestStatusNameTimeout: TestStatusTimeout,
TestStatusNameNotRun: TestStatusNotRun,
TestStatusNameFail: TestStatusFail,
TestStatusNameCrash: TestStatusCrash,
TestStatusNameSkip: TestStatusSkip,
TestStatusNameAssert: TestStatusAssert,
"MISSING": TestStatusUnknown,
TestStatusNameUnknown: TestStatusUnknown,
TestStatusNamePass: TestStatusPass,
TestStatusNameOK: TestStatusOK,
TestStatusNameError: TestStatusError,
TestStatusNameTimeout: TestStatusTimeout,
TestStatusNameNotRun: TestStatusNotRun,
TestStatusNameFail: TestStatusFail,
TestStatusNameCrash: TestStatusCrash,
TestStatusNameSkip: TestStatusSkip,
TestStatusNameAssert: TestStatusAssert,
TestStatusNamePreconditionFailed: TestStatusPreconditionFailed,
}

var testStatusNames = map[TestStatus]string{
TestStatusUnknown: TestStatusNameUnknown,
TestStatusPass: TestStatusNamePass,
TestStatusOK: TestStatusNameOK,
TestStatusError: TestStatusNameError,
TestStatusTimeout: TestStatusNameTimeout,
TestStatusNotRun: TestStatusNameNotRun,
TestStatusFail: TestStatusNameFail,
TestStatusCrash: TestStatusNameCrash,
TestStatusSkip: TestStatusNameSkip,
TestStatusAssert: TestStatusNameAssert,
TestStatusUnknown: TestStatusNameUnknown,
TestStatusPass: TestStatusNamePass,
TestStatusOK: TestStatusNameOK,
TestStatusError: TestStatusNameError,
TestStatusTimeout: TestStatusNameTimeout,
TestStatusNotRun: TestStatusNameNotRun,
TestStatusFail: TestStatusNameFail,
TestStatusCrash: TestStatusNameCrash,
TestStatusSkip: TestStatusNameSkip,
TestStatusAssert: TestStatusNameAssert,
TestStatusPreconditionFailed: TestStatusNamePreconditionFailed,
}

// IsPassOrOK is true if the value is TestStatusPass or TestStatusOK
Expand Down
5 changes: 5 additions & 0 deletions shared/statuses_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,8 @@ func TestDefaultsFromAPI(t *testing.T) {
assert.Equal(t, TestStatusDefault, TestStatusValueFromString("NOT_A_TEST_VALUE_STRING"))
assert.Equal(t, TestStatusNameDefault, TestStatus(7919).String())
}

func TestPreconditionFailed(t *testing.T) {
assert.Equal(t, TestStatusPreconditionFailed, TestStatusValueFromString("PRECONDITION_FAILED"))
assert.Equal(t, "PRECONDITION_FAILED", TestStatusPreconditionFailed.String())
}
1 change: 1 addition & 0 deletions webapp/components/test-info.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const TestStatuses = Object.freeze({
CRASH: new TestStatus('CRASH'),
SKIP: new TestStatus('SKIP'),
ASSERT: new TestStatus('ASSERT'),
PRECONDITION_FAILED: new TestStatus('PRECONDITION_FAILED'),
});

export { TestStatuses };
1 change: 1 addition & 0 deletions webapp/components/test-search.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const statuses = [
'assert',
'unknown',
'missing', // UI calls unknown missing.
'precondition_failed',
];

const atoms = {
Expand Down
4 changes: 4 additions & 0 deletions webapp/components/test/test-search.html
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@
test('status inequality', () => {
assertQueryParse('StAtUs:!FaIl', {exists: [{status: {not: 'FAIL'}}]});
});

test('status precondition_failed', () => {
assertQueryParse('StAtUs:!precondition_FAILED', {exists: [{status: {not: 'PRECONDITION_FAILED'}}]});
});
});

suite('browser-specific status', () => {
Expand Down
Loading