package handlers_test import ( "fmt" "testing" "github.com/fiskerinc/cloud-services/services/attendant/handlers" "github.com/fiskerinc/cloud-services/services/attendant/services" "github.com/fiskerinc/cloud-services/pkg/common" "github.com/fiskerinc/cloud-services/pkg/redis" "github.com/fiskerinc/cloud-services/pkg/redis/tester" "github.com/fiskerinc/cloud-services/pkg/testhelper" ) func TestCarUpdateProgressFunctional(t *testing.T) { t.Skip() testVIN := "WBSEH93466B798124" conn := tester.NewRedisMock() db := services.GetDB() manifest, carUpdateID, err := setupCarUpdateProgressFunc(db, testVIN) if err != nil { panic(err) } defer func() { if carUpdateID > 0 { db.GetCarUpdates().Delete(&common.CarUpdate{ID: carUpdateID}) conn.Delete(redis.CarUpdateStatusTBOXHashKey(carUpdateID), redis.CarUpdateStatusHMIHashKey(carUpdateID)) } if manifest != nil && manifest.ID > 0 { db.GetUpdateManifests().Delete(manifest) } }() ka := services.NewKeepAwakeService() ka.SetService(&services.MockKeepAwakeImplementation{}) type testCase struct { Name string Device common.Device Payload string ExpectedMsg string ExpectInstalled int ExpectInstallTotal int ExpectDBStatus string ExpectDownloadCurrent uint64 ExpectDownloadTotal uint64 ExpectErrorCode int } tests := []testCase{ { Name: "manifest_received", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "msg": "manifest_received" }`, carUpdateID), ExpectedMsg: "manifest_received", ExpectDBStatus: "manifest_received", }, { Name: "install_approval_await", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "msg": "install_approval_await" }`, carUpdateID), ExpectedMsg: "install_approval_await", ExpectDBStatus: "install_approval_await", }, { Name: "other error", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "installed": 3, "total_files": 10, "msg": "other error", "err": -100 }`, carUpdateID), ExpectedMsg: "other error", ExpectDBStatus: "other error", ExpectInstalled: 3, ExpectInstallTotal: 10, ExpectErrorCode: -100, }, { Name: "download_start", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "file_current": 0, "file_total": 100, "package_current": 0, "package_total": 100, "msg": "download_start", "err": 0 }`, carUpdateID), ExpectedMsg: "downloading", ExpectDBStatus: "package_download_start", ExpectDownloadCurrent: 0, ExpectDownloadTotal: 100, }, { Name: "downloading", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "file_current": 0, "file_total": 100, "package_current": 30, "package_total": 100, "msg": "downloading", "err": 0 }`, carUpdateID), ExpectedMsg: "downloading", ExpectDBStatus: "package_download_start", ExpectDownloadCurrent: 30, ExpectDownloadTotal: 100, }, { Name: "download_complete", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "file_current": 100, "file_total": 100, "package_current": 900, "package_total": 1000, "msg": "download_complete", "err": 0 }`, carUpdateID), ExpectedMsg: "downloading", ExpectDBStatus: "package_download_start", ExpectDownloadCurrent: 900, ExpectDownloadTotal: 1000, }, { Name: "package_download_complete", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "file_current": 100, "file_total": 100, "package_current": 1000, "package_total": 1000, "msg": "download_complete", "err": 0 }`, carUpdateID), ExpectedMsg: "package_download_complete", ExpectDBStatus: "package_download_complete", ExpectDownloadCurrent: 1000, ExpectDownloadTotal: 1000, }, { Name: "download_error", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "file_current": 0, "file_total": 100, "package_current": 0, "package_total": 1000, "msg": "download_error", "err": 0 }`, carUpdateID), ExpectedMsg: "download_error", ExpectDBStatus: "download_error", ExpectDownloadCurrent: 0, ExpectDownloadTotal: 1000, }, { Name: "install_start", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "installed": 0, "total_files": 10, "msg": "install_start", "err": 0 }`, carUpdateID), ExpectedMsg: "installing", ExpectDBStatus: "package_install_start", ExpectInstalled: 0, ExpectInstallTotal: 10, }, { Name: "installing", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "installed": 2, "total_files": 10, "msg": "installing", "err": 0 }`, carUpdateID), ExpectedMsg: "installing", ExpectDBStatus: "package_install_start", ExpectInstalled: 2, ExpectInstallTotal: 10, }, { Name: "install_complete", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "installed": 9, "total_files": 10, "msg": "install_complete", "err": 0 }`, carUpdateID), ExpectedMsg: "installing", ExpectDBStatus: "package_install_start", ExpectInstalled: 9, ExpectInstallTotal: 10, }, { Name: "package_install_complete", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "installed": 10, "total_files": 10, "msg": "install_complete", "err": 0 }`, carUpdateID), ExpectedMsg: "package_install_complete", ExpectDBStatus: "package_install_complete", ExpectInstalled: 10, ExpectInstallTotal: 10, }, { Name: "install_error", Device: common.TRex, Payload: fmt.Sprintf(`{ "car_update_id": %d, "ecu": "TEST", "installed": 3, "total_files": 10, "msg": "install_error", "err": 0 }`, carUpdateID), ExpectedMsg: "install_error", ExpectDBStatus: "install_error", ExpectInstalled: 3, ExpectInstallTotal: 10, }, { Name: "package_download_complete", Device: common.HMI, Payload: fmt.Sprintf(`{ "car_update_id":%d, "ecu":"ICC", "file_current":null, "file_total":null, "package_current":920639485, "package_total":920639485, "installed":null, "total_files":null, "msg":"package_download_complete", "err":null }`, carUpdateID), ExpectedMsg: "package_download_complete", ExpectDBStatus: "package_download_complete", ExpectInstalled: 3, ExpectInstallTotal: 10, ExpectDownloadCurrent: 920639485, ExpectDownloadTotal: 920639485, }, } keys := make([]string, 1) statuses := make([]interface{}, 1) for _, test := range tests { err := handlers.CarUpdateProgressStatus(db, ka, test.Device, testVIN, []byte(test.Payload)) if err != nil { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s output error", test.Device, test.Name), nil, err) } status := common.CarUpdateProgress{} keys[0] = redis.CarUpdateStatusHashKey(carUpdateID) statuses[0] = &status err = conn.GetObjectsMulti(keys, statuses) if err != nil { t.Errorf(testhelper.TestErrorTemplate, "GetObjectsMulti", nil, err) return } if status.Status != test.ExpectedMsg { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s Status", test.Device, test.Name), test.ExpectedMsg, status.Status) } if status.InstalledFiles != test.ExpectInstalled { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s InstalledFiles", test.Device, test.Name), test.ExpectInstalled, status.InstalledFiles) } if status.TotalFiles != test.ExpectInstallTotal { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s TotalFiles", test.Device, test.Name), test.ExpectInstallTotal, status.TotalFiles) } if status.PackageCurrent != test.ExpectDownloadCurrent { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s PackageCurrent", test.Device, test.Name), test.ExpectDownloadCurrent, status.PackageCurrent) } if status.PackageTotal != test.ExpectDownloadTotal { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s PackageTotal", test.Device, test.Name), test.ExpectDownloadTotal, status.PackageTotal) } if status.ErrorCode != test.ExpectErrorCode { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s ErrorCode", test.Device, test.Name), test.ExpectErrorCode, status.ErrorCode) } cu, err := db.GetCarUpdates().SelectByID(carUpdateID) if err != nil { t.Errorf(testhelper.TestErrorTemplate, "Get from DB", nil, err) return } if cu.Status != test.ExpectDBStatus { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s DB Status", test.Device, test.Name), test.ExpectDBStatus, cu.Status) } if cu.ErrorCode != test.ExpectErrorCode { t.Errorf(testhelper.TestErrorTemplate, fmt.Sprintf("[%v] %s DB ErrorCode", test.Device, test.Name), test.ExpectErrorCode, cu.ErrorCode) } } } func setupCarUpdateProgressFunc(db *services.DB, vin string) (*common.UpdateManifest, int64, error) { _, err := db.GetCars().SelectOrInsert(&common.Car{ VIN: vin, Model: "Ocean", Year: 2022, Trim: "Sport", }) if err != nil { return nil, 0, err } manifest := common.UpdateManifest{ Name: "TestCarUpdateProgressFunctional", Version: "1000", Description: "For TestCarUpdateProgressFunctional", ReleaseNotes: "http://releasenotes.com", Country: "US", PowerTrain: "MD23", Restraint: "None", Model: "Ocean", Trim: "Sport", Year: 2022, BodyType: "truck", } _, err = db.GetUpdateManifests().Insert(&manifest) if err != nil { return nil, 0, err } _, err = db.GetUpdateManifests().ECUInsert(&common.UpdateManifestECU{ UpdateManifestID: manifest.ID, ECU: "ICC", Version: "ICCVERSION", }) if err != nil { return nil, 0, err } _, err = db.GetUpdateManifests().ECUInsert(&common.UpdateManifestECU{ UpdateManifestID: manifest.ID, ECU: "ADAS", Version: "ADASVERSION", }) if err != nil { return nil, 0, err } carupdate := common.CarUpdate{ VIN: vin, UpdateManifestID: manifest.ID, } _, err = db.GetCarUpdates().Insert(&carupdate) if err != nil { return nil, 0, err } return &manifest, carupdate.ID, nil }