package kbus_http import ( "encoding/json" "io" "net/http" "os" "strings" "testing" . "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers" "gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_pub" "gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_serve" "gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_sub" "gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_unsub" "gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx" "gitp78su.ipnodns.ru/svi/kern/v3/krn/kserv_http" "gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_env" "gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_serve" "gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_sub_local" ) type tester struct { t *testing.T handSub *mock_hand_sub_local.MockHandlerSub handServ *mock_hand_serve.MockHandlerServe } func TestKernelBusHttp(t *testing.T) { sf := &tester{ t: t, handSub: mock_hand_sub_local.NewMockHandlerSub("topic_sub", "http://localhost:18200/bus/pub"), handServ: mock_hand_serve.NewMockHandlerServe("topic_serv", "name_serv"), } ctx := kctx.GetKernelCtx() ctx.Set("monolitName", "test_monolit", "comment") sf.get() sf.req() sf.sub() sf.pub() sf.unsub() } // Запрос на отписку func (sf *tester) unsub() { sf.t.Log("unsub") sf.unsubBad1() sf.unsubBad2() sf.unsubGood1() sf.unsubBad3() sf.unsubGood2() } func (sf *tester) unsubGood2() { sf.t.Log("unsubGood2") res := Bus_.Subscribe(sf.handSub) if res.IsErr() { sf.t.Fatalf("unsubGood1(): err=%v", res.Err()) } req := &msg_unsub.UnsubReq{ Name_: sf.handSub.Name_, Uuid_: "test_uuid", } binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/unsub", body) if err != nil { sf.t.Fatalf("unsubGood2(): err=%v", err) } hReq.Header.Add("Content-Type", "application/json") _resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("unsubGood2(): after request, err=%v", err) } if _resp.StatusCode != 200 { sf.t.Fatalf("unsubGood2(): statusCode(%v)!=200", _resp.StatusCode) } defer _resp.Body.Close() binBody, _ := io.ReadAll(_resp.Body) resp := &msg_unsub.UnsubResp{} err = json.Unmarshal(binBody, resp) if err != nil { sf.t.Fatalf("unsubGood2(): err=%v", err) } if string(resp.Status_) != "ok" { sf.t.Fatalf("unsubGood2(): resp(%v)!='ok'", string(resp.Status_)) } } // Кривой запрос func (sf *tester) unsubBad3() { sf.t.Log("unsubBad3") req := "tra-la-la" binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/unsub", body) hReq.Header.Add("Content-Type", "application/json") if err != nil { sf.t.Fatalf("unsubBad3(): err=%v", err) } _resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("unsubBad3(): after request, err=%v", err) } if _resp.StatusCode == 200 { sf.t.Fatalf("unsubBad3(): statusCode(%v)==200", _resp.StatusCode) } } func (sf *tester) unsubGood1() { sf.t.Log("unsubGood1") res := Bus_.Subscribe(sf.handSub) if res.IsErr() { sf.t.Fatalf("unsubGood1(): err=%v", res.Err()) } count := 0 for count < 100 { SleepMs() count++ } req := &msg_unsub.UnsubReq{ Name_: sf.handSub.Name_, Uuid_: "test_uuid", } resp := Bus_.processUnsubRequest(req) if resp.Status_ != "ok" { sf.t.Fatalf("unsubGood1(): status(%v)!='ok'", resp.Status_) } } // Все поля на месте, нет подписчика func (sf *tester) unsubBad2() { sf.t.Log("unsubBad2") Bus_.Unsubscribe(sf.handSub) count := 0 for count < 100 { SleepMs() count++ } req := &msg_unsub.UnsubReq{ Name_: sf.handSub.Name_, Uuid_: "test_uuid", } resp := Bus_.processUnsubRequest(req) if resp.Status_ == "ok" { sf.t.Fatalf("unsubBad2(): status(%v)=='ok'", resp.Status_) } } // Нет полей для процесса отписки func (sf *tester) unsubBad1() { sf.t.Log("unsubBad1") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("unsubBad1(): panic==nil") } }() req := &msg_unsub.UnsubReq{} _ = Bus_.processUnsubRequest(req) } // Запрос на публикацию func (sf *tester) pub() { sf.t.Log("pub") sf.pubBad1() sf.pubGood1() sf.pubBad2() sf.pubBad3() sf.pubGood2() } func (sf *tester) pubGood2() { sf.t.Log("pubGood2") req := &msg_pub.PublishReq{ Topic_: "topic_sub", Uuid_: "test_uuid", BinMsg_: []byte("http_pub"), } binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/pub", body) hReq.Header.Add("Content-Type", "application/json") if err != nil { sf.t.Fatalf("pubGood2(): err=%v", err) } _resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("pubGood2(): after request, err=%v", err) } if _resp.StatusCode != 200 { sf.t.Fatalf("pubGood2(): statusCode(%v)!=200", _resp.StatusCode) } defer _resp.Body.Close() binBody, _ := io.ReadAll(_resp.Body) resp := &msg_pub.PublishResp{} err = json.Unmarshal(binBody, resp) if err != nil { sf.t.Fatalf("pubGood2(): err=%v", err) } if string(resp.Status_) != "ok" { sf.t.Fatalf("pubGood2(): resp(%v)!='ok'", string(resp.Status_)) } } // Кривой запрос func (sf *tester) pubBad3() { sf.t.Log("pubBad3") req := "tra-la-la" binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/pub", body) hReq.Header.Add("Content-Type", "application/json") if err != nil { sf.t.Fatalf("pubBad3(): err=%v", err) } _resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("pubBad3(): after request, err=%v", err) } if _resp.StatusCode == 200 { sf.t.Fatalf("pubBad3(): statusCode(%v)==200", _resp.StatusCode) } } // Что-то случилось внутри шины func (sf *tester) pubBad2() { sf.t.Log("pubBad2") Bus_.IsWork_.Reset() defer Bus_.IsWork_.Set() req := &msg_pub.PublishReq{ Topic_: "topic_sub", Uuid_: "test_uuid", BinMsg_: []byte("test_pub"), } resp := Bus_.processPublish(req) if resp.Status_ == "ok" { sf.t.Fatalf("pubBad2(): status(%v)=='ok'", resp.Status_) } } // Все поля на месте func (sf *tester) pubGood1() { sf.t.Log("pubGood1") res := Bus_.Subscribe(sf.handSub) if res.IsErr() { sf.t.Fatalf("pubGood1(): err=%v", res.Err()) } req := &msg_pub.PublishReq{ Topic_: "topic_sub", Uuid_: "test_uuid", BinMsg_: []byte("test_pub"), } _ = Bus_.processPublish(req) for { SleepMs() msg := string(sf.handSub.Msg()) if msg != "" { break } } msg := string(sf.handSub.Msg()) if msg != "test_pub" { sf.t.Fatalf("pubGood1(): msg(%v)!='test_pub'", msg) } } // Нет полей для процесса публикации func (sf *tester) pubBad1() { sf.t.Log("pubBad1") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("pubBad1(): panic==nil") } }() req := &msg_pub.PublishReq{} _ = Bus_.processPublish(req) } // Запрос подписки на топик func (sf *tester) sub() { sf.t.Log("sub") sf.subBad1() sf.subBad2() sf.subGood1() sf.subBad3() sf.subGood2() } // Полный процесс подписки func (sf *tester) subGood2() { sf.t.Log("subGood2") req := &msg_sub.SubscribeReq{ Topic_: "topic_serv", Uuid_: "test_uuid", WebHook_: "http://localhost:18200/bus/pub/", } binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/sub", body) hReq.Header.Add("Content-Type", "application/json") if err != nil { sf.t.Fatalf("subBad1(): err=%v", err) } _resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("subBad1(): after request, err=%v", err) } if _resp.StatusCode != 200 { sf.t.Fatalf("subBad1(): statusCode(%v)!=200", _resp.StatusCode) } defer _resp.Body.Close() binBody, _ := io.ReadAll(_resp.Body) resp := &msg_sub.SubscribeResp{} err = json.Unmarshal(binBody, resp) if err != nil { sf.t.Fatalf("subBad1(): err=%v", err) } if string(resp.Status_) != "ok" { sf.t.Fatalf("subBad1(): resp(%v)!='ok'", string(resp.Status_)) } } // Отключена базовая шина func (sf *tester) subBad3() { sf.t.Log("subBad3") req := &msg_sub.SubscribeReq{ Topic_: "topic_serv", Uuid_: "test_uuid", WebHook_: "http://localhost:18200/bus/pub/", } defer func() { if _panic := recover(); _panic != nil { sf.t.Fatalf("subBad3(): panic!=nil") } }() // _bus := kernel_bus_base.GetKernelBusBase() Bus_.IsWork_.Reset() defer Bus_.IsWork_.Set() resp := Bus_.processSubscribe(req) if resp.Status_ == "ok" { sf.t.Fatalf("subBad3(): resp==ok") } } // Проверка полей запроса в процессе подписки func (sf *tester) subGood1() { sf.t.Log("subGood1") req := &msg_sub.SubscribeReq{ Topic_: "topic_serv", Uuid_: "test_uuid", WebHook_: "http://localhost:18200/bus/", } defer func() { if _panic := recover(); _panic != nil { sf.t.Fatalf("subGood1(): panic!=nil") } }() _ = Bus_.processSubscribe(req) } // Проверка кривых полей запроса в процессе подписки func (sf *tester) subBad2() { sf.t.Log("subBad2") req := &msg_sub.SubscribeReq{ Topic_: "", } defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("subBad2(): panic==nil") } }() _ = Bus_.processSubscribe(req) } // Кривой запрос func (sf *tester) subBad1() { sf.t.Log("subBad1") req := "tra-ta-ta" binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/sub", body) hReq.Header.Add("Content-Type", "application/json") if err != nil { sf.t.Fatalf("subBad1(): err=%v", err) } _resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("subBad1(): after request, err=%v", err) } if _resp.StatusCode != 400 { sf.t.Fatalf("subBad1(): statusCode(%v)!=400", _resp.StatusCode) } } // Входящий запрос func (sf *tester) req() { sf.t.Log("req") sf.reqBad1() sf.reqBad2() sf.reqBad3() sf.reqGood1() sf.reqBad4() } // Что-то с обработчиком func (sf *tester) reqBad4() { sf.t.Log("reqBad4") sf.handServ.IsBad_.Set() defer sf.handServ.IsBad_.Reset() req := &msg_serve.ServeReq{ Topic_: sf.handServ.Topic_, Uuid_: "test_uuid", BinReq_: []byte("test_msg"), } binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/request", body) hReq.Header.Add("Content-Type", "application/json") if err != nil { sf.t.Fatalf("reqBad4(): err=%v", err) } _resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("reqBad4(): after request, err=%v", err) } if _resp.StatusCode != 200 { sf.t.Fatalf("reqBad4(): statusCode(%v)!=200", _resp.StatusCode) } defer _resp.Body.Close() binBody, _ := io.ReadAll(_resp.Body) resp := &msg_serve.ServeResp{} err = json.Unmarshal(binBody, resp) if err != nil { sf.t.Fatalf("reqBad4(): err=%v", err) } if string(resp.Status_) == "ok" { sf.t.Fatalf("reqBad4(): status(%v)=='ok'", string(resp.Status_)) } } func (sf *tester) reqGood1() { sf.t.Log("reqGood1") req := &msg_serve.ServeReq{ Topic_: sf.handServ.Topic_, Uuid_: "test_uuid", BinReq_: []byte("test_msg"), } binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/request", body) hReq.Header.Add("Content-Type", "application/json") if err != nil { sf.t.Fatalf("reqGood1(): err=%v", err) } _resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("reqGood1(): after request, err=%v", err) } if _resp.StatusCode != 200 { sf.t.Fatalf("reqGood1(): statusCode(%v)!=200", _resp.StatusCode) } defer _resp.Body.Close() binBody, _ := io.ReadAll(_resp.Body) resp := &msg_serve.ServeResp{} err = json.Unmarshal(binBody, resp) if err != nil { sf.t.Fatalf("reqGood1(): err=%v", err) } if string(resp.BinResp_) != "test_msg" { sf.t.Fatalf("reqGood1(): resp(%v)!='test_msg'", string(resp.BinResp_)) } } // Нет такого топика для запросов func (sf *tester) reqBad3() { sf.t.Log("reqBad3") req := &msg_serve.ServeReq{ Topic_: "bad_topic", Uuid_: "test_uuid", BinReq_: []byte("test_msg"), } binReq, _ := json.MarshalIndent(req, "", " ") body := strings.NewReader(string(binReq)) fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/request", body) if err != nil { sf.t.Fatalf("reqBad3(): err=%v", err) } resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("reqBad3(): after request, err=%v", err) } if resp.StatusCode != 400 { sf.t.Fatalf("reqBad3(): statusCode(%v)!=400", resp.StatusCode) } } // Нет тела запроса func (sf *tester) reqBad2() { sf.t.Log("reqBad1") body := strings.NewReader("test_msg") fibApp := kserv_http.GetKernelServHttp().Fiber() hReq, err := http.NewRequest("POST", "/bus/request", body) if err != nil { sf.t.Fatalf("reqBad1(): err=%v", err) } resp, err := fibApp.Test(hReq) if err != nil { sf.t.Fatalf("reqBad1(): after request, err=%v", err) } if resp.StatusCode != 400 { sf.t.Fatalf("reqBad1(): statusCode(%v)!=400", resp.StatusCode) } } // Отсутствуют поля в запросе func (sf *tester) reqBad1() { sf.t.Log("reqBad1") defer func() { if _panic := recover(); _panic == nil { sf.t.Fatalf("reqBad1(): panic==nil") } }() Bus_.processSendRequest(nil) } // Получает локальную шину func (sf *tester) get() { sf.t.Log("get") _ = mock_env.MakeEnv() _ = os.Unsetenv("LOCAL_HTTP_URL") os.Setenv("LOCAL_HTTP_URL", "http://localhost:18312/") _ = GetKernelBusHttp() if Bus_ == nil { sf.t.Fatalf("get(): bus==nil") } _ = GetKernelBusHttp() Bus_.RegisterServe(sf.handServ) }