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 }