kbus_http_test.go 15 KB

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