| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- package kernel_wg
- import (
- "context"
- "testing"
- "time"
- . "wartank/pkg/kernel/kernel_types"
- )
- type tester struct {
- t *testing.T
- ctx context.Context
- fnCancel func()
- wg IKernelWg
- }
- func TestKernelWG(t *testing.T) {
- ctxBg := context.Background()
- ctx, fnCancel := context.WithCancel(ctxBg)
- defer fnCancel()
- sf := &tester{
- t: t,
- ctx: ctx,
- fnCancel: fnCancel,
- }
- sf.new()
- sf.add()
- sf.done()
- sf.wait()
- sf.addBad3()
- }
- // Попытка добавления после закрытия ожидателя
- func (sf *tester) addBad3() {
- sf.t.Log("addBad3")
- err := sf.wg.Add("test_stream")
- if err == nil {
- sf.t.Fatalf("addBad3(): err==nil")
- }
- _len := sf.wg.Len()
- if _len != 0 {
- sf.t.Fatalf("addBad3(): len(%v)!=0", _len)
- }
- }
- // Убирает имя потока из ожидателя
- func (sf *tester) done() {
- sf.t.Log("done")
- sf.wg.Done("test_stream")
- lst := sf.wg.List()
- if len(lst) != 0 {
- sf.t.Fatalf("addBad1(): len(lst)!=0, lst=%#v", lst)
- }
- }
- // Добавление потока ожидания
- func (sf *tester) add() {
- sf.t.Log("add")
- sf.addGood1()
- sf.addBad1()
- sf.addBad2()
- }
- // Уже есть такое имя потока
- func (sf *tester) addBad2() {
- sf.t.Log("addBad2")
- defer func() {
- if _panic := recover(); _panic == nil {
- sf.t.Fatalf("addBad1(): panic==nil")
- }
- lst := sf.wg.List()
- if len(lst) != 1 {
- sf.t.Fatalf("addBad1(): len(lst)!=1, lst=%#v", lst)
- }
- }()
- _ = sf.wg.Add("test_stream")
- }
- // Пустое имя потока
- func (sf *tester) addBad1() {
- sf.t.Log("addBad1")
- defer func() {
- if _panic := recover(); _panic == nil {
- sf.t.Fatalf("addBad1(): panic==nil")
- }
- }()
- _ = sf.wg.Add("")
- }
- func (sf *tester) addGood1() {
- sf.t.Log("addGood1")
- err := sf.wg.Add("test_stream")
- if err != nil {
- sf.t.Fatalf("addGood1(): err=%v", err)
- }
- }
- // Ожидание завершения ожидателя потоков
- func (sf *tester) wait() {
- sf.t.Log("wait")
- go sf.wg.Wait()
- time.Sleep(time.Millisecond * 10)
- sf.fnCancel()
- time.Sleep(time.Millisecond * 10)
- if sf.wg.IsWork() {
- sf.t.Fatalf("wait(): isWork==true")
- }
- }
- // Создаёт ожидатель потоков ядра
- func (sf *tester) new() {
- sf.t.Log("new")
- sf.newBad1()
- sf.newGood1()
- }
- func (sf *tester) newGood1() {
- sf.t.Log("newGood1")
- defer func() {
- if _panic := recover(); _panic != nil {
- sf.t.Fatalf("newGood1(): panic=%v", _panic)
- }
- }()
- sf.wg = GetKernelWg(sf.ctx)
- if sf.wg == nil {
- sf.t.Fatalf("newGood1(): KernelWg==nil")
- }
- if !sf.wg.IsWork() {
- sf.t.Fatalf("wait(): isWork==false")
- }
- wg := GetKernelWg(sf.ctx)
- if sf.wg != wg {
- sf.t.Fatalf("newGood1(): bad IKernelWg")
- }
- }
- // Нет контекста ядра
- func (sf *tester) newBad1() {
- sf.t.Log("newBad1")
- defer func() {
- if _panic := recover(); _panic == nil {
- sf.t.Fatalf("newBad1(): panic=nil")
- }
- }()
- // defer sf.panicUse("newBad1(): ")
- var ctx context.Context
- _ = GetKernelWg(ctx)
- }
|