test-runner: Change behavior of 'excluded' directories
For the directories "/test/unittest/" and "/test/vk-gl-cts/", continue to prevent the emission of PASS expectations, but now:
* Generate SKIP expectations in these directories if `--generate-skip` is passed.
* Delete expectation files in these directories if the tests now pass and `--generate-expected` is passed.
There's no change in behaviour for other test directories.
Change-Id: Ibd9e84a51029715e7c3d9e22e76a65770b66f1c7
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/77442
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/tools/src/cmd/test-runner/main.go b/tools/src/cmd/test-runner/main.go
index d026dd1..6b89c50 100644
--- a/tools/src/cmd/test-runner/main.go
+++ b/tools/src/cmd/test-runner/main.go
@@ -48,6 +48,14 @@
wgsl = outputFormat("wgsl")
)
+// Directories we don't generate expected PASS result files for.
+// These directories contain large corpora of tests for which the generated code
+// is uninteresting.
+var dirsWithNoPassExpectations = []string{
+ "/test/unittest/",
+ "/test/vk-gl-cts/",
+}
+
func main() {
if err := run(); err != nil {
fmt.Println(err)
@@ -489,8 +497,16 @@
func (j job) run(wd, exe string, fxc bool, dxcPath, xcrunPath string, generateExpected, generateSkip bool) {
j.result <- func() status {
- // Is there an expected output?
- expected := loadExpectedFile(j.file, j.format)
+ // expectedFilePath is the path to the expected output file for the given test
+ expectedFilePath := j.file + ".expected." + string(j.format)
+
+ // Is there an expected output file? If so, load it.
+ expected, expectedFileExists := "", false
+ if content, err := ioutil.ReadFile(expectedFilePath); err == nil {
+ expected = string(content)
+ expectedFileExists = true
+ }
+
skipped := false
if strings.HasPrefix(expected, "SKIP") { // Special SKIP token
skipped = true
@@ -545,9 +561,29 @@
out = strings.ReplaceAll(out, "\r\n", "\n")
matched := expected == "" || expected == out
+ canEmitPassExpectationFile := true
+ for _, noPass := range dirsWithNoPassExpectations {
+ if strings.Contains(j.file, filepath.FromSlash(noPass)) {
+ canEmitPassExpectationFile = false
+ break
+ }
+ }
+
+ saveExpectedFile := func(path string, content string) error {
+ return ioutil.WriteFile(path, []byte(content), 0666)
+ }
+
if ok && generateExpected && (validate || !skipped) {
- saveExpectedFile(j.file, j.format, out)
- matched = true
+ // User requested to update PASS expectations, and test passed.
+ if canEmitPassExpectationFile {
+ saveExpectedFile(expectedFilePath, out)
+ } else if expectedFileExists {
+ // Test lives in a directory where we do not want to save PASS
+ // files, and there already exists an expectation file. Test has
+ // likely started passing. Delete the old expectation.
+ os.Remove(expectedFilePath)
+ }
+ matched = true // test passed and matched expectations
}
switch {
@@ -559,14 +595,14 @@
case skipped:
if generateSkip {
- saveExpectedFile(j.file, j.format, "SKIP: FAILED\n\n"+out)
+ saveExpectedFile(expectedFilePath, "SKIP: FAILED\n\n"+out)
}
return status{code: skip, timeTaken: timeTaken}
case !ok:
// Compiler returned non-zero exit code
if generateSkip {
- saveExpectedFile(j.file, j.format, "SKIP: FAILED\n\n"+out)
+ saveExpectedFile(expectedFilePath, "SKIP: FAILED\n\n"+out)
}
err := fmt.Errorf("%s", out)
return status{code: fail, err: err, timeTaken: timeTaken}
@@ -574,7 +610,7 @@
default:
// Compiler returned zero exit code, or output was not as expected
if generateSkip {
- saveExpectedFile(j.file, j.format, "SKIP: FAILED\n\n"+out)
+ saveExpectedFile(expectedFilePath, "SKIP: FAILED\n\n"+out)
}
// Expected output did not match
@@ -602,36 +638,6 @@
}()
}
-// loadExpectedFile loads the expected output file for the test file at 'path'
-// and the output format 'format'. If the file does not exist, or cannot be
-// read, then an empty string is returned.
-func loadExpectedFile(path string, format outputFormat) string {
- content, err := ioutil.ReadFile(expectedFilePath(path, format))
- if err != nil {
- return ""
- }
- return string(content)
-}
-
-// saveExpectedFile writes the expected output file for the test file at 'path'
-// and the output format 'format', with the content 'content'.
-func saveExpectedFile(path string, format outputFormat, content string) error {
- // Don't generate expected results for certain directories that contain
- // large corpora of tests for which the generated code is uninteresting.
- for _, exclude := range []string{"/test/unittest/", "/test/vk-gl-cts/"} {
- if strings.Contains(path, filepath.FromSlash(exclude)) {
- return nil
- }
- }
- return ioutil.WriteFile(expectedFilePath(path, format), []byte(content), 0666)
-}
-
-// expectedFilePath returns the expected output file path for the test file at
-// 'path' and the output format 'format'.
-func expectedFilePath(path string, format outputFormat) string {
- return path + ".expected." + string(format)
-}
-
// indent returns the string 's' indented with 'n' whitespace characters
func indent(s string, n int) string {
tab := strings.Repeat(" ", n)