diff options
Diffstat (limited to 'test/runtimes/common')
-rw-r--r-- | test/runtimes/common/BUILD | 20 | ||||
-rw-r--r-- | test/runtimes/common/common.go | 114 | ||||
-rw-r--r-- | test/runtimes/common/common_test.go | 128 |
3 files changed, 262 insertions, 0 deletions
diff --git a/test/runtimes/common/BUILD b/test/runtimes/common/BUILD new file mode 100644 index 000000000..1b39606b8 --- /dev/null +++ b/test/runtimes/common/BUILD @@ -0,0 +1,20 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +package(licenses = ["notice"]) + +go_library( + name = "common", + srcs = ["common.go"], + importpath = "gvisor.dev/gvisor/test/runtimes/common", + visibility = ["//:sandbox"], +) + +go_test( + name = "common_test", + size = "small", + srcs = ["common_test.go"], + deps = [ + ":common", + "//runsc/test/testutil", + ], +) diff --git a/test/runtimes/common/common.go b/test/runtimes/common/common.go new file mode 100644 index 000000000..0ff87fa8b --- /dev/null +++ b/test/runtimes/common/common.go @@ -0,0 +1,114 @@ +// 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. + +// Package common executes functions for proctor binaries. +package common + +import ( + "flag" + "fmt" + "os" + "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") +) + +// TestRunner is an interface to be implemented in each proctor binary. +type TestRunner interface { + // ListTests returns a string slice of tests available to run. + ListTests() ([]string, error) + + // RunTest runs a single test. + RunTest(test string) error +} + +// LaunchFunc parses flags passed by a proctor binary and calls the requested behavior. +func LaunchFunc(tr TestRunner) error { + flag.Parse() + + if *list && *test != "" { + flag.PrintDefaults() + return fmt.Errorf("cannot specify 'list' and 'test' flags simultaneously") + } + if *list { + tests, err := tr.ListTests() + if err != nil { + return fmt.Errorf("failed to list tests: %v", err) + } + for _, test := range tests { + fmt.Println(test) + } + return nil + } + if *version { + fmt.Println(os.Getenv("LANG_NAME"), "version:", os.Getenv("LANG_VER"), "is installed.") + return nil + } + if *test != "" { + if err := tr.RunTest(*test); err != nil { + return fmt.Errorf("test %q failed to run: %v", *test, err) + } + return nil + } + + if err := runAllTests(tr); err != nil { + return fmt.Errorf("error running all tests: %v", err) + } + return nil +} + +// Search uses filepath.Walk to perform a search of the disk for test files +// and returns a string slice of tests. +func Search(root string, testFilter *regexp.Regexp) ([]string, error) { + var testSlice []string + + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + name := filepath.Base(path) + + if info.IsDir() || !testFilter.MatchString(name) { + return nil + } + + relPath, err := filepath.Rel(root, path) + if err != nil { + return err + } + testSlice = append(testSlice, relPath) + return nil + }) + + if err != nil { + return nil, fmt.Errorf("walking %q: %v", root, err) + } + + return testSlice, nil +} + +func runAllTests(tr TestRunner) error { + tests, err := tr.ListTests() + if err != nil { + return fmt.Errorf("failed to list tests: %v", err) + } + for _, test := range tests { + if err := tr.RunTest(test); err != nil { + return fmt.Errorf("test %q failed to run: %v", test, err) + } + } + return nil +} diff --git a/test/runtimes/common/common_test.go b/test/runtimes/common/common_test.go new file mode 100644 index 000000000..4fb1e482a --- /dev/null +++ b/test/runtimes/common/common_test.go @@ -0,0 +1,128 @@ +// 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. + +package common_test + +import ( + "io/ioutil" + "os" + "path/filepath" + "reflect" + "regexp" + "strings" + "testing" + + "gvisor.dev/gvisor/runsc/test/testutil" + "gvisor.dev/gvisor/test/runtimes/common" +) + +func touch(t *testing.T, name string) { + t.Helper() + f, err := os.Create(name) + if err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } +} + +func TestSearchEmptyDir(t *testing.T) { + td, err := ioutil.TempDir(testutil.TmpDir(), "searchtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(td) + + var want []string + + testFilter := regexp.MustCompile(`^test-[^-].+\.tc$`) + got, err := common.Search(td, testFilter) + if err != nil { + t.Errorf("Search error: %v", err) + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("Found %#v; want %#v", got, want) + } +} + +func TestSearch(t *testing.T) { + td, err := ioutil.TempDir(testutil.TmpDir(), "searchtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(td) + + // Creating various files similar to the test filter regex. + files := []string{ + "emp/", + "tee/", + "test-foo.tc", + "test-foo.tc", + "test-bar.tc", + "test-sam.tc", + "Test-que.tc", + "test-brett", + "test--abc.tc", + "test---xyz.tc", + "test-bool.TC", + "--test-gvs.tc", + " test-pew.tc", + "dir/test_baz.tc", + "dir/testsnap.tc", + "dir/test-luk.tc", + "dir/nest/test-ok.tc", + "dir/dip/diz/goog/test-pack.tc", + "dir/dip/diz/wobble/thud/test-cas.e", + "dir/dip/diz/wobble/thud/test-cas.tc", + } + want := []string{ + "dir/dip/diz/goog/test-pack.tc", + "dir/dip/diz/wobble/thud/test-cas.tc", + "dir/nest/test-ok.tc", + "dir/test-luk.tc", + "test-bar.tc", + "test-foo.tc", + "test-sam.tc", + } + + for _, item := range files { + if strings.HasSuffix(item, "/") { + // This item is a directory, create it. + if err := os.MkdirAll(filepath.Join(td, item), 0755); err != nil { + t.Fatal(err) + } + } else { + // This item is a file, create the directory and touch file. + // Create directory in which file should be created + fullDirPath := filepath.Join(td, filepath.Dir(item)) + if err := os.MkdirAll(fullDirPath, 0755); err != nil { + t.Fatal(err) + } + // Create file with full path to file. + touch(t, filepath.Join(td, item)) + } + } + + testFilter := regexp.MustCompile(`^test-[^-].+\.tc$`) + got, err := common.Search(td, testFilter) + if err != nil { + t.Errorf("Search error: %v", err) + } + + if !reflect.DeepEqual(got, want) { + t.Errorf("Found %#v; want %#v", got, want) + } +} |