From f2762e8c60b0a83f976c9eedd4a8c08e32cb6856 Mon Sep 17 00:00:00 2001 From: Brett Landau Date: Fri, 9 Aug 2019 15:34:44 -0700 Subject: Create tests for common.Search(). Using the path_test.go file built by the Golang devs as a base, tests have been created to verify the functionality of common.Search(). A mock file system is created and fake test files are generated to see if they get picked up by common.Search(). Also included in this CL is a bug fix for proctor-nodejs that was discovered using this test. proctor-nodejs used to allow multiple "-" in its test name filter. The regex has been updated to prevent this. PiperOrigin-RevId: 262647263 --- test/runtimes/common/BUILD | 12 +++- test/runtimes/common/common_test.go | 128 +++++++++++++++++++++++++++++++++ test/runtimes/nodejs/proctor-nodejs.go | 2 +- 3 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 test/runtimes/common/common_test.go diff --git a/test/runtimes/common/BUILD b/test/runtimes/common/BUILD index 7147e841a..1b39606b8 100644 --- a/test/runtimes/common/BUILD +++ b/test/runtimes/common/BUILD @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") package(licenses = ["notice"]) @@ -8,3 +8,13 @@ go_library( 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_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) + } +} diff --git a/test/runtimes/nodejs/proctor-nodejs.go b/test/runtimes/nodejs/proctor-nodejs.go index 5f21e046b..0624f6a0d 100644 --- a/test/runtimes/nodejs/proctor-nodejs.go +++ b/test/runtimes/nodejs/proctor-nodejs.go @@ -29,7 +29,7 @@ import ( var ( dir = os.Getenv("LANG_DIR") testDir = filepath.Join(dir, "test") - testRegEx = regexp.MustCompile(`^test-.+\.js$`) + testRegEx = regexp.MustCompile(`^test-[^-].+\.js$`) ) type nodejsRunner struct { -- cgit v1.2.3