]> Cypherpunks repositories - gostls13.git/commitdiff
add test for non-blocking channel ops
authorRob Pike <r@golang.org>
Wed, 16 Jul 2008 21:41:27 +0000 (14:41 -0700)
committerRob Pike <r@golang.org>
Wed, 16 Jul 2008 21:41:27 +0000 (14:41 -0700)
SVN=127595

test/chan/nonblock.go [new file with mode: 0644]

diff --git a/test/chan/nonblock.go b/test/chan/nonblock.go
new file mode 100644 (file)
index 0000000..4a6857d
--- /dev/null
@@ -0,0 +1,107 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 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.
+
+// Verify channel operations that test for blocking
+// Use several sizes and types of operands
+
+package main
+
+func pause() {
+       for i:=0; i<100; i++ { sys.gosched() }
+}
+
+func i32receiver(c *chan int32) {
+       <-c
+}
+
+func i32sender(c *chan int32) {
+       c -< 1
+}
+
+func i64receiver(c *chan int64) {
+       <-c
+}
+
+func i64sender(c *chan int64) {
+       c -< 1
+}
+
+func breceiver(c *chan bool) {
+       <-c
+}
+
+func bsender(c *chan bool) {
+       c -< true
+}
+
+func sreceiver(c *chan string) {
+       <-c
+}
+
+func ssender(c *chan string) {
+       c -< "hi"
+}
+
+func main() {
+       var i32 int32;
+       var i64 int64;
+       var b bool;
+       var s string;
+       var ok bool;
+
+       c32 := new(chan int32);
+       c64 := new(chan int64);
+       cb := new(chan bool);
+       cs := new(chan string);
+
+       i32, ok = <-c32;
+       if ok { panic "blocked i32sender" }
+
+       i64, ok = <-c64;
+       if ok { panic "blocked i64sender" }
+
+       b, ok = <-cb;
+       if ok { panic "blocked bsender" }
+
+       s, ok = <-cs;
+       if ok { panic "blocked ssender" }
+
+       go i32receiver(c32);
+       pause();
+       ok = c32 -< 1;
+       if !ok { panic "i32receiver" }
+       go i32sender(c32);
+       pause();
+       i32, ok = <-c32;
+       if !ok { panic "i32sender" }
+
+       go i64receiver(c64);
+       pause();
+       ok = c64 -< 1;
+       if !ok { panic "i64receiver" }
+       go i64sender(c64);
+       pause();
+       i64, ok = <-c64;
+       if !ok { panic "i64sender" }
+
+       go breceiver(cb);
+       pause();
+       ok = cb -< true;
+       if !ok { panic "breceiver" }
+       go bsender(cb);
+       pause();
+       b, ok = <-cb;
+       if !ok { panic "bsender" }
+
+       go sreceiver(cs);
+       pause();
+       ok = cs -< "hi";
+       if !ok { panic "sreceiver" }
+       go ssender(cs);
+       pause();
+       s, ok = <-cs;
+       if !ok { panic "ssender" }
+}