aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/ipc/ipc_test.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-04-23 13:19:45 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-04-23 16:26:26 +0200
commitff12bea91c22bba93d3ffc3034d813d686bc7eeb (patch)
tree4683d8c6eb9d273becb576b39ce0789ab1f4824c /pkg/ipc/ipc_test.go
parentc7b0bb14c0629cd3d4a1c153efa0e0a3e55a6e66 (diff)
pkg/ipc: fix data race on config.Timeout
Diffstat (limited to 'pkg/ipc/ipc_test.go')
-rw-r--r--pkg/ipc/ipc_test.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/pkg/ipc/ipc_test.go b/pkg/ipc/ipc_test.go
index 0d90f2363..23f51f64e 100644
--- a/pkg/ipc/ipc_test.go
+++ b/pkg/ipc/ipc_test.go
@@ -100,3 +100,58 @@ func TestExecute(t *testing.T) {
}
}
}
+
+func TestParallel(t *testing.T) {
+ target, _, _, configFlags := initTest(t)
+ bin := buildExecutor(t, target)
+ defer os.Remove(bin)
+ cfg := &Config{
+ Executor: bin,
+ Flags: configFlags,
+ }
+ const P = 10
+ errs := make(chan error, P)
+ for p := 0; p < P; p++ {
+ go func() {
+ env, err := MakeEnv(cfg, 0)
+ if err != nil {
+ errs <- fmt.Errorf("failed to create env: %v", err)
+ return
+ }
+ defer env.Close()
+ p := target.GenerateSimpleProg()
+ opts := &ExecOpts{}
+ output, info, failed, hanged, err := env.Exec(opts, p)
+ if err != nil {
+ errs <- fmt.Errorf("failed to run executor: %v", err)
+ return
+ }
+ if hanged {
+ errs <- fmt.Errorf("program hanged:\n%s", output)
+ return
+ }
+ if failed {
+ errs <- fmt.Errorf("program failed:\n%s", output)
+ return
+ }
+ if len(info) == 0 {
+ errs <- fmt.Errorf("no calls executed:\n%s", output)
+ return
+ }
+ if info[0].Errno != 0 {
+ errs <- fmt.Errorf("simple call failed: %v\n%s", info[0].Errno, output)
+ return
+ }
+ if len(output) != 0 {
+ errs <- fmt.Errorf("output on empty program")
+ return
+ }
+ errs <- nil
+ }()
+ }
+ for p := 0; p < P; p++ {
+ if err := <-errs; err != nil {
+ t.Fatal(err)
+ }
+ }
+}