package testutil import ( "platform/pkg/remote" "sync" "testing" ) // MockCloudClient 是CloudClient接口的测试实现 type MockCloudClient struct { // 存储预期结果的字段 EdgesMock func(param remote.CloudEdgesReq) (*remote.CloudEdgesResp, error) ConnectMock func(param remote.CloudConnectReq) error DisconnectMock func(param remote.CloudDisconnectReq) (int, error) AutoQueryMock func() (remote.CloudConnectResp, error) // 记录调用历史 EdgesCalls []remote.CloudEdgesReq ConnectCalls []remote.CloudConnectReq DisconnectCalls []remote.CloudDisconnectReq AutoQueryCalls int // 用于并发安全 mu sync.Mutex } // 确保MockCloudClient实现了CloudClient接口 var _ remote.CloudClient = (*MockCloudClient)(nil) func (m *MockCloudClient) CloudEdges(param remote.CloudEdgesReq) (*remote.CloudEdgesResp, error) { m.mu.Lock() defer m.mu.Unlock() m.EdgesCalls = append(m.EdgesCalls, param) if m.EdgesMock != nil { return m.EdgesMock(param) } return &remote.CloudEdgesResp{}, nil } func (m *MockCloudClient) CloudConnect(param remote.CloudConnectReq) error { m.mu.Lock() defer m.mu.Unlock() m.ConnectCalls = append(m.ConnectCalls, param) if m.ConnectMock != nil { return m.ConnectMock(param) } return nil } func (m *MockCloudClient) CloudDisconnect(param remote.CloudDisconnectReq) (int, error) { m.mu.Lock() defer m.mu.Unlock() m.DisconnectCalls = append(m.DisconnectCalls, param) if m.DisconnectMock != nil { return m.DisconnectMock(param) } return 0, nil } func (m *MockCloudClient) CloudAutoQuery() (remote.CloudConnectResp, error) { m.mu.Lock() defer m.mu.Unlock() m.AutoQueryCalls++ if m.AutoQueryMock != nil { return m.AutoQueryMock() } return remote.CloudConnectResp{}, nil } // SetupCloudClientMock 替换全局CloudClient为测试实现并在测试完成后恢复 func SetupCloudClientMock(t *testing.T) *MockCloudClient { mock := &MockCloudClient{} remote.Cloud = mock return mock } // MockGatewayClient 是GatewayClient接口的测试实现 type MockGatewayClient struct { Host string } // 确保MockGatewayClient实现了GatewayClient接口 var _ remote.GatewayClient = (*MockGatewayClient)(nil) func (m *MockGatewayClient) GatewayPortConfigs(params []remote.PortConfigsReq) error { testGatewayBase.mu.Lock() defer testGatewayBase.mu.Unlock() testGatewayBase.PortConfigsCalls = append(testGatewayBase.PortConfigsCalls, params) if testGatewayBase.PortConfigsMock != nil { return testGatewayBase.PortConfigsMock(m, params) } return nil } func (m *MockGatewayClient) GatewayPortActive(param ...remote.PortActiveReq) (map[string]remote.PortData, error) { testGatewayBase.mu.Lock() defer testGatewayBase.mu.Unlock() testGatewayBase.PortActiveCalls = append(testGatewayBase.PortActiveCalls, param) if testGatewayBase.PortActiveMock != nil { return testGatewayBase.PortActiveMock(m, param...) } return map[string]remote.PortData{}, nil } type GatewayClientIns struct { // 存储预期结果的字段 PortConfigsMock func(c *MockGatewayClient, params []remote.PortConfigsReq) error PortActiveMock func(c *MockGatewayClient, param ...remote.PortActiveReq) (map[string]remote.PortData, error) // 记录调用历史 PortConfigsCalls [][]remote.PortConfigsReq PortActiveCalls [][]remote.PortActiveReq // 用于并发安全 mu sync.Mutex } var testGatewayBase = &GatewayClientIns{} // SetupGatewayClientMock 创建一个MockGatewayClient并提供替换函数 func SetupGatewayClientMock(t *testing.T) *GatewayClientIns { remote.GatewayInitializer = func(url, username, password string) remote.GatewayClient { return &MockGatewayClient{ Host: url, } } return testGatewayBase }