package common import ( "encoding/json" "testing" "time" "github.com/fiskerinc/cloud-services/pkg/grpc/kafka_grpc" "github.com/fiskerinc/cloud-services/pkg/utils/elptr" ) func TestDepotRouteHMIPayload(t *testing.T) { tests := []struct { name string payload *kafka_grpc.GRPC_DepotPayload expectedResult *ConsumerPayload expectedError error }{ { name: "Valid payload with 'init' handler", payload: &kafka_grpc.GRPC_DepotPayload{ Handler: "init", Data: &kafka_grpc.GRPC_DepotPayload_HmiSession{ HmiSession: &kafka_grpc.HMISessionData{ SessionId: "123456", Vin: "ABC123", Salt: "salt123", }, }, }, expectedResult: &ConsumerPayload{ Handler: "init", Data: func() []byte { data, _ := json.Marshal(&HMISessionData{ SessionID: "123456", VIN: "ABC123", Salt: "salt123", }) return data }(), }, expectedError: nil, }, // Add more test cases as needed } for _, test := range tests { t.Run(test.name, func(t *testing.T) { result, err := DepotRouteHMIPayload(test.payload) if err != test.expectedError { t.Errorf("Expected error: %v, got: %v", test.expectedError, err) } if result.Handler != test.expectedResult.Handler { t.Errorf("Handler mismatch. Expected: %s, got: %s", test.expectedResult.Handler, result.Handler) } if string(result.Data) != string(test.expectedResult.Data) { t.Errorf("Data mismatch. Expected: %s, got: %s", test.expectedResult.Data, result.Data) } }) } } func TestDepotRouteTRexPayloadMessage(t *testing.T) { tests := []struct { name string payload *kafka_grpc.GRPC_DepotPayload expectedResult *ConsumerPayload expectedError error }{ { name: "Valid payload with 'init' handler", payload: &kafka_grpc.GRPC_DepotPayload{ Handler: "init", Data: &kafka_grpc.GRPC_DepotPayload_InitPayload{ InitPayload: &kafka_grpc.InitPayload{ Data: map[string]string{ "key1": "value1", "key2": "value2", }, }, }, }, expectedResult: &ConsumerPayload{ Handler: "init", Data: func() []byte { data, _ := json.Marshal(map[string]string{ "key1": "value1", "key2": "value2", }) return data }(), }, expectedError: nil, }, { name: "Payload with nil data", payload: &kafka_grpc.GRPC_DepotPayload{ Handler: "init", Data: nil, }, expectedResult: &ConsumerPayload{ Handler: "init", Data: nil, }, expectedError: nil, }, { name: "Invalid handlerl handler", payload: &kafka_grpc.GRPC_DepotPayload{ Handler: "fake_handler", Data: nil, }, expectedResult: &ConsumerPayload{ Handler: "fake_handler", Data: nil, }, expectedError: nil, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { result, err := DepotRouteTRexPayload(test.payload) if err != test.expectedError { t.Errorf("Expected error: %v, got: %v", test.expectedError, err) } if result.Handler != test.expectedResult.Handler { t.Errorf("Handler mismatch. Expected: %s, got: %s", test.expectedResult.Handler, result.Handler) } if string(result.Data) != string(test.expectedResult.Data) { t.Errorf("Data mismatch. Expected: %s, got: %s", test.expectedResult.Data, result.Data) } }) } } func TestAttendantRouteMobilePayload(t *testing.T) { tests := []struct { name string payload *kafka_grpc.GRPC_AttendantPayload expectedResult *ConsumerPayload expectedError error }{ { name: "Valid payload with 'update_approve' handler", payload: &kafka_grpc.GRPC_AttendantPayload{ Handler: "update_approve", Data: &kafka_grpc.GRPC_AttendantPayload_UpdateApprove{ UpdateApprove: &kafka_grpc.UpdateData{ Id: 123, }, }, }, expectedResult: &ConsumerPayload{ Handler: "update_approve", Data: func() []byte { data, _ := json.Marshal(map[string]int{"id": 123}) return data }(), }, expectedError: nil, }, { name: "Valid payload with 'updates_get' handler", payload: &kafka_grpc.GRPC_AttendantPayload{ Handler: "updates_get", Data: &kafka_grpc.GRPC_AttendantPayload_UpdateGet{ UpdateGet: &kafka_grpc.VehicleData{ Vin: "ABC123", }, }, }, expectedResult: &ConsumerPayload{ Handler: "updates_get", Data: func() []byte { data, _ := json.Marshal(map[string]string{"vin": "ABC123"}) return data }(), }, expectedError: nil, }, { name: "Payload with nil data", payload: &kafka_grpc.GRPC_AttendantPayload{ Handler: "update_approve", Data: nil, }, expectedResult: &ConsumerPayload{ Handler: "update_approve", Data: nil, }, expectedError: nil, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { result, err := AttendantRouteMobilePayload(test.payload) if err != test.expectedError { t.Errorf("Expected error: %v, got: %v", test.expectedError, err) } if result.Handler != test.expectedResult.Handler { t.Errorf("Handler mismatch. Expected: %s, got: %s", test.expectedResult.Handler, result.Handler) } if string(result.Data) != string(test.expectedResult.Data) { t.Errorf("Data mismatch. Expected: %s, got: %s", test.expectedResult.Data, result.Data) } }) } } func TestUpdateManifestToGRPC(t *testing.T) { pub1 := "9a1a6949d7f8a511df6e2e2771e444dbd6de97e7d98bdecbb5adc4b8965ce3bef353f523dbea123d7882dc043d415cda02810bad1b6f1b8c6202234a424b7d5b" pub2 := "407f59557fb64ae98bc30b5370fab138f4827e14784d79bcf707dbe35ba2b85d" priv1 := "9a1a6949d7f8a511df6e2e2771e444dbd6de97e7d98bdecbb5adc4b8965ce3bef353f523dbea123d7882dc043d415cda02810bad1b6f1b8c6202234a424b7d5c" var pub1B BinaryHex = []byte(pub1) var pub2B BinaryHex = []byte(pub2) var priv1B BinaryHex = []byte(priv1) date := time.Date(2022, 5, 27, 12, 49, 0, 0, time.UTC) unixMillis := date.UnixMilli() toDate := time.Unix(0, unixMillis*int64(time.Millisecond)) flag := true expectedUpdate := &UpdateManifest{ ID: 1, ECUs: []*UpdateManifestECU{ { ID: 3, Mode: "v", ECCKeys: &ECCKeys{ ECU: "ecu", Env: "env", PubKey1: &pub1B, PrivKey1: &priv1B, PubKey2: &pub2B, }, Files: []*UpdateManifestFile{ { FileID: "file_id_value", UpdateManifestECUID: 123456789, Filename: "filename_value", URL: "url_value", FileSize: 1024, // Example file size Checksum: "checksum_value", FileType: "type_value", FileOrder: 1, // Example order WriteRegion: MemoryRegion{ Offset: 1024, // Example offset Length: 2048, // Example length }, EraseRegion: &MemoryRegion{ Offset: 4096, // Example offset Length: 8192, // Example length }, FileKey: &FileKeyResponse{ FileID: "file_key_file_id_value", Key: "file_key_key_value", Auth: "file_key_auth_value", Nonce: "file_key_nonce_value", Error: "file_key_error_value", }, Parsed: &flag, // Example parsed file value Signature: "signature_value", CompatibleTrims: []CompatibleTrim{ EXTREME, SPORT, }, CompatibleDriveSides: []CompatibleDriveSide{ LEFT_HAND_DRIVE, RIGHT_HAND_DRIVE, }, }, }, }, }, } expectedUpdate.CreatedAt = &toDate expectedUpdate.ECUs[0].CreatedAt = &toDate expectedUpdate.ECUs[0].UpdatedAt = &toDate expectedUpdate.ECUs[0].Files[0].CreatedAt = &date expectedUpdate.ECUs[0].Files[0].UpdatedAt = &date b, _ := json.Marshal(expectedUpdate) msg := MessageRawJSON{ Handler: "send_manifest", Data: b, } grpcRep := UpdateManifestToGRPC(msg) if grpcRep == nil { t.Errorf("Expected not nil reponse from UpdateManifestToGRPC but got: nil") } if grpcRep.GetHandler() != msg.Handler { t.Errorf("Expected handler should equal to %v but got %v:", msg.Handler, grpcRep.Handler) } reveseGRPC := GRPCToUpdateManifest(grpcRep) grpcP, _ := json.Marshal(reveseGRPC) if string(grpcP) != string(b) { t.Errorf("Expected data should equal to %v but got %v:", string(b), string(grpcP)) } } func TestAttendantSendManifest(t *testing.T) { pub1 := "9a1a6949d7f8a511df6e2e2771e444dbd6de97e7d98bdecbb5adc4b8965ce3bef353f523dbea123d7882dc043d415cda02810bad1b6f1b8c6202234a424b7d5b" pub2 := "407f59557fb64ae98bc30b5370fab138f4827e14784d79bcf707dbe35ba2b85d" priv1 := "9a1a6949d7f8a511df6e2e2771e444dbd6de97e7d98bdecbb5adc4b8965ce3bef353f523dbea123d7882dc043d415cda02810bad1b6f1b8c6202234a424b7d5c" var pub1B BinaryHex = []byte(pub1) var pub2B BinaryHex = []byte(pub2) var priv1B BinaryHex = []byte(priv1) date := time.Date(2022, 5, 27, 12, 49, 0, 0, time.UTC) dateString := "2022-05-27T12:49:00Z" unixMillis := date.UnixMilli() toDate := time.Unix(0, unixMillis*int64(time.Millisecond)) flag := true expectedUpdate := &UpdateManifest{ ID: 1, ECUs: []*UpdateManifestECU{ { ID: 3, Mode: "v", ECCKeys: &ECCKeys{ ECU: "ecu", Env: "env", PubKey1: &pub1B, PrivKey1: &priv1B, PubKey2: &pub2B, }, Files: []*UpdateManifestFile{ { FileID: "file_id_value", UpdateManifestECUID: 123456789, Filename: "filename_value", URL: "url_value", FileSize: 1024, // Example file size Checksum: "checksum_value", FileType: "type_value", FileOrder: 1, // Example order WriteRegion: MemoryRegion{ Offset: 1024, // Example offset Length: 2048, // Example length }, EraseRegion: &MemoryRegion{ Offset: 4096, // Example offset Length: 8192, // Example length }, FileKey: &FileKeyResponse{ FileID: "file_key_file_id_value", Key: "file_key_key_value", Auth: "file_key_auth_value", Nonce: "file_key_nonce_value", Error: "file_key_error_value", }, Parsed: &flag, // Example parsed file value Signature: "signature_value", CompatibleTrims: []CompatibleTrim{ EXTREME, SPORT, }, CompatibleDriveSides: []CompatibleDriveSide{ LEFT_HAND_DRIVE, RIGHT_HAND_DRIVE, }, }, }, }, }, } expectedUpdate.CreatedAt = &toDate expectedUpdate.ECUs[0].CreatedAt = &toDate expectedUpdate.ECUs[0].UpdatedAt = &toDate expectedUpdate.ECUs[0].Files[0].CreatedAt = &date expectedUpdate.ECUs[0].Files[0].UpdatedAt = &date tests := []struct { name string payload *kafka_grpc.GRPC_AttendantPayload expectedResult *ConsumerPayload expectedError error }{ { name: "Valid payload with 'send_manifest' handler", payload: &kafka_grpc.GRPC_AttendantPayload{ Handler: "send_manifest", Data: &kafka_grpc.GRPC_AttendantPayload_UpdateManifest{ UpdateManifest: &kafka_grpc.UpdateManifest{ Id: 1, EcuUpdates: []*kafka_grpc.UpdateManifestECU{ { Created: &unixMillis, Updated: &unixMillis, Id: 3, Mode: "v", EccKeys: &kafka_grpc.ECCKey{ Ecu: "ecu", Env: "env", PubKeyLevel_1: &kafka_grpc.BineryHex{ Data: []byte(pub1), }, Level_1: &kafka_grpc.BineryHex{ Data: []byte(priv1), }, PubKeyLevel_2: &kafka_grpc.BineryHex{ Data: []byte(pub2), }, }, Files: []*kafka_grpc.UpdateManifestFile{ { FileId: "file_id_value", ManifestEcuId: 123456789, Filename: "filename_value", Url: "url_value", FileSize: 1024, // Example file size Checksum: "checksum_value", Type: "type_value", Order: 1, // Example order WriteRegion: &kafka_grpc.MemoryRegion{ Offset: 1024, // Example offset Length: 2048, // Example length }, EraseRegion: &kafka_grpc.MemoryRegion{ Offset: 4096, // Example offset Length: 8192, // Example length }, FileKey: &kafka_grpc.FileKeyResponse{ FileId: "file_key_file_id_value", Key: "file_key_key_value", Auth: "file_key_auth_value", Nonce: "file_key_nonce_value", Error: "file_key_error_value", }, Updated: &dateString, Created: &dateString, ParsedFile: &flag, // Example parsed file value Signature: "signature_value", CompatibleTrims: []string{ string(EXTREME), string(SPORT), }, CompatibleDriveSides: []string{ string(LEFT_HAND_DRIVE), string(RIGHT_HAND_DRIVE), }, }, }, }, }, Created: &unixMillis, }, }, }, expectedResult: &ConsumerPayload{ Handler: "send_manifest", Data: func() []byte { data, _ := json.Marshal(expectedUpdate) return data }(), }, expectedError: nil, }, { name: "Payload with nil data", payload: &kafka_grpc.GRPC_AttendantPayload{ Handler: "send_manifest", Data: nil, }, expectedResult: &ConsumerPayload{ Handler: "send_manifest", Data: nil, }, expectedError: nil, }, // Add more test cases as needed } // Set date for _, test := range tests { t.Run(test.name, func(t *testing.T) { result, err := AttendantRouteServicePayload(test.payload) if err != test.expectedError { t.Errorf("Expected error: %v, got: %v", test.expectedError, err) } if result.Handler != test.expectedResult.Handler { t.Errorf("Handler mismatch. Expected: %s, got: %s", test.expectedResult.Handler, result.Handler) } if string(result.Data) != string(test.expectedResult.Data) { t.Errorf("Data mismatch. Expected: %s, <<><><<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n<<<<