diff options
Diffstat (limited to 'runsc/container')
-rw-r--r-- | runsc/container/BUILD | 15 | ||||
-rw-r--r-- | runsc/container/container_test.go | 6 | ||||
-rw-r--r-- | runsc/container/test_app.go | 116 | ||||
-rw-r--r-- | runsc/container/uds_test_app.go | 83 |
4 files changed, 126 insertions, 94 deletions
diff --git a/runsc/container/BUILD b/runsc/container/BUILD index 72e2304bf..d72d05c13 100644 --- a/runsc/container/BUILD +++ b/runsc/container/BUILD @@ -2,13 +2,6 @@ package(licenses = ["notice"]) # Apache 2.0 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library", "go_test") -go_binary( - name = "uds_test_app", - srcs = [ - "uds_test_app.go", - ], -) - go_library( name = "container", srcs = [ @@ -42,7 +35,7 @@ go_test( "multi_container_test.go", ], data = [ - ":uds_test_app", + ":test_app", "//runsc", ], embed = [":container"], @@ -64,3 +57,9 @@ go_test( "@org_golang_x_sys//unix:go_default_library", ], ) + +go_binary( + name = "test_app", + srcs = ["test_app.go"], + deps = ["@com_github_google_subcommands//:go_default_library"], +) diff --git a/runsc/container/container_test.go b/runsc/container/container_test.go index 083054877..efa598202 100644 --- a/runsc/container/container_test.go +++ b/runsc/container/container_test.go @@ -722,15 +722,15 @@ func TestUnixDomainSockets(t *testing.T) { } defer outputFile.Close() - app, err := testutil.FindFile("runsc/container/uds_test_app") + app, err := testutil.FindFile("runsc/container/test_app") if err != nil { - t.Fatal("error finding uds_test_app:", err) + t.Fatal("error finding test_app:", err) } socketPath := filepath.Join(dir, "uds_socket") defer os.Remove(socketPath) - spec := testutil.NewSpecWithArgs(app, "--file", outputPath, "--socket", socketPath) + spec := testutil.NewSpecWithArgs(app, "uds", "--file", outputPath, "--socket", socketPath) spec.Process.User = specs.User{ UID: uint32(os.Getuid()), GID: uint32(os.Getgid()), diff --git a/runsc/container/test_app.go b/runsc/container/test_app.go new file mode 100644 index 000000000..768293cf9 --- /dev/null +++ b/runsc/container/test_app.go @@ -0,0 +1,116 @@ +// Copyright 2018 Google Inc. +// +// 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 test_app is like a swiss knife for tests that need to run anything +// inside the sandbox. New functionality can be added with new commands. +package main + +import ( + "context" + "fmt" + "log" + "net" + "os" + "strconv" + "time" + + "flag" + "github.com/google/subcommands" +) + +func main() { + subcommands.Register(subcommands.HelpCommand(), "") + subcommands.Register(subcommands.FlagsCommand(), "") + subcommands.Register(new(uds), "") + + flag.Parse() + + exitCode := subcommands.Execute(context.Background()) + os.Exit(int(exitCode)) +} + +type uds struct { + fileName string + socketPath string +} + +// Name implements subcommands.Command.Name. +func (*uds) Name() string { + return "uds" +} + +// Synopsis implements subcommands.Command.Synopsys. +func (*uds) Synopsis() string { + return "creates unix domain socket client and server. Client sends a contant flow of sequential numbers. Server prints them to --file" +} + +// Usage implements subcommands.Command.Usage. +func (*uds) Usage() string { + return "uds <flags>" +} + +// SetFlags implements subcommands.Command.SetFlags. +func (c *uds) SetFlags(f *flag.FlagSet) { + f.StringVar(&c.fileName, "file", "", "name of output file") + f.StringVar(&c.socketPath, "socket", "", "path to socket") +} + +// Execute implements subcommands.Command.Execute. +func (c *uds) Execute(ctx context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus { + if c.fileName == "" || c.socketPath == "" { + log.Fatal("Flags cannot be empty, given: fileName: %q, socketPath: %q", c.fileName, c.socketPath) + return subcommands.ExitFailure + } + outputFile, err := os.OpenFile(c.fileName, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + log.Fatal("error opening output file:", err) + } + + defer os.Remove(c.socketPath) + + listener, err := net.Listen("unix", c.socketPath) + if err != nil { + log.Fatal("error listening on socket %q:", c.socketPath, err) + } + + go server(listener, outputFile) + for i := 0; ; i++ { + conn, err := net.Dial("unix", c.socketPath) + if err != nil { + log.Fatal("error dialing:", err) + } + if _, err := conn.Write([]byte(strconv.Itoa(i))); err != nil { + log.Fatal("error writing:", err) + } + conn.Close() + time.Sleep(100 * time.Millisecond) + } +} + +func server(listener net.Listener, out *os.File) { + buf := make([]byte, 16) + + for { + c, err := listener.Accept() + if err != nil { + log.Fatal("error accepting connection:", err) + } + nr, err := c.Read(buf) + if err != nil { + log.Fatal("error reading from buf:", err) + } + data := buf[0:nr] + fmt.Fprint(out, string(data)+"\n") + } +} diff --git a/runsc/container/uds_test_app.go b/runsc/container/uds_test_app.go deleted file mode 100644 index bef98ac66..000000000 --- a/runsc/container/uds_test_app.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2018 Google Inc. -// -// 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 uds-test-app opens a socket and reads a series of numbers -// which are then written to an output file. -package main - -import ( - "flag" - "fmt" - "log" - "net" - "os" - "strconv" - "time" -) - -var ( - fileName = flag.String("file", "", "name of output file") - socketPath = flag.String("socket", "", "path to socket") -) - -func server(listener net.Listener, f *os.File) { - buf := make([]byte, 16) - - for { - c, err := listener.Accept() - if err != nil { - log.Fatal("error accepting connection:", err) - } - nr, err := c.Read(buf) - if err != nil { - log.Fatal("error reading from buf:", err) - } - data := buf[0:nr] - fmt.Fprintf(f, string(data)+"\n") - } -} - -func main() { - flag.Parse() - if *fileName == "" || *socketPath == "" { - log.Fatalf("Flags cannot be empty, given: fileName=%s, socketPath=%s", *fileName, *socketPath) - } - outputFile, err := os.OpenFile(*fileName, os.O_WRONLY|os.O_CREATE, 0666) - if err != nil { - log.Fatal("error opening output file:", err) - } - - socket := *socketPath - defer os.Remove(socket) - - listener, err := net.Listen("unix", socket) - if err != nil { - log.Fatal("error listening on socket:", err) - } - - go server(listener, outputFile) - for i := 0; ; i++ { - - conn, err := net.Dial("unix", socket) - if err != nil { - log.Fatal("error dialing:", err) - } - if _, err := conn.Write([]byte(strconv.Itoa(i))); err != nil { - log.Fatal("error writing:", err) - } - conn.Close() - time.Sleep(100 * time.Millisecond) - } - -} |