github.com/qxnw/lib4go@v0.0.0-20180426074627-c80c7e84b925/event/once_test.go (about)

     1  package event
     2  
     3  import "testing"
     4  import "fmt"
     5  import "time"
     6  
     7  // TestNewOnce 测试构建一次执行锁
     8  func TestNewOnce(t *testing.T) {
     9  	// 构建一个一次执行锁
    10  	_, err := NewOnce(1)
    11  	if err != nil {
    12  		t.Errorf("test fail %v", err)
    13  	}
    14  
    15  	_, err = NewOnce(-1)
    16  	if err == nil {
    17  		t.Error("test fail")
    18  	}
    19  
    20  	_, err = NewOnce(0)
    21  	if err == nil {
    22  		t.Error("test fail")
    23  	}
    24  }
    25  
    26  // TestWait 测试等待所有的任务执行
    27  func TestWait(t *testing.T) {
    28  	// 构建一个一次性执行锁
    29  	n := 3
    30  	sn, err := NewOnce(n)
    31  	if err != nil {
    32  		t.Errorf("test fail %v", err)
    33  	}
    34  
    35  	// 等待完成标志
    36  	isFinish := false
    37  
    38  	go func() {
    39  		sn.Wait()
    40  		isFinish = true
    41  	}()
    42  
    43  	for i := 0; i < n; i++ {
    44  		sn.Done(fmt.Sprintf("%d", i))
    45  		time.Sleep(time.Second)
    46  	}
    47  
    48  	if !isFinish {
    49  		t.Errorf("test fail")
    50  	}
    51  }
    52  
    53  // TestAddStep 测试添加步骤
    54  func TestAddStep(t *testing.T) {
    55  	// 构建一个一次性执行锁
    56  	n := 3
    57  	sn, err := NewOnce(n)
    58  	if err != nil {
    59  		t.Errorf("test fail %v", err)
    60  	}
    61  
    62  	// 等待完成标志
    63  	isFinish := false
    64  
    65  	go func() {
    66  		sn.Wait()
    67  		isFinish = true
    68  	}()
    69  
    70  	for i := 0; i < n; i++ {
    71  		if i == n-1 {
    72  			sn.AddStep(1)
    73  		}
    74  		sn.Done(fmt.Sprintf("%d", i))
    75  		time.Sleep(time.Second)
    76  	}
    77  
    78  	if isFinish {
    79  		t.Errorf("test fail")
    80  	}
    81  
    82  	sn.Done(time.Now().String())
    83  	time.Sleep(time.Second)
    84  
    85  	if !isFinish {
    86  		t.Error("test fail")
    87  	}
    88  }
    89  
    90  // TestWaitAndAdd 测试等待所有执行完成并添加新的任务
    91  func TestWaitAndAdd(t *testing.T) {
    92  	// 构建一个一次性执行锁
    93  	n := 3
    94  	sn, err := NewOnce(n)
    95  	if err != nil {
    96  		t.Errorf("test fail %v", err)
    97  	}
    98  
    99  	// 等待完成标志
   100  	isFinish := false
   101  
   102  	go func() {
   103  		sn.WaitAndAdd(1)
   104  		sn.Wait()
   105  		isFinish = true
   106  	}()
   107  
   108  	for i := 0; i < n; i++ {
   109  		sn.Done(fmt.Sprintf("%d", i))
   110  		time.Sleep(time.Second)
   111  	}
   112  
   113  	if isFinish {
   114  		t.Errorf("test fail")
   115  	}
   116  
   117  	sn.Done(time.Now().String())
   118  	time.Sleep(time.Second)
   119  
   120  	if !isFinish {
   121  		t.Error("test fail")
   122  	}
   123  }
   124  
   125  // TestClose 测试关闭
   126  func TestClose(t *testing.T) {
   127  	sn, err := NewOnce(3)
   128  	if err != nil {
   129  		t.Errorf("test fail %v", err)
   130  	}
   131  
   132  	sn.Done("1")
   133  	sn.Done("2")
   134  	if len(sn.actions) != 2 {
   135  		t.Error("test fail")
   136  	}
   137  	sn.Close()
   138  	if len(sn.actions) != 0 {
   139  		t.Error("test fail")
   140  	}
   141  }