From 32e6be0045fde1837c5ceb4ce44bffe4e4488b05 Mon Sep 17 00:00:00 2001 From: Brett Landau Date: Fri, 19 Jul 2019 16:29:13 -0700 Subject: Create the initial binary for each of the 5 runtime's test-runner. Repeated code is planned to be factored out to improve clarity and readability. PiperOrigin-RevId: 259059978 --- runsc/test/runtimes/proctor-go.go | 152 ++++++++++++++++++++++++++++++++++ runsc/test/runtimes/proctor-java.go | 93 +++++++++++++++++++++ runsc/test/runtimes/proctor-nodejs.go | 93 +++++++++++++++++++++ runsc/test/runtimes/proctor-php.go | 92 ++++++++++++++++++++ runsc/test/runtimes/proctor-python.go | 93 +++++++++++++++++++++ 5 files changed, 523 insertions(+) create mode 100644 runsc/test/runtimes/proctor-go.go create mode 100644 runsc/test/runtimes/proctor-java.go create mode 100644 runsc/test/runtimes/proctor-nodejs.go create mode 100644 runsc/test/runtimes/proctor-php.go create mode 100644 runsc/test/runtimes/proctor-python.go (limited to 'runsc/test/runtimes') diff --git a/runsc/test/runtimes/proctor-go.go b/runsc/test/runtimes/proctor-go.go new file mode 100644 index 000000000..619887327 --- /dev/null +++ b/runsc/test/runtimes/proctor-go.go @@ -0,0 +1,152 @@ +// Copyright 2019 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Binary proctor-go is a utility that facilitates language testing for Go. + +// There are two types of Go tests: "Go tool tests" and "Go tests on disk". +// "Go tool tests" are found and executed using `go tool dist test`. +// "Go tests on disk" are found in the /test directory and are +// executed using `go run run.go`. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" +) + +var ( + list = flag.Bool("list", false, "list all available tests") + test = flag.String("test", "", "run a single test from the list of available tests") + version = flag.Bool("v", false, "print out the version of node that is installed") + + dir = os.Getenv("LANG_DIR") + testDir = filepath.Join(dir, "test") + testRegEx = regexp.MustCompile(`^.+\.go$`) + + // Directories with .dir contain helper files for tests. + // Exclude benchmarks and stress tests. + exclDirs = regexp.MustCompile(`^.+\/(bench|stress)\/.+$|^.+\.dir.+$`) +) + +func main() { + flag.Parse() + + if *list && *test != "" { + flag.PrintDefaults() + os.Exit(1) + } + if *list { + listTests() + return + } + if *version { + fmt.Println("Go version: ", os.Getenv("LANG_VER"), " is installed.") + return + } + runTest(*test) +} + +func listTests() { + // Go tool dist test tests. + args := []string{"tool", "dist", "test", "-list"} + cmd := exec.Command(filepath.Join(dir, "bin/go"), args...) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("Failed to list: %v", err) + } + + // Go tests on disk. + var tests []string + if err := filepath.Walk(testDir, func(path string, info os.FileInfo, err error) error { + name := filepath.Base(path) + + if info.IsDir() { + return nil + } + + if !testRegEx.MatchString(name) { + return nil + } + + if exclDirs.MatchString(path) { + return nil + } + + tests = append(tests, path) + return nil + }); err != nil { + log.Fatalf("Failed to walk %q: %v", dir, err) + } + + for _, file := range tests { + fmt.Println(file) + } +} + +func runTest(test string) { + toolArgs := []string{ + "tool", + "dist", + "test", + } + diskArgs := []string{ + "run", + "run.go", + "-v", + } + if test != "" { + // Check if test exists on disk by searching for file of the same name. + // This will determine whether or not it is a Go test on disk. + if _, err := os.Stat(test); err == nil { + relPath, err := filepath.Rel(testDir, test) + if err != nil { + log.Fatalf("Failed to get rel path: %v", err) + } + diskArgs = append(diskArgs, "--", relPath) + cmd := exec.Command(filepath.Join(dir, "bin/go"), diskArgs...) + cmd.Dir = testDir + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("Failed to run: %v", err) + } + } else if os.IsNotExist(err) { + // File was not found, try running as Go tool test. + toolArgs = append(toolArgs, "-run", test) + cmd := exec.Command(filepath.Join(dir, "bin/go"), toolArgs...) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("Failed to run: %v", err) + } + } else { + log.Fatalf("Error searching for test: %v", err) + } + return + } + runAllTool := exec.Command(filepath.Join(dir, "bin/go"), toolArgs...) + runAllTool.Stdout, runAllTool.Stderr = os.Stdout, os.Stderr + if err := runAllTool.Run(); err != nil { + log.Fatalf("Failed to run: %v", err) + } + runAllDisk := exec.Command(filepath.Join(dir, "bin/go"), diskArgs...) + runAllDisk.Dir = testDir + runAllDisk.Stdout, runAllDisk.Stderr = os.Stdout, os.Stderr + if err := runAllDisk.Run(); err != nil { + log.Fatalf("Failed to run disk tests: %v", err) + } +} diff --git a/runsc/test/runtimes/proctor-java.go b/runsc/test/runtimes/proctor-java.go new file mode 100644 index 000000000..50f3789dc --- /dev/null +++ b/runsc/test/runtimes/proctor-java.go @@ -0,0 +1,93 @@ +// Copyright 2019 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Binary proctor-java is a utility that facilitates language testing for Java. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" +) + +var ( + list = flag.Bool("list", false, "list all available tests") + test = flag.String("test", "", "run a single test from the list of available tests") + version = flag.Bool("v", false, "print out the version of node that is installed") + + dir = os.Getenv("LANG_DIR") + jtreg = filepath.Join(dir, "jtreg/bin/jtreg") + exclDirs = regexp.MustCompile(`(^(sun\/security)|(java\/util\/stream)|(java\/time)| )`) +) + +func main() { + flag.Parse() + + if *list && *test != "" { + flag.PrintDefaults() + os.Exit(1) + } + if *list { + listTests() + return + } + if *version { + fmt.Println("Java version: ", os.Getenv("LANG_VER"), " is installed.") + return + } + runTest(*test) +} + +func listTests() { + args := []string{ + "-dir:test/jdk", + "-ignore:quiet", + "-a", + "-listtests", + ":jdk_core", + ":jdk_svc", + ":jdk_sound", + ":jdk_imageio", + } + cmd := exec.Command(jtreg, args...) + cmd.Stderr = os.Stderr + out, err := cmd.Output() + if err != nil { + log.Fatalf("Failed to list: %v", err) + } + allTests := string(out) + for _, test := range strings.Split(allTests, "\n") { + if !exclDirs.MatchString(test) { + fmt.Println(test) + } + } +} + +func runTest(test string) { + // TODO(brettlandau): Change to use listTests() for running all tests. + cmd := exec.Command("make", "run-test-tier1") + if test != "" { + args := []string{"-dir:test/jdk/", test} + cmd = exec.Command(jtreg, args...) + } + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("Failed to run: %v", err) + } +} diff --git a/runsc/test/runtimes/proctor-nodejs.go b/runsc/test/runtimes/proctor-nodejs.go new file mode 100644 index 000000000..771286dd1 --- /dev/null +++ b/runsc/test/runtimes/proctor-nodejs.go @@ -0,0 +1,93 @@ +// Copyright 2019 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Binary proctor-nodejs is a utility that facilitates language testing for NodeJS. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" +) + +var ( + list = flag.Bool("list", false, "list all available tests") + test = flag.String("test", "", "run a single test from the list of available tests") + version = flag.Bool("v", false, "print out the version of node that is installed") + + dir = os.Getenv("LANG_DIR") + testRegEx = regexp.MustCompile(`^test-.+\.js$`) +) + +func main() { + flag.Parse() + + if *list && *test != "" { + flag.PrintDefaults() + os.Exit(1) + } + if *list { + listTests() + return + } + if *version { + fmt.Println("Node.js version: ", os.Getenv("LANG_VER"), " is installed.") + return + } + runTest(*test) +} + +func listTests() { + var files []string + root := filepath.Join(dir, "test") + + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + name := filepath.Base(path) + + if info.IsDir() || !testRegEx.MatchString(name) { + return nil + } + + relPath, err := filepath.Rel(root, path) + if err != nil { + return err + } + files = append(files, relPath) + return nil + }) + + if err != nil { + log.Fatalf("Failed to walk %q: %v", root, err) + } + + for _, file := range files { + fmt.Println(file) + } +} + +func runTest(test string) { + args := []string{filepath.Join(dir, "tools", "test.py")} + if test != "" { + args = append(args, test) + } + cmd := exec.Command("/usr/bin/python", args...) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("Failed to run: %v", err) + } +} diff --git a/runsc/test/runtimes/proctor-php.go b/runsc/test/runtimes/proctor-php.go new file mode 100644 index 000000000..3d305c709 --- /dev/null +++ b/runsc/test/runtimes/proctor-php.go @@ -0,0 +1,92 @@ +// Copyright 2019 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Binary proctor-php is a utility that facilitates language testing for PHP. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" +) + +var ( + list = flag.Bool("list", false, "list all available tests") + test = flag.String("test", "", "run a single test from the list of available tests") + version = flag.Bool("v", false, "print out the version of node that is installed") + + dir = os.Getenv("LANG_DIR") + testRegEx = regexp.MustCompile(`^.+\.phpt$`) +) + +func main() { + flag.Parse() + + if *list && *test != "" { + flag.PrintDefaults() + os.Exit(1) + } + if *list { + listTests() + return + } + if *version { + fmt.Println("PHP version: ", os.Getenv("LANG_VER"), " is installed.") + return + } + runTest(*test) +} + +func listTests() { + var files []string + + err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + name := filepath.Base(path) + + if info.IsDir() || !testRegEx.MatchString(name) { + return nil + } + + relPath, err := filepath.Rel(dir, path) + if err != nil { + return err + } + files = append(files, relPath) + return nil + }) + + if err != nil { + log.Fatalf("Failed to walk %q: %v", dir, err) + } + + for _, file := range files { + fmt.Println(file) + } +} + +func runTest(test string) { + args := []string{"test", "TESTS="} + if test != "" { + args[1] = args[1] + test + } + cmd := exec.Command("make", args...) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("Failed to run: %v", err) + } +} diff --git a/runsc/test/runtimes/proctor-python.go b/runsc/test/runtimes/proctor-python.go new file mode 100644 index 000000000..5e8d830e1 --- /dev/null +++ b/runsc/test/runtimes/proctor-python.go @@ -0,0 +1,93 @@ +// Copyright 2019 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Binary proctor-python is a utility that facilitates language testing for Pyhton. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" +) + +var ( + list = flag.Bool("list", false, "list all available tests") + test = flag.String("test", "", "run a single test from the list of available tests") + version = flag.Bool("v", false, "print out the version of node that is installed") + + dir = os.Getenv("LANG_DIR") + testRegEx = regexp.MustCompile(`^test_.+\.py$`) +) + +func main() { + flag.Parse() + + if *list && *test != "" { + flag.PrintDefaults() + os.Exit(1) + } + if *list { + listTests() + return + } + if *version { + fmt.Println("Python version: ", os.Getenv("LANG_VER"), " is installed.") + return + } + runTest(*test) +} + +func listTests() { + var files []string + root := filepath.Join(dir, "Lib/test") + + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + name := filepath.Base(path) + + if info.IsDir() || !testRegEx.MatchString(name) { + return nil + } + + relPath, err := filepath.Rel(root, path) + if err != nil { + return err + } + files = append(files, relPath) + return nil + }) + + if err != nil { + log.Fatalf("Failed to walk %q: %v", root, err) + } + + for _, file := range files { + fmt.Println(file) + } +} + +func runTest(test string) { + args := []string{"-m", "test"} + if test != "" { + args = append(args, test) + } + cmd := exec.Command(filepath.Join(dir, "python"), args...) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("Failed to run: %v", err) + } +} -- cgit v1.2.3