From 02690f758321930374ec53d56796c8ad6b7b3165 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Wed, 3 May 2017 16:34:42 -0700 Subject: [PATCH] Run CAVP tests in parallel. Change-Id: I11810afab77469e3a346954085b3b4db1ef9ed14 Reviewed-on: https://boringssl-review.googlesource.com/15905 Reviewed-by: Martin Kreichgauer Reviewed-by: Adam Langley --- fipsoracle/run_cavp.go | 58 ++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/fipsoracle/run_cavp.go b/fipsoracle/run_cavp.go index d0b389d9..4752555f 100644 --- a/fipsoracle/run_cavp.go +++ b/fipsoracle/run_cavp.go @@ -9,7 +9,10 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "strings" + "sync" + "time" ) var ( @@ -287,6 +290,32 @@ var allTestSuites = []*testSuite{ &tdesTests, } +// testInstance represents a specific test in a testSuite. +type testInstance struct { + suite *testSuite + testIndex int +} + +func worker(wg *sync.WaitGroup, work <-chan testInstance) { + defer wg.Done() + + for ti := range work { + test := ti.suite.tests[ti.testIndex] + + if err := doTest(ti.suite, test); err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(2) + } + + if !test.noFAX { + if err := compareFAX(ti.suite, test); err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(3) + } + } + } +} + func main() { flag.Parse() @@ -295,21 +324,22 @@ func main() { os.Exit(1) } - for _, suite := range allTestSuites { - for _, test := range suite.tests { - if err := doTest(suite, test); err != nil { - fmt.Fprintf(os.Stderr, "%s\n", err) - os.Exit(2) - } + work := make(chan testInstance) + var wg sync.WaitGroup - if !test.noFAX { - if err := compareFAX(suite, test); err != nil { - fmt.Fprintf(os.Stderr, "%s\n", err) - os.Exit(3) - } - } + for i := 0; i < runtime.NumCPU(); i++ { + wg.Add(1) + go worker(&wg, work) + } + + for _, suite := range allTestSuites { + for i := range suite.tests { + work <- testInstance{suite, i} } } + + close(work) + wg.Wait() } func doTest(suite *testSuite, test test) error { @@ -329,11 +359,13 @@ func doTest(suite *testSuite, test test) error { cmd.Stderr = os.Stderr cmdLine := strings.Join(append([]string{*oraclePath}, args...), " ") - fmt.Println("Running", cmdLine) + startTime := time.Now() if err := cmd.Run(); err != nil { return fmt.Errorf("cannot run command for %q %q (%s): %s", suite.getDirectory(), test.inFile, cmdLine, err) } + fmt.Printf("%s (%ds)\n", cmdLine, int(time.Since(startTime).Seconds())) + return nil }