|  | @@ -0,0 +1,70 @@
 | 
	
		
			
			|  | 1 | +package timeout_test
 | 
	
		
			
			|  | 2 | +
 | 
	
		
			
			|  | 3 | +import (
 | 
	
		
			
			|  | 4 | +	"sync"
 | 
	
		
			
			|  | 5 | +	"testing"
 | 
	
		
			
			|  | 6 | +	"time"
 | 
	
		
			
			|  | 7 | +
 | 
	
		
			
			|  | 8 | +	"git.links123.net/links123.com/pkg/timeout"
 | 
	
		
			
			|  | 9 | +)
 | 
	
		
			
			|  | 10 | +
 | 
	
		
			
			|  | 11 | +type ExcuteChan struct {
 | 
	
		
			
			|  | 12 | +	c    chan bool
 | 
	
		
			
			|  | 13 | +	once sync.Once
 | 
	
		
			
			|  | 14 | +}
 | 
	
		
			
			|  | 15 | +
 | 
	
		
			
			|  | 16 | +func Run(limit time.Duration, f func()) bool {
 | 
	
		
			
			|  | 17 | +	done := make(chan bool)
 | 
	
		
			
			|  | 18 | +
 | 
	
		
			
			|  | 19 | +	go func() {
 | 
	
		
			
			|  | 20 | +		f()
 | 
	
		
			
			|  | 21 | +		done <- true
 | 
	
		
			
			|  | 22 | +		close(done)
 | 
	
		
			
			|  | 23 | +	}()
 | 
	
		
			
			|  | 24 | +
 | 
	
		
			
			|  | 25 | +	select {
 | 
	
		
			
			|  | 26 | +	case <-time.After(limit):
 | 
	
		
			
			|  | 27 | +		return false
 | 
	
		
			
			|  | 28 | +	case <-done:
 | 
	
		
			
			|  | 29 | +		return true
 | 
	
		
			
			|  | 30 | +	}
 | 
	
		
			
			|  | 31 | +}
 | 
	
		
			
			|  | 32 | +
 | 
	
		
			
			|  | 33 | +func Run1(limit time.Duration, f func()) bool {
 | 
	
		
			
			|  | 34 | +	ec := &ExcuteChan{c: make(chan bool), once: sync.Once{}}
 | 
	
		
			
			|  | 35 | +
 | 
	
		
			
			|  | 36 | +	go func() {
 | 
	
		
			
			|  | 37 | +		f()
 | 
	
		
			
			|  | 38 | +		ec.once.Do(func() {
 | 
	
		
			
			|  | 39 | +			ec.c <- true
 | 
	
		
			
			|  | 40 | +			close(ec.c)
 | 
	
		
			
			|  | 41 | +		})
 | 
	
		
			
			|  | 42 | +	}()
 | 
	
		
			
			|  | 43 | +
 | 
	
		
			
			|  | 44 | +	select {
 | 
	
		
			
			|  | 45 | +	case <-time.After(limit):
 | 
	
		
			
			|  | 46 | +		return false
 | 
	
		
			
			|  | 47 | +	case <-ec.c:
 | 
	
		
			
			|  | 48 | +		return true
 | 
	
		
			
			|  | 49 | +	}
 | 
	
		
			
			|  | 50 | +}
 | 
	
		
			
			|  | 51 | +
 | 
	
		
			
			|  | 52 | +func TestRun(t *testing.T) {
 | 
	
		
			
			|  | 53 | +	// timeout: OK
 | 
	
		
			
			|  | 54 | +	if !timeout.Run(1*time.Second, func() {
 | 
	
		
			
			|  | 55 | +		time.Sleep(2 * time.Second)
 | 
	
		
			
			|  | 56 | +	}) {
 | 
	
		
			
			|  | 57 | +		t.Log("time out: OK")
 | 
	
		
			
			|  | 58 | +	} else {
 | 
	
		
			
			|  | 59 | +		t.Fatal("time out: FAILED")
 | 
	
		
			
			|  | 60 | +	}
 | 
	
		
			
			|  | 61 | +
 | 
	
		
			
			|  | 62 | +	// timeout: FAILED
 | 
	
		
			
			|  | 63 | +	if !timeout.Run(3*time.Second, func() {
 | 
	
		
			
			|  | 64 | +		time.Sleep(2 * time.Second)
 | 
	
		
			
			|  | 65 | +	}) {
 | 
	
		
			
			|  | 66 | +		t.Log("time out: OK")
 | 
	
		
			
			|  | 67 | +	} else {
 | 
	
		
			
			|  | 68 | +		t.Fatal("time out: FAILED")
 | 
	
		
			
			|  | 69 | +	}
 | 
	
		
			
			|  | 70 | +}
 |