diff options
Diffstat (limited to 'test/chancap.go')
-rw-r--r-- | test/chancap.go | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/test/chancap.go b/test/chancap.go new file mode 100644 index 0000000..8dce924 --- /dev/null +++ b/test/chancap.go @@ -0,0 +1,71 @@ +// run + +// 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. + +// Test the cap predeclared function applied to channels. + +package main + +import ( + "strings" + "unsafe" +) + +type T chan int + +const ptrSize = unsafe.Sizeof((*byte)(nil)) + +func main() { + c := make(T, 10) + if len(c) != 0 || cap(c) != 10 { + println("chan len/cap ", len(c), cap(c), " want 0 10") + panic("fail") + } + + for i := 0; i < 3; i++ { + c <- i + } + if len(c) != 3 || cap(c) != 10 { + println("chan len/cap ", len(c), cap(c), " want 3 10") + panic("fail") + } + + c = make(T) + if len(c) != 0 || cap(c) != 0 { + println("chan len/cap ", len(c), cap(c), " want 0 0") + panic("fail") + } + + n := -1 + shouldPanic("makechan: size out of range", func() { _ = make(T, n) }) + shouldPanic("makechan: size out of range", func() { _ = make(T, int64(n)) }) + if ptrSize == 8 { + // Test mem > maxAlloc + var n2 int64 = 1 << 59 + shouldPanic("makechan: size out of range", func() { _ = make(T, int(n2)) }) + // Test elem.size*cap overflow + n2 = 1<<63 - 1 + shouldPanic("makechan: size out of range", func() { _ = make(T, int(n2)) }) + } else { + n = 1<<31 - 1 + shouldPanic("makechan: size out of range", func() { _ = make(T, n) }) + shouldPanic("makechan: size out of range", func() { _ = make(T, int64(n)) }) + } +} + +func shouldPanic(str string, f func()) { + defer func() { + err := recover() + if err == nil { + panic("did not panic") + } + s := err.(error).Error() + if !strings.Contains(s, str) { + panic("got panic " + s + ", want " + str) + } + }() + + f() +} |