kbus_http_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. package kbus_http
  2. import (
  3. "encoding/json"
  4. "io"
  5. "net/http"
  6. "os"
  7. "strings"
  8. "testing"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_pub"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_serve"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_sub"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_unsub"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kserv_http"
  15. . "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
  16. "gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
  17. "gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_serve"
  18. "gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_local"
  19. )
  20. type tester struct {
  21. t *testing.T
  22. handSub *mock_hand_sub_local.MockHandlerSub
  23. handServ *mock_hand_serve.MockHandlerServe
  24. }
  25. func TestKernelBusHttp(t *testing.T) {
  26. sf := &tester{
  27. t: t,
  28. handSub: mock_hand_sub_local.NewMockHandlerSub("topic_sub", "http://localhost:18200/bus/pub"),
  29. handServ: mock_hand_serve.NewMockHandlerServe("topic_serv", "name_serv"),
  30. }
  31. ctx := kctx.GetKernelCtx()
  32. ctx.Set("monolitName", "test_monolit", "comment")
  33. sf.get()
  34. sf.req()
  35. sf.sub()
  36. sf.pub()
  37. sf.unsub()
  38. }
  39. // Запрос на отписку
  40. func (sf *tester) unsub() {
  41. sf.t.Log("unsub")
  42. sf.unsubBad1()
  43. sf.unsubBad2()
  44. sf.unsubGood1()
  45. sf.unsubBad3()
  46. sf.unsubGood2()
  47. }
  48. func (sf *tester) unsubGood2() {
  49. sf.t.Log("unsubGood2")
  50. res := Bus_.Subscribe(sf.handSub)
  51. if res.IsErr() {
  52. sf.t.Fatalf("unsubGood1(): err=%v", res.Err())
  53. }
  54. req := &msg_unsub.UnsubReq{
  55. Name_: sf.handSub.Name_,
  56. Uuid_: "test_uuid",
  57. }
  58. binReq, _ := json.MarshalIndent(req, "", " ")
  59. body := strings.NewReader(string(binReq))
  60. resServ := kserv_http.GetKernelServHttp()
  61. fibApp := resServ.Hassert("unsubGood2").Fiber()
  62. hReq, err := http.NewRequest("POST", "/bus/unsub", body)
  63. if err != nil {
  64. sf.t.Fatalf("unsubGood2(): err=%v", err)
  65. }
  66. hReq.Header.Add("Content-Type", "application/json")
  67. _resp, err := fibApp.Test(hReq)
  68. if err != nil {
  69. sf.t.Fatalf("unsubGood2(): after request, err=%v", err)
  70. }
  71. if _resp.StatusCode != 200 {
  72. sf.t.Fatalf("unsubGood2(): statusCode(%v)!=200", _resp.StatusCode)
  73. }
  74. defer _resp.Body.Close()
  75. binBody, _ := io.ReadAll(_resp.Body)
  76. resp := &msg_unsub.UnsubResp{}
  77. err = json.Unmarshal(binBody, resp)
  78. if err != nil {
  79. sf.t.Fatalf("unsubGood2(): err=%v", err)
  80. }
  81. if string(resp.Status_) != "ok" {
  82. sf.t.Fatalf("unsubGood2(): resp(%v)!='ok'", string(resp.Status_))
  83. }
  84. }
  85. // Кривой запрос
  86. func (sf *tester) unsubBad3() {
  87. sf.t.Log("unsubBad3")
  88. req := "tra-la-la"
  89. binReq, _ := json.MarshalIndent(req, "", " ")
  90. body := strings.NewReader(string(binReq))
  91. resServ := kserv_http.GetKernelServHttp()
  92. fibApp := resServ.Hassert("unsubBad3").Fiber()
  93. hReq, err := http.NewRequest("POST", "/bus/unsub", body)
  94. hReq.Header.Add("Content-Type", "application/json")
  95. if err != nil {
  96. sf.t.Fatalf("unsubBad3(): err=%v", err)
  97. }
  98. _resp, err := fibApp.Test(hReq)
  99. if err != nil {
  100. sf.t.Fatalf("unsubBad3(): after request, err=%v", err)
  101. }
  102. if _resp.StatusCode == 200 {
  103. sf.t.Fatalf("unsubBad3(): statusCode(%v)==200", _resp.StatusCode)
  104. }
  105. }
  106. func (sf *tester) unsubGood1() {
  107. sf.t.Log("unsubGood1")
  108. res := Bus_.Subscribe(sf.handSub)
  109. if res.IsErr() {
  110. sf.t.Fatalf("unsubGood1(): err=%v", res.Err())
  111. }
  112. count := 0
  113. for count < 100 {
  114. SleepMs()
  115. count++
  116. }
  117. req := &msg_unsub.UnsubReq{
  118. Name_: sf.handSub.Name_,
  119. Uuid_: "test_uuid",
  120. }
  121. resp := Bus_.processUnsubRequest(req)
  122. if resp.Status_ != "ok" {
  123. sf.t.Fatalf("unsubGood1(): status(%v)!='ok'", resp.Status_)
  124. }
  125. }
  126. // Все поля на месте, нет подписчика
  127. func (sf *tester) unsubBad2() {
  128. sf.t.Log("unsubBad2")
  129. Bus_.Unsubscribe(sf.handSub)
  130. count := 0
  131. for count < 100 {
  132. SleepMs()
  133. count++
  134. }
  135. req := &msg_unsub.UnsubReq{
  136. Name_: sf.handSub.Name_,
  137. Uuid_: "test_uuid",
  138. }
  139. resp := Bus_.processUnsubRequest(req)
  140. if resp.Status_ == "ok" {
  141. sf.t.Fatalf("unsubBad2(): status(%v)=='ok'", resp.Status_)
  142. }
  143. }
  144. // Нет полей для процесса отписки
  145. func (sf *tester) unsubBad1() {
  146. sf.t.Log("unsubBad1")
  147. defer func() {
  148. if _panic := recover(); _panic == nil {
  149. sf.t.Fatalf("unsubBad1(): panic==nil")
  150. }
  151. }()
  152. req := &msg_unsub.UnsubReq{}
  153. _ = Bus_.processUnsubRequest(req)
  154. }
  155. // Запрос на публикацию
  156. func (sf *tester) pub() {
  157. sf.t.Log("pub")
  158. sf.pubBad1()
  159. sf.pubGood1()
  160. sf.pubBad2()
  161. sf.pubBad3()
  162. sf.pubGood2()
  163. }
  164. func (sf *tester) pubGood2() {
  165. sf.t.Log("pubGood2")
  166. req := &msg_pub.PublishReq{
  167. Topic_: "topic_sub",
  168. Uuid_: "test_uuid",
  169. BinMsg_: []byte("http_pub"),
  170. }
  171. binReq, _ := json.MarshalIndent(req, "", " ")
  172. body := strings.NewReader(string(binReq))
  173. resServ := kserv_http.GetKernelServHttp()
  174. fibApp := resServ.Hassert("pubGood2").Fiber()
  175. hReq, err := http.NewRequest("POST", "/bus/pub", body)
  176. hReq.Header.Add("Content-Type", "application/json")
  177. if err != nil {
  178. sf.t.Fatalf("pubGood2(): err=%v", err)
  179. }
  180. _resp, err := fibApp.Test(hReq)
  181. if err != nil {
  182. sf.t.Fatalf("pubGood2(): after request, err=%v", err)
  183. }
  184. if _resp.StatusCode != 200 {
  185. sf.t.Fatalf("pubGood2(): statusCode(%v)!=200", _resp.StatusCode)
  186. }
  187. defer _resp.Body.Close()
  188. binBody, _ := io.ReadAll(_resp.Body)
  189. resp := &msg_pub.PublishResp{}
  190. err = json.Unmarshal(binBody, resp)
  191. if err != nil {
  192. sf.t.Fatalf("pubGood2(): err=%v", err)
  193. }
  194. if string(resp.Status_) != "ok" {
  195. sf.t.Fatalf("pubGood2(): resp(%v)!='ok'", string(resp.Status_))
  196. }
  197. }
  198. // Кривой запрос
  199. func (sf *tester) pubBad3() {
  200. sf.t.Log("pubBad3")
  201. req := "tra-la-la"
  202. binReq, _ := json.MarshalIndent(req, "", " ")
  203. body := strings.NewReader(string(binReq))
  204. resServ := kserv_http.GetKernelServHttp()
  205. fibApp := resServ.Hassert("pubBad3").Fiber()
  206. hReq, err := http.NewRequest("POST", "/bus/pub", body)
  207. hReq.Header.Add("Content-Type", "application/json")
  208. if err != nil {
  209. sf.t.Fatalf("pubBad3(): err=%v", err)
  210. }
  211. _resp, err := fibApp.Test(hReq)
  212. if err != nil {
  213. sf.t.Fatalf("pubBad3(): after request, err=%v", err)
  214. }
  215. if _resp.StatusCode == 200 {
  216. sf.t.Fatalf("pubBad3(): statusCode(%v)==200", _resp.StatusCode)
  217. }
  218. }
  219. // Что-то случилось внутри шины
  220. func (sf *tester) pubBad2() {
  221. sf.t.Log("pubBad2")
  222. Bus_.IsWork_.Reset()
  223. defer Bus_.IsWork_.Set()
  224. req := &msg_pub.PublishReq{
  225. Topic_: "topic_sub",
  226. Uuid_: "test_uuid",
  227. BinMsg_: []byte("test_pub"),
  228. }
  229. resp := Bus_.processPublish(req)
  230. if resp.Status_ == "ok" {
  231. sf.t.Fatalf("pubBad2(): status(%v)=='ok'", resp.Status_)
  232. }
  233. }
  234. // Все поля на месте
  235. func (sf *tester) pubGood1() {
  236. sf.t.Log("pubGood1")
  237. res := Bus_.Subscribe(sf.handSub)
  238. if res.IsErr() {
  239. sf.t.Fatalf("pubGood1(): err=%v", res.Err())
  240. }
  241. req := &msg_pub.PublishReq{
  242. Topic_: "topic_sub",
  243. Uuid_: "test_uuid",
  244. BinMsg_: []byte("test_pub"),
  245. }
  246. _ = Bus_.processPublish(req)
  247. for {
  248. SleepMs()
  249. msg := string(sf.handSub.Msg())
  250. if msg != "" {
  251. break
  252. }
  253. }
  254. msg := string(sf.handSub.Msg())
  255. if msg != "test_pub" {
  256. sf.t.Fatalf("pubGood1(): msg(%v)!='test_pub'", msg)
  257. }
  258. }
  259. // Нет полей для процесса публикации
  260. func (sf *tester) pubBad1() {
  261. sf.t.Log("pubBad1")
  262. defer func() {
  263. if _panic := recover(); _panic == nil {
  264. sf.t.Fatalf("pubBad1(): panic==nil")
  265. }
  266. }()
  267. req := &msg_pub.PublishReq{}
  268. _ = Bus_.processPublish(req)
  269. }
  270. // Запрос подписки на топик
  271. func (sf *tester) sub() {
  272. sf.t.Log("sub")
  273. sf.subBad1()
  274. sf.subBad2()
  275. sf.subGood1()
  276. sf.subBad3()
  277. sf.subGood2()
  278. }
  279. // Полный процесс подписки
  280. func (sf *tester) subGood2() {
  281. sf.t.Log("subGood2")
  282. req := &msg_sub.SubscribeReq{
  283. Topic_: "topic_serv",
  284. Uuid_: "test_uuid",
  285. WebHook_: "http://localhost:18200/bus/pub/",
  286. }
  287. binReq, _ := json.MarshalIndent(req, "", " ")
  288. body := strings.NewReader(string(binReq))
  289. resServ := kserv_http.GetKernelServHttp()
  290. fibApp := resServ.Hassert("subGood2").Fiber()
  291. hReq, err := http.NewRequest("POST", "/bus/sub", body)
  292. hReq.Header.Add("Content-Type", "application/json")
  293. if err != nil {
  294. sf.t.Fatalf("subBad1(): err=%v", err)
  295. }
  296. _resp, err := fibApp.Test(hReq)
  297. if err != nil {
  298. sf.t.Fatalf("subBad1(): after request, err=%v", err)
  299. }
  300. if _resp.StatusCode != 200 {
  301. sf.t.Fatalf("subBad1(): statusCode(%v)!=200", _resp.StatusCode)
  302. }
  303. defer _resp.Body.Close()
  304. binBody, _ := io.ReadAll(_resp.Body)
  305. resp := &msg_sub.SubscribeResp{}
  306. err = json.Unmarshal(binBody, resp)
  307. if err != nil {
  308. sf.t.Fatalf("subBad1(): err=%v", err)
  309. }
  310. if string(resp.Status_) != "ok" {
  311. sf.t.Fatalf("subBad1(): resp(%v)!='ok'", string(resp.Status_))
  312. }
  313. }
  314. // Отключена базовая шина
  315. func (sf *tester) subBad3() {
  316. sf.t.Log("subBad3")
  317. req := &msg_sub.SubscribeReq{
  318. Topic_: "topic_serv",
  319. Uuid_: "test_uuid",
  320. WebHook_: "http://localhost:18200/bus/pub/",
  321. }
  322. defer func() {
  323. if _panic := recover(); _panic != nil {
  324. sf.t.Fatalf("subBad3(): panic!=nil")
  325. }
  326. }()
  327. // _bus := kernel_bus_base.GetKernelBusBase()
  328. Bus_.IsWork_.Reset()
  329. defer Bus_.IsWork_.Set()
  330. resp := Bus_.processSubscribe(req)
  331. if resp.Status_ == "ok" {
  332. sf.t.Fatalf("subBad3(): resp==ok")
  333. }
  334. }
  335. // Проверка полей запроса в процессе подписки
  336. func (sf *tester) subGood1() {
  337. sf.t.Log("subGood1")
  338. req := &msg_sub.SubscribeReq{
  339. Topic_: "topic_serv",
  340. Uuid_: "test_uuid",
  341. WebHook_: "http://localhost:18200/bus/",
  342. }
  343. defer func() {
  344. if _panic := recover(); _panic != nil {
  345. sf.t.Fatalf("subGood1(): panic!=nil")
  346. }
  347. }()
  348. _ = Bus_.processSubscribe(req)
  349. }
  350. // Проверка кривых полей запроса в процессе подписки
  351. func (sf *tester) subBad2() {
  352. sf.t.Log("subBad2")
  353. req := &msg_sub.SubscribeReq{
  354. Topic_: "",
  355. }
  356. defer func() {
  357. if _panic := recover(); _panic == nil {
  358. sf.t.Fatalf("subBad2(): panic==nil")
  359. }
  360. }()
  361. _ = Bus_.processSubscribe(req)
  362. }
  363. // Кривой запрос
  364. func (sf *tester) subBad1() {
  365. sf.t.Log("subBad1")
  366. req := "tra-ta-ta"
  367. binReq, _ := json.MarshalIndent(req, "", " ")
  368. body := strings.NewReader(string(binReq))
  369. resServ := kserv_http.GetKernelServHttp()
  370. fibApp := resServ.Hassert("subBad1").Fiber()
  371. hReq, err := http.NewRequest("POST", "/bus/sub", body)
  372. hReq.Header.Add("Content-Type", "application/json")
  373. if err != nil {
  374. sf.t.Fatalf("subBad1(): err=%v", err)
  375. }
  376. _resp, err := fibApp.Test(hReq)
  377. if err != nil {
  378. sf.t.Fatalf("subBad1(): after request, err=%v", err)
  379. }
  380. if _resp.StatusCode != 400 {
  381. sf.t.Fatalf("subBad1(): statusCode(%v)!=400", _resp.StatusCode)
  382. }
  383. }
  384. // Входящий запрос
  385. func (sf *tester) req() {
  386. sf.t.Log("req")
  387. sf.reqBad1()
  388. sf.reqBad2()
  389. sf.reqBad3()
  390. sf.reqGood1()
  391. sf.reqBad4()
  392. }
  393. // Что-то с обработчиком
  394. func (sf *tester) reqBad4() {
  395. sf.t.Log("reqBad4")
  396. sf.handServ.IsBad_.Set()
  397. defer sf.handServ.IsBad_.Reset()
  398. req := &msg_serve.ServeReq{
  399. Topic_: sf.handServ.Topic_,
  400. Uuid_: "test_uuid",
  401. BinReq_: []byte("test_msg"),
  402. }
  403. binReq, _ := json.MarshalIndent(req, "", " ")
  404. body := strings.NewReader(string(binReq))
  405. resServ := kserv_http.GetKernelServHttp()
  406. fibApp := resServ.Hassert("reqBad4").Fiber()
  407. hReq, err := http.NewRequest("POST", "/bus/request", body)
  408. hReq.Header.Add("Content-Type", "application/json")
  409. if err != nil {
  410. sf.t.Fatalf("reqBad4(): err=%v", err)
  411. }
  412. _resp, err := fibApp.Test(hReq)
  413. if err != nil {
  414. sf.t.Fatalf("reqBad4(): after request, err=%v", err)
  415. }
  416. if _resp.StatusCode != 200 {
  417. sf.t.Fatalf("reqBad4(): statusCode(%v)!=200", _resp.StatusCode)
  418. }
  419. defer _resp.Body.Close()
  420. binBody, _ := io.ReadAll(_resp.Body)
  421. resp := &msg_serve.ServeResp{}
  422. err = json.Unmarshal(binBody, resp)
  423. if err != nil {
  424. sf.t.Fatalf("reqBad4(): err=%v", err)
  425. }
  426. if string(resp.Status_) == "ok" {
  427. sf.t.Fatalf("reqBad4(): status(%v)=='ok'", string(resp.Status_))
  428. }
  429. }
  430. func (sf *tester) reqGood1() {
  431. sf.t.Log("reqGood1")
  432. req := &msg_serve.ServeReq{
  433. Topic_: sf.handServ.Topic_,
  434. Uuid_: "test_uuid",
  435. BinReq_: []byte("test_msg"),
  436. }
  437. binReq, _ := json.MarshalIndent(req, "", " ")
  438. body := strings.NewReader(string(binReq))
  439. resServ := kserv_http.GetKernelServHttp()
  440. fibApp := resServ.Hassert("reqGood1").Fiber()
  441. hReq, err := http.NewRequest("POST", "/bus/request", body)
  442. hReq.Header.Add("Content-Type", "application/json")
  443. if err != nil {
  444. sf.t.Fatalf("reqGood1(): err=%v", err)
  445. }
  446. _resp, err := fibApp.Test(hReq)
  447. if err != nil {
  448. sf.t.Fatalf("reqGood1(): after request, err=%v", err)
  449. }
  450. if _resp.StatusCode != 200 {
  451. sf.t.Fatalf("reqGood1(): statusCode(%v)!=200", _resp.StatusCode)
  452. }
  453. defer _resp.Body.Close()
  454. binBody, _ := io.ReadAll(_resp.Body)
  455. resp := &msg_serve.ServeResp{}
  456. err = json.Unmarshal(binBody, resp)
  457. if err != nil {
  458. sf.t.Fatalf("reqGood1(): err=%v", err)
  459. }
  460. if string(resp.BinResp_) != "test_msg" {
  461. sf.t.Fatalf("reqGood1(): resp(%v)!='test_msg'", string(resp.BinResp_))
  462. }
  463. }
  464. // Нет такого топика для запросов
  465. func (sf *tester) reqBad3() {
  466. sf.t.Log("reqBad3")
  467. req := &msg_serve.ServeReq{
  468. Topic_: "bad_topic",
  469. Uuid_: "test_uuid",
  470. BinReq_: []byte("test_msg"),
  471. }
  472. binReq, _ := json.MarshalIndent(req, "", " ")
  473. body := strings.NewReader(string(binReq))
  474. resServ := kserv_http.GetKernelServHttp()
  475. fibApp := resServ.Hassert("reqBad3").Fiber()
  476. hReq, err := http.NewRequest("POST", "/bus/request", body)
  477. if err != nil {
  478. sf.t.Fatalf("reqBad3(): err=%v", err)
  479. }
  480. resp, err := fibApp.Test(hReq)
  481. if err != nil {
  482. sf.t.Fatalf("reqBad3(): after request, err=%v", err)
  483. }
  484. if resp.StatusCode != 400 {
  485. sf.t.Fatalf("reqBad3(): statusCode(%v)!=400", resp.StatusCode)
  486. }
  487. }
  488. // Нет тела запроса
  489. func (sf *tester) reqBad2() {
  490. sf.t.Log("reqBad1")
  491. body := strings.NewReader("test_msg")
  492. resServ := kserv_http.GetKernelServHttp()
  493. fibApp := resServ.Hassert("reqBad2").Fiber()
  494. hReq, err := http.NewRequest("POST", "/bus/request", body)
  495. if err != nil {
  496. sf.t.Fatalf("reqBad1(): err=%v", err)
  497. }
  498. resp, err := fibApp.Test(hReq)
  499. if err != nil {
  500. sf.t.Fatalf("reqBad1(): after request, err=%v", err)
  501. }
  502. if resp.StatusCode != 400 {
  503. sf.t.Fatalf("reqBad1(): statusCode(%v)!=400", resp.StatusCode)
  504. }
  505. }
  506. // Отсутствуют поля в запросе
  507. func (sf *tester) reqBad1() {
  508. sf.t.Log("reqBad1")
  509. defer func() {
  510. if _panic := recover(); _panic == nil {
  511. sf.t.Fatalf("reqBad1(): panic==nil")
  512. }
  513. }()
  514. Bus_.processSendRequest(nil)
  515. }
  516. // Получает локальную шину
  517. func (sf *tester) get() {
  518. sf.t.Log("get")
  519. _ = mock_env.MakeEnv()
  520. _ = os.Unsetenv("LOCAL_HTTP_URL")
  521. os.Setenv("LOCAL_HTTP_URL", "http://localhost:18312/")
  522. _ = GetKernelBusHttp()
  523. if Bus_ == nil {
  524. sf.t.Fatalf("get(): bus==nil")
  525. }
  526. _ = GetKernelBusHttp()
  527. Bus_.RegisterServe(sf.handServ)
  528. }