sync: 同步生产版 v1.0.4 并脱敏

This commit is contained in:
MiFaZhan
2026-10-29 15:03:39 +08:00
parent fed9459244
commit 2d045591b7
32 changed files with 695 additions and 80 deletions
@@ -0,0 +1,55 @@
package upstreamapi
import (
"context"
"encoding/json"
"net/http/httptest"
"strings"
"testing"
"github.com/gogf/gf/v2/net/ghttp"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/model"
)
type apnPassthroughTestChannel struct{ reqData json.RawMessage }
func (c *apnPassthroughTestChannel) SimBase(_ context.Context, input *model.SimBaseReqJson) (model.SimBaseResJson, error) {
c.reqData = append(json.RawMessage(nil), input.ReqData...)
return model.SimBaseResJson{&model.SimBaseRes[json.RawMessage]{SimKey: input.SimKeys[0], Code: 0, Message: "已受理", ResData: json.RawMessage(`{"orderNum":"job-persisted","pending":true,"uncertain":false}`)}}, nil
}
func TestAPNProxyUnknownChannelPreservesUncertain(t *testing.T) {
api := NewUpstreamAPI()
out, err := api.SimBase((&ghttp.Request{Request: httptest.NewRequest("POST", "/sim/change/sim-apn", nil)}).Context(), &model.SimBaseReqJson{
SimKeys: []*model.SimKey{{ChanKey: "missing_chan", ICCID: "test"}},
ReqData: json.RawMessage(`{"operationId":"stable-id","submitOnly":true}`),
})
if err != nil || len(out) != 1 || !strings.Contains(string(out[0].ResData), `"uncertain":true`) {
t.Fatalf("未知通道不能误报业务失败: result=%+v err=%v", out, err)
}
}
func TestNonAPNProxySameNamedFieldsKeepLegacyFailure(t *testing.T) {
api := NewUpstreamAPI()
ctx := (&ghttp.Request{Request: httptest.NewRequest("POST", "/sim/change/sim-status", nil)}).Context()
out, err := api.SimBase(ctx, &model.SimBaseReqJson{SimKeys: []*model.SimKey{{ChanKey: "missing_chan", ICCID: "test"}}, ReqData: json.RawMessage(`{"operationId":"other-domain","submitOnly":true,"recoverOnly":true,"queryJobId":"unrelated"}`)})
if err != nil || len(out) != 1 || string(out[0].ResData) != `{"status":"-2"}` {
t.Fatalf("非APN同名字段改变既有失败语义:%+v %v", out, err)
}
}
func TestAPNProxyPreservesOperationAndAsyncFields(t *testing.T) {
api := NewUpstreamAPI()
instance := &apnPassthroughTestChannel{}
api.RegisterChan("test_chan", "test", &model.SimCardChannelCache{Instance: instance})
req := json.RawMessage(`{"operationId":"stable-id","submitOnly":true,"recoverOnly":false,"operType":"1"}`)
out, err := api.SimBase((&ghttp.Request{Request: httptest.NewRequest("POST", "/sim/change/sim-apn", nil)}).Context(), &model.SimBaseReqJson{SimKeys: []*model.SimKey{{ChanKey: "test_chan", ICCID: "test"}}, ReqData: req})
if err != nil || len(out) != 1 {
t.Fatalf("proxy请求错误:%v %+v", err, out)
}
if !strings.Contains(string(instance.reqData), `"operationId":"stable-id"`) {
t.Fatalf("operationId丢失:%s", instance.reqData)
}
if !strings.Contains(string(out[0].ResData), `"pending":true`) || !strings.Contains(string(out[0].ResData), `"orderNum":"job-persisted"`) {
t.Fatalf("受理标识丢失:%s", out[0].ResData)
}
}
+2 -2
View File
@@ -18,7 +18,7 @@ func (f *errCodeTestChannel) SimBase(context.Context, *model.SimBaseReqJson) (mo
}
func TestSimBasePreservesCarrierErrCode(t *testing.T) {
const payload = `{"code":0,"message":"success","data":[{"code":9999,"message":"http status 797","errCode":"S00004","simKey":{"chanKey":"channel_003","iccid":"8986112520409968013"},"resData":{}}]}`
const payload = `{"code":0,"message":"success","data":[{"code":9999,"message":"http status 797","errCode":"S00004","simKey":{"chanKey":"channel_003","iccid":"8986000000000000002"},"resData":{}}]}`
var upstream model.SimResponseData[model.SimBaseResJson]
if err := json.Unmarshal([]byte(payload), &upstream); err != nil {
@@ -38,7 +38,7 @@ func TestSimBasePreservesCarrierErrCode(t *testing.T) {
output, err := api.SimBase(context.Background(), &model.SimBaseReqJson{
SimKeys: []*model.SimKey{{
ChanKey: "channel_003",
ICCID: "8986112520409968013",
ICCID: "8986000000000000002",
}},
})
if err != nil {
+17 -6
View File
@@ -3,14 +3,14 @@ package upstreamapi
import (
"context"
"encoding/json"
"strings"
"sync"
"time"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-upstream-proxy/internal/service"
"strings"
"sync"
"time"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
@@ -317,6 +317,17 @@ func (u *sUpstreamAPI) packChanKey(ctx context.Context, simKeys []*model.SimKey)
func (u *sUpstreamAPI) SimBase(ctx context.Context, input *model.SimBaseReqJson) (model.SimBaseResJson, error) {
output := make([]*model.SimBaseRes[json.RawMessage], 0)
inputMap := make(map[string]*model.SimBaseReqJson)
// 提交/恢复/查询阶段的代理异常不是运营商办理失败。
failureResData := json.RawMessage(`{"status":"-2"}`)
var apnRequest struct {
SubmitOnly bool `json:"submitOnly"`
RecoverOnly bool `json:"recoverOnly"`
QueryJobID string `json:"queryJobId"`
}
request := g.RequestFromCtx(ctx)
if request != nil && request.URL.Path == "/sim/change/sim-apn" && json.Unmarshal(input.ReqData, &apnRequest) == nil && (apnRequest.SubmitOnly || apnRequest.RecoverOnly || apnRequest.QueryJobID != "") {
failureResData = json.RawMessage(`{"uncertain":true}`)
}
chanKeyMap, err := u.packChanKey(ctx, input.SimKeys)
if err != nil {
return nil, err
@@ -334,7 +345,7 @@ func (u *sUpstreamAPI) SimBase(ctx context.Context, input *model.SimBaseReqJson)
SimKey: simKey,
Code: consts.ApiStatusError,
Message: "通道未配置",
ResData: json.RawMessage(`{"status": "-2"}`),
ResData: failureResData,
})
}
continue
@@ -346,7 +357,7 @@ func (u *sUpstreamAPI) SimBase(ctx context.Context, input *model.SimBaseReqJson)
SimKey: simKey,
Code: consts.ApiStatusError,
Message: "通道未实例化",
ResData: json.RawMessage(`{"status": "-2"}`),
ResData: failureResData,
})
}
continue
@@ -358,7 +369,7 @@ func (u *sUpstreamAPI) SimBase(ctx context.Context, input *model.SimBaseReqJson)
SimKey: simKey,
Code: consts.ApiStatusError,
Message: err.Error(),
ResData: json.RawMessage(`{"status": "-2"}`),
ResData: failureResData,
})
}
} else {