Regres: Add new run_testlist flags

`shuffle` will randomize the order in which the tests are run.
`limit` will run (post-shuffle) at most this number of tests.
 `no-results` will disable emission of the `results.json` file.

 These are useful for testing a random subset of the filtered test list.

Change-Id: Ied54b4fd57c9e02fa6a9e63b808417fdc8f73a43
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/42710
Tested-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/tests/regres/cmd/run_testlist/main.go b/tests/regres/cmd/run_testlist/main.go
index 520695c..75a0f8e 100644
--- a/tests/regres/cmd/run_testlist/main.go
+++ b/tests/regres/cmd/run_testlist/main.go
@@ -25,6 +25,7 @@
 	"flag"
 	"fmt"
 	"log"
+	"math/rand"
 	"os"
 	"path/filepath"
 	"regexp"
@@ -44,6 +45,9 @@
 	maxProcMemory = flag.Uint64("max-proc-mem", shell.MaxProcMemory, "maximum virtual memory per child process")
 	output        = flag.String("output", "results.json", "path to an output JSON results file")
 	filter        = flag.String("filter", "", "filter for test names. Start with a '/' to indicate regex")
+	limit         = flag.Int("limit", 0, "only run a maximum of this number of tests")
+	shuffle       = flag.Bool("shuffle", false, "shuffle tests")
+	noResults     = flag.Bool("no-results", false, "disable generation of results.json file")
 )
 
 const testTimeout = time.Minute * 2
@@ -70,10 +74,19 @@
 		}
 	}
 
-	testLists := testlist.Lists{group}
-
 	shell.MaxProcMemory = *maxProcMemory
 
+	if *shuffle {
+		rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
+		rnd.Shuffle(len(group.Tests), func(i, j int) { group.Tests[i], group.Tests[j] = group.Tests[j], group.Tests[i] })
+	}
+
+	if *limit != 0 && len(group.Tests) > *limit {
+		group.Tests = group.Tests[:*limit]
+	}
+
+	log.Printf("Running %d tests...\n", len(group.Tests))
+
 	config := deqp.Config{
 		ExeEgl:           "",
 		ExeGles2:         "",
@@ -81,12 +94,10 @@
 		ExeVulkan:        *deqpVkBinary,
 		Env:              os.Environ(),
 		NumParallelTests: *numThreads,
-		TestLists:        testLists,
+		TestLists:        testlist.Lists{group},
 		TestTimeout:      testTimeout,
 	}
 
-	log.Printf("Running %d tests...\n", len(group.Tests))
-
 	res, err := config.Run()
 	if err != nil {
 		return err
@@ -102,9 +113,11 @@
 		}
 	}
 
-	err = res.Save(*output)
-	if err != nil {
-		return err
+	if !*noResults {
+		err = res.Save(*output)
+		if err != nil {
+			return err
+		}
 	}
 
 	return nil