| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build fuchsia |
| |
| package zxwait_test |
| |
| import ( |
| "runtime" |
| "sync" |
| "syscall/zx" |
| "syscall/zx/zxwait" |
| "testing" |
| ) |
| |
| func TestWaitPreexisting(t *testing.T) { |
| c0, c1, err := zx.NewChannel(0) |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer c0.Close() |
| defer c1.Close() |
| |
| obs, err := zxwait.Wait(*c0.Handle(), zx.SignalChannelWritable, zx.TimensecInfinite) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if obs&zx.SignalChannelWritable == 0 { |
| t.Errorf("want zx.SignalChannelWritable, got obs=%x", obs) |
| } |
| |
| obs, err = zxwait.Wait(*c1.Handle(), zx.SignalChannelWritable, zx.TimensecInfinite) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if obs&zx.SignalChannelWritable == 0 { |
| t.Errorf("want zx.SignalChannelWritable, got obs=%x", obs) |
| } |
| } |
| |
| func TestWait(t *testing.T) { |
| t.Logf("GOMAXPROCS=%v", runtime.GOMAXPROCS(0)) |
| c0s := make([]zx.Channel, 100) |
| c1s := make([]zx.Channel, len(c0s)) |
| allObs := make([]zx.Signals, len(c0s)) |
| |
| var wg sync.WaitGroup |
| for i := range c0s { |
| var err error |
| c0s[i], c1s[i], err = zx.NewChannel(0) |
| if err != nil { |
| t.Fatal(err) |
| } |
| wg.Add(1) |
| go func(i int) { |
| obs, err := zxwait.Wait(*c0s[i].Handle(), zx.SignalChannelReadable, zx.TimensecInfinite) |
| if err != nil { |
| t.Fatal(err) |
| } |
| allObs[i] = obs |
| //t.Logf("signal for channel %d received", i) |
| //fmt.Printf("TEST: signal for channel %d received\n", i) |
| wg.Done() |
| }(i) |
| } |
| |
| b := []byte("hello") |
| for i, c1 := range c1s { |
| //t.Logf("writing on channel %d", i) |
| //fmt.Printf("TEST: writing on channel %d\n", i) |
| if err := c1.Write(b, nil, 0); err != nil { |
| t.Errorf("failed to write on channel %d: %v", i, err) |
| } |
| } |
| |
| wg.Wait() |
| |
| for i, obs := range allObs { |
| if obs&zx.SignalChannelWritable == 0 { |
| t.Errorf("channel %d: obs=%x want zx.SignalChannelReadable", i, obs) |
| } |
| } |
| } |