// Copyright 2011 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. package cgotest /* // mysleep returns the absolute start time in ms. long long mysleep(int seconds); // twoSleep returns the absolute start time of the first sleep // in ms. long long twoSleep(int); */ import "C" import ( "testing" "time" ) var sleepDone = make(chan int64) // parallelSleep returns the absolute difference between the start time // of the two sleeps. func parallelSleep(n int) int64 { t := int64(C.twoSleep(C.int(n))) - <-sleepDone if t < 0 { return -t } return t } //export BackgroundSleep func BackgroundSleep(n int32) { go func() { sleepDone <- int64(C.mysleep(C.int(n))) }() } func testParallelSleep(t *testing.T) { sleepSec := 1 dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt) // bug used to run sleeps in serial, producing a 2*sleepSec-second delay. // we detect if the start times of those sleeps are > 0.5*sleepSec-second. if dt >= time.Duration(sleepSec)*time.Second/2 { t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds()) } }