Index: mojo/go/tests/system_test.go |
diff --git a/mojo/go/tests/system_test.go b/mojo/go/tests/system_test.go |
index f3581f0371d33cd3531dd391cbe2c3e861194eb4..b662ec7646eea94610bb5cdfe51fc3edd3275f29 100644 |
--- a/mojo/go/tests/system_test.go |
+++ b/mojo/go/tests/system_test.go |
@@ -95,7 +95,7 @@ func TestMessagePipe(t *testing.T) { |
t.Fatalf("state should allow all signals after CreateMessagePipe:%v", state.SatisfiableSignals) |
} |
- r, state = h0.Wait(system.MOJO_HANDLE_SIGNAL_WRITABLE, 0) |
+ r, state = h0.Wait(system.MOJO_HANDLE_SIGNAL_WRITABLE, system.MOJO_DEADLINE_INDEFINITE) |
if r != system.MOJO_RESULT_OK { |
t.Fatalf("h0 should be writable:%v", r) |
} |
@@ -157,7 +157,7 @@ func TestMessagePipe(t *testing.T) { |
t.Fatalf("Close on h0 failed:%v", r) |
} |
- r, state = h1.Wait(MOJO_HANDLE_SIGNAL_READWRITABLE, 100) |
+ r, state = h1.Wait(MOJO_HANDLE_SIGNAL_READWRITABLE, system.MOJO_DEADLINE_INDEFINITE) |
if r != system.MOJO_RESULT_FAILED_PRECONDITION { |
t.Fatalf("h1 should not be readable/writable after Close(h0):%v", r) |
} |
@@ -187,15 +187,19 @@ func TestDataPipe(t *testing.T) { |
if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, 0); r != system.MOJO_RESULT_DEADLINE_EXCEEDED { |
t.Fatalf("hc should not be readable:%v", r) |
} |
- if r, _ = hp.Wait(system.MOJO_HANDLE_SIGNAL_WRITABLE, 0); r != system.MOJO_RESULT_OK { |
+ if r, _ = hp.Wait(system.MOJO_HANDLE_SIGNAL_WRITABLE, system.MOJO_DEADLINE_INDEFINITE); r != system.MOJO_RESULT_OK { |
t.Fatalf("hp should be writeable:%v", r) |
} |
+ |
+ // Test one-phase read/write. |
+ // Writing. |
kHello := []byte("hello") |
r, numBytes := hp.WriteData(kHello, system.MOJO_WRITE_DATA_FLAG_NONE) |
if r != system.MOJO_RESULT_OK || numBytes != len(kHello) { |
t.Fatalf("Failed WriteData on hp:%v numBytes:%d", r, numBytes) |
} |
- if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, 1000); r != system.MOJO_RESULT_OK { |
+ // Reading. |
+ if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_DEADLINE_INDEFINITE); r != system.MOJO_RESULT_OK { |
t.Fatalf("hc should be readable after WriteData on hp:%v", r) |
} |
r, data := hc.ReadData(system.MOJO_READ_DATA_FLAG_NONE) |
@@ -205,10 +209,51 @@ func TestDataPipe(t *testing.T) { |
if !bytes.Equal(data, kHello) { |
t.Fatalf("Invalid data expected:%s, got:%s", kHello, data) |
} |
+ |
+ // Test two-phase read/write. |
+ // Writing. |
+ kHello = []byte("Hello, world!") |
+ r, buf := hp.BeginWriteData(len(kHello), system.MOJO_WRITE_DATA_FLAG_ALL_OR_NONE) |
+ if r != system.MOJO_RESULT_OK { |
+ t.Fatalf("Failed BeginWriteData on hp:%v numBytes:%d", r, len(kHello)) |
+ } |
+ if len(buf) < len(kHello) { |
+ t.Fatalf("Buffer size(%d) should be at least %d", len(buf), len(kHello)) |
+ } |
+ copy(buf, kHello) |
+ if r, _ := hp.WriteData(kHello, system.MOJO_WRITE_DATA_FLAG_NONE); r != system.MOJO_RESULT_BUSY { |
+ t.Fatalf("hp should be busy during a two-phase write: %v", r) |
+ } |
+ if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, 0); r != system.MOJO_RESULT_DEADLINE_EXCEEDED { |
+ t.Fatalf("hc shouldn't be readable before EndWriteData on hp:%v", r) |
+ } |
+ if r := hp.EndWriteData(len(kHello)); r != system.MOJO_RESULT_OK { |
+ t.Fatalf("Failed EndWriteData on hp:%v", r) |
+ } |
+ // Reading. |
+ if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_DEADLINE_INDEFINITE); r != system.MOJO_RESULT_OK { |
+ t.Fatalf("hc should be readable after EndWriteData on hp:%v", r) |
+ } |
+ if r, buf = hc.BeginReadData(len(kHello), system.MOJO_READ_DATA_FLAG_ALL_OR_NONE); r != system.MOJO_RESULT_OK { |
+ t.Fatalf("Failed BeginReadData on hc:%v numBytes:%d", r, len(kHello)) |
+ } |
+ if len(buf) != len(kHello) { |
+ t.Fatalf("Buffer size(%d) should be equal to %d", len(buf), len(kHello)) |
+ } |
+ if r, _ := hc.ReadData(system.MOJO_READ_DATA_FLAG_NONE); r != system.MOJO_RESULT_BUSY { |
+ t.Fatalf("hc should be busy during a two-phase read: %v", r) |
+ } |
+ if !bytes.Equal(buf, kHello) { |
+ t.Fatalf("Invalid data expected:%s, got:%s", kHello, buf) |
+ } |
+ if r := hc.EndReadData(len(buf)); r != system.MOJO_RESULT_OK { |
+ t.Fatalf("Failed EndReadData on hc:%v", r) |
+ } |
+ |
if r = hp.Close(); r != system.MOJO_RESULT_OK { |
t.Fatalf("Close on hp failed:%v", r) |
} |
- if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, 100); r != system.MOJO_RESULT_FAILED_PRECONDITION { |
+ if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_DEADLINE_INDEFINITE); r != system.MOJO_RESULT_FAILED_PRECONDITION { |
t.Fatalf("hc should not be readable after hp closed:%v", r) |
} |
if r = hc.Close(); r != system.MOJO_RESULT_OK { |