kernel_wg_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package kernel_wg
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. . "wartank/kernel/kernel_types"
  7. )
  8. type tester struct {
  9. t *testing.T
  10. ctx context.Context
  11. fnCancel func()
  12. wg IKernelWg
  13. }
  14. func TestKernelWG(t *testing.T) {
  15. ctxBg := context.Background()
  16. ctx, fnCancel := context.WithCancel(ctxBg)
  17. defer fnCancel()
  18. sf := &tester{
  19. t: t,
  20. ctx: ctx,
  21. fnCancel: fnCancel,
  22. }
  23. sf.new()
  24. sf.add()
  25. sf.done()
  26. sf.wait()
  27. sf.addBad3()
  28. }
  29. // Попытка добавления после закрытия ожидателя
  30. func (sf *tester) addBad3() {
  31. sf.t.Log("addBad3")
  32. err := sf.wg.Add("test_stream")
  33. if err == nil {
  34. sf.t.Fatalf("addBad3(): err==nil")
  35. }
  36. _len := sf.wg.Len()
  37. if _len != 0 {
  38. sf.t.Fatalf("addBad3(): len(%v)!=0", _len)
  39. }
  40. }
  41. // Убирает имя потока из ожидателя
  42. func (sf *tester) done() {
  43. sf.t.Log("done")
  44. sf.wg.Done("test_stream")
  45. lst := sf.wg.List()
  46. if len(lst) != 0 {
  47. sf.t.Fatalf("addBad1(): len(lst)!=0, lst=%#v", lst)
  48. }
  49. }
  50. // Добавление потока ожидания
  51. func (sf *tester) add() {
  52. sf.t.Log("add")
  53. sf.addGood1()
  54. sf.addBad1()
  55. sf.addBad2()
  56. }
  57. // Уже есть такое имя потока
  58. func (sf *tester) addBad2() {
  59. sf.t.Log("addBad2")
  60. defer func() {
  61. if _panic := recover(); _panic == nil {
  62. sf.t.Fatalf("addBad1(): panic==nil")
  63. }
  64. lst := sf.wg.List()
  65. if len(lst) != 1 {
  66. sf.t.Fatalf("addBad1(): len(lst)!=1, lst=%#v", lst)
  67. }
  68. }()
  69. _ = sf.wg.Add("test_stream")
  70. }
  71. // Пустое имя потока
  72. func (sf *tester) addBad1() {
  73. sf.t.Log("addBad1")
  74. defer func() {
  75. if _panic := recover(); _panic == nil {
  76. sf.t.Fatalf("addBad1(): panic==nil")
  77. }
  78. }()
  79. _ = sf.wg.Add("")
  80. }
  81. func (sf *tester) addGood1() {
  82. sf.t.Log("addGood1")
  83. err := sf.wg.Add("test_stream")
  84. if err != nil {
  85. sf.t.Fatalf("addGood1(): err=%v", err)
  86. }
  87. }
  88. // Ожидание завершения ожидателя потоков
  89. func (sf *tester) wait() {
  90. sf.t.Log("wait")
  91. go sf.wg.Wait()
  92. time.Sleep(time.Millisecond * 10)
  93. sf.fnCancel()
  94. time.Sleep(time.Millisecond * 10)
  95. if sf.wg.IsWork() {
  96. sf.t.Fatalf("wait(): isWork==true")
  97. }
  98. }
  99. // Создаёт ожидатель потоков ядра
  100. func (sf *tester) new() {
  101. sf.t.Log("new")
  102. sf.newBad1()
  103. sf.newGood1()
  104. }
  105. func (sf *tester) newGood1() {
  106. sf.t.Log("newGood1")
  107. defer func() {
  108. if _panic := recover(); _panic != nil {
  109. sf.t.Fatalf("newGood1(): panic=%v", _panic)
  110. }
  111. }()
  112. sf.wg = GetKernelWg(sf.ctx)
  113. if sf.wg == nil {
  114. sf.t.Fatalf("newGood1(): KernelWg==nil")
  115. }
  116. if !sf.wg.IsWork() {
  117. sf.t.Fatalf("wait(): isWork==false")
  118. }
  119. wg := GetKernelWg(sf.ctx)
  120. if sf.wg != wg {
  121. sf.t.Fatalf("newGood1(): bad IKernelWg")
  122. }
  123. }
  124. // Нет контекста ядра
  125. func (sf *tester) newBad1() {
  126. sf.t.Log("newBad1")
  127. defer func() {
  128. if _panic := recover(); _panic == nil {
  129. sf.t.Fatalf("newBad1(): panic=nil")
  130. }
  131. }()
  132. // defer sf.panicUse("newBad1(): ")
  133. var ctx context.Context
  134. _ = GetKernelWg(ctx)
  135. }