blob: ab2ef74f4333279314aa9701f6226a7efa43dc08 [file] [log] [blame]
//Copyright 2017 Huawei Technologies Co., Ltd
//
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
package util
import (
"fmt"
"sync"
"testing"
"time"
)
func TestGoRoutine_Init(t *testing.T) {
var test GoRoutine
stopCh1 := make(chan struct{})
defer close(stopCh1)
stopCh2 := make(chan struct{})
defer close(stopCh2)
test.Init(stopCh1)
c := test.StopCh()
if c != stopCh1 {
fmt.Println("init GoRoutine failed.")
t.Fail()
}
test.Init(stopCh2)
c = test.StopCh()
if c == stopCh2 {
fmt.Println("init GoRoutine twice.")
t.Fail()
}
}
func TestGoRoutine_Do(t *testing.T) {
var test1 GoRoutine
stopCh := make(chan struct{})
test1.Init(make(chan struct{}))
test1.Do(func(neverStopCh <-chan struct{}) {
defer close(stopCh)
select {
case <-neverStopCh:
fmt.Println("neverStopCh should not be closed.")
t.Fail()
case <-time.After(time.Second):
}
})
<-stopCh
var test2 GoRoutine
stopCh1 := make(chan struct{})
stopCh2 := make(chan struct{})
test2.Init(stopCh1)
test2.Do(func(stopCh <-chan struct{}) {
defer close(stopCh2)
select {
case <-stopCh:
case <-time.After(time.Second):
fmt.Println("time out to wait stopCh1 close.")
t.Fail()
}
})
close(stopCh1)
<-stopCh2
}
func TestGoRoutine_Wait(t *testing.T) {
var test GoRoutine
var mux sync.Mutex
MAX := 10
resultArr := make([]int, 0, MAX)
test.Init(make(chan struct{}))
for i := 0; i < MAX; i++ {
func(i int) {
test.Do(func(neverStopCh <-chan struct{}) {
select {
case <-neverStopCh:
case <-time.After(time.Second):
mux.Lock()
resultArr = append(resultArr, i)
fmt.Printf("goroutine %d finish.\n", i)
mux.Unlock()
}
})
}(i)
}
fmt.Println("waiting for all goroutines finish.")
test.Wait()
fmt.Println(resultArr)
if len(resultArr) != MAX {
fmt.Println("fail to wait all goroutines finish.")
t.Fail()
}
}
func TestGoRoutine_Close(t *testing.T) {
var test GoRoutine
test.Init(make(chan struct{}))
test.Do(func(stopCh <-chan struct{}) {
select {
case <-stopCh:
case <-time.After(time.Second):
fmt.Println("time out to wait stopCh close.")
t.Fail()
}
})
test.Close(true)
test.Close(true)
}
func TestGo(t *testing.T) {
GoInit()
Go(func(stopCh <-chan struct{}) {
for {
select {
case <-stopCh:
return
case <-time.After(time.Second):
}
}
})
GoCloseAndWait()
}
func TestNewGo(t *testing.T) {
g := NewGo(make(chan struct{}))
defer g.Close(true)
}