diff --git a/src/cloud/lwm2m_integration/lwm2m_integration.c b/src/cloud/lwm2m_integration/lwm2m_integration.c index 47a07a2..dac4983 100644 --- a/src/cloud/lwm2m_integration/lwm2m_integration.c +++ b/src/cloud/lwm2m_integration/lwm2m_integration.c @@ -257,43 +257,32 @@ static int modem_mode_request_cb(enum lte_lc_func_mode new_mode, void *user_data return CONFIG_LWM2M_INTEGRATION_MODEM_MODE_REQUEST_RETRY_SECONDS; } -static int firmware_update_state_cb(uint8_t update_state) +static int lwm2m_firmware_event_cb(struct lwm2m_fota_event *event) { - int err; - uint8_t update_result; struct cloud_wrap_event cloud_wrap_evt = { 0 }; - /* Get the firmware object update result code */ - err = lwm2m_get_u8(&LWM2M_OBJ(5, 0, 5), &update_result); - if (err) { - LOG_ERR("Failed getting firmware result resource value"); - cloud_wrap_evt.type = CLOUD_WRAP_EVT_ERROR; - cloud_wrap_evt.err = err; - cloud_wrapper_notify_event(&cloud_wrap_evt); - return 0; - } - - switch (update_state) { - case STATE_IDLE: - LOG_DBG("STATE_IDLE, result: %d", update_result); - - /* If the FOTA state returns to its base state STATE_IDLE, the FOTA failed. */ - cloud_wrap_evt.type = CLOUD_WRAP_EVT_FOTA_ERROR; - break; - case STATE_DOWNLOADING: - LOG_DBG("STATE_DOWNLOADING, result: %d", update_result); + switch (event->id) { + case LWM2M_FOTA_DOWNLOAD_START: + /* FOTA download process Started */ + LOG_DBG("STATE_DOWNLOADING, instance: %d", event->download_start.obj_inst_id); cloud_wrap_evt.type = CLOUD_WRAP_EVT_FOTA_START; break; - case STATE_DOWNLOADED: - LOG_DBG("STATE_DOWNLOADED, result: %d", update_result); + + case LWM2M_FOTA_DOWNLOAD_FINISHED: + /* FOTA download process finished */ + LOG_DBG("STATE_DOWNLOADED, instance %d", event->download_ready.obj_inst_id); return 0; - case STATE_UPDATING: - LOG_DBG("STATE_UPDATING, result: %d", update_result); - /* Disable further callbacks from FOTA */ - lwm2m_firmware_set_update_state_cb(NULL); + + case LWM2M_FOTA_UPDATE_IMAGE_REQ: + /* FOTA update new image */ + LOG_DBG("STATE_UPDATING, instance %d, dfu_type:%d", event->update_req.obj_inst_id, + event->update_req.dfu_type); return 0; - default: - LOG_ERR("Unknown state: %d", update_state); + + case LWM2M_FOTA_UPDATE_ERROR: + /* Fota process failed or was cancelled */ + LOG_ERR("FOTA failure %d by status %d", event->failure.obj_inst_id, + event->failure.update_failure); cloud_wrap_evt.type = CLOUD_WRAP_EVT_FOTA_ERROR; break; } @@ -372,7 +361,7 @@ int cloud_wrap_init(cloud_wrap_evt_handler_t event_handler) return err; } - err = lwm2m_init_firmware(); + err = lwm2m_init_firmware_cb(lwm2m_firmware_event_cb); if (err) { LOG_ERR("lwm2m_init_firmware, error: %d", err); return err; @@ -416,8 +405,6 @@ int cloud_wrap_init(cloud_wrap_evt_handler_t event_handler) return err; } - lwm2m_firmware_set_update_state_cb(firmware_update_state_cb); - wrapper_evt_handler = event_handler; state = DISCONNECTED; return 0; diff --git a/tests/lwm2m_integration/src/lwm2m_integration_test.c b/tests/lwm2m_integration/src/lwm2m_integration_test.c index d54806e..ab6ca83 100644 --- a/tests/lwm2m_integration/src/lwm2m_integration_test.c +++ b/tests/lwm2m_integration/src/lwm2m_integration_test.c @@ -35,7 +35,7 @@ static void cloud_wrap_event_handler(const struct cloud_wrap_event *const evt) static lwm2m_ctx_event_cb_t rd_client_callback; static lwm2m_engine_execute_cb_t engine_execute_cb; static modem_mode_cb_t modem_mode_change_cb; -static lwm2m_firmware_get_update_state_cb_t firmware_update_state_cb; +static lwm2m_firmware_event_cb_t firmware_update_event_cb; /* Forward declarations. */ static int register_exec_callback_stub(const struct lwm2m_obj_path *path, @@ -45,7 +45,7 @@ static int init_security_callback_stub(struct lwm2m_ctx *ctx, char *endpoint, struct modem_mode_change *mmode, int no_of_calls); -static void set_update_state_callback_stub(lwm2m_firmware_get_update_state_cb_t cb, +static int init_firmware_cb_stub(lwm2m_firmware_event_cb_t cb, int no_of_calls); extern int unity_main(void); @@ -54,7 +54,8 @@ extern int unity_main(void); void setUp(void) { __cmock_lwm2m_init_image_ExpectAndReturn(0); - __cmock_lwm2m_init_firmware_ExpectAndReturn(0); + __cmock_lwm2m_init_firmware_cb_ExpectAnyArgsAndReturn(0); + __cmock_lwm2m_init_firmware_cb_AddCallback(&init_firmware_cb_stub); __cmock_lwm2m_init_security_ExpectAndReturn(&client, endpoint_name, NULL, @@ -63,13 +64,10 @@ void setUp(void) __cmock_lwm2m_init_security_AddCallback(&init_security_callback_stub); - __cmock_lwm2m_firmware_set_update_state_cb_ExpectAnyArgs(); - __cmock_lwm2m_register_exec_callback_ExpectAndReturn(&LWM2M_OBJ(3, 0, 4), NULL, 0); __cmock_lwm2m_register_exec_callback_IgnoreArg_cb(); __cmock_lwm2m_register_exec_callback_AddCallback(®ister_exec_callback_stub); - __cmock_lwm2m_firmware_set_update_state_cb_AddCallback(&set_update_state_callback_stub); TEST_ASSERT_EQUAL(0, cloud_wrap_init(cloud_wrap_event_handler)); } @@ -118,9 +116,12 @@ static int init_security_callback_stub(struct lwm2m_ctx *ctx, return 0; } -void set_update_state_callback_stub(lwm2m_firmware_get_update_state_cb_t cb, int no_of_calls) +int init_firmware_cb_stub(lwm2m_firmware_event_cb_t cb, int no_of_calls) { - firmware_update_state_cb = cb; + ARG_UNUSED(no_of_calls); + + firmware_update_event_cb = cb; + return 0; } /* Tests */ @@ -327,86 +328,59 @@ void test_lwm2m_integration_network_error(void) TEST_ASSERT_EQUAL(CLOUD_WRAP_EVT_ERROR, last_cb_type); } -void test_lwm2m_integration_fota_result_get(void) -{ - /* Expect the FOTA update result to be retrieved for any update in FOTA state. */ - __cmock_lwm2m_get_u8_ExpectAndReturn(&LWM2M_OBJ(5, 0, 5), NULL, 0); - __cmock_lwm2m_get_u8_IgnoreArg_value(); - - __cmock_lwm2m_get_u8_ExpectAndReturn(&LWM2M_OBJ(5, 0, 5), NULL, 0); - __cmock_lwm2m_get_u8_IgnoreArg_value(); - - __cmock_lwm2m_get_u8_ExpectAndReturn(&LWM2M_OBJ(5, 0, 5), NULL, 0); - __cmock_lwm2m_get_u8_IgnoreArg_value(); - - __cmock_lwm2m_get_u8_ExpectAndReturn(&LWM2M_OBJ(5, 0, 5), NULL, 0); - __cmock_lwm2m_get_u8_IgnoreArg_value(); - __cmock_lwm2m_firmware_set_update_state_cb_Expect(NULL); - - firmware_update_state_cb(STATE_IDLE); - firmware_update_state_cb(STATE_DOWNLOADING); - firmware_update_state_cb(STATE_DOWNLOADED); - firmware_update_state_cb(STATE_UPDATING); -} - -void test_lwm2m_integration_fota_result_get_error(void) -{ - __cmock_lwm2m_get_u8_ExpectAnyArgsAndReturn(-1); - - firmware_update_state_cb(STATE_DOWNLOADING); - TEST_ASSERT_EQUAL(CLOUD_WRAP_EVT_ERROR, last_cb_type); -} - void test_lwm2m_integration_fota_error(void) { - __cmock_lwm2m_get_u8_IgnoreAndReturn(0); + struct lwm2m_fota_event event = { + .id = LWM2M_FOTA_UPDATE_ERROR, + .failure.obj_inst_id = 0, + .failure.update_failure = 10 + }; /* Expect an error event to be returned if FOTA state reverts to STATE_IDLE. */ - firmware_update_state_cb(STATE_IDLE); + firmware_update_event_cb(&event); TEST_ASSERT_EQUAL(CLOUD_WRAP_EVT_FOTA_ERROR, last_cb_type); } void test_lwm2m_integration_fota_downloading(void) { - __cmock_lwm2m_get_u8_IgnoreAndReturn(0); + struct lwm2m_fota_event event = { + .id = LWM2M_FOTA_DOWNLOAD_START, + .download_start.obj_inst_id = 0 + }; - firmware_update_state_cb(STATE_DOWNLOADING); + firmware_update_event_cb(&event); TEST_ASSERT_EQUAL(CLOUD_WRAP_EVT_FOTA_START, last_cb_type); } void test_lwm2m_integration_fota_downloaded(void) { - __cmock_lwm2m_get_u8_IgnoreAndReturn(0); + struct lwm2m_fota_event event = { + .id = LWM2M_FOTA_DOWNLOAD_FINISHED, + .download_ready.obj_inst_id = 0 + }; /* Expect no event to be called by setting last_cb_type to UINT8_MAX and verifying that * the value has not changed after the state change. */ last_cb_type = UINT8_MAX; - firmware_update_state_cb(STATE_DOWNLOADED); + firmware_update_event_cb(&event); TEST_ASSERT_EQUAL(UINT8_MAX, last_cb_type); } -void test_lwm2m_integration_fota_updating(void) +void test_lwm2m_integration_fota_update_image_req(void) { - __cmock_lwm2m_get_u8_IgnoreAndReturn(0); - __cmock_lwm2m_firmware_set_update_state_cb_Expect(NULL); + struct lwm2m_fota_event event = { + .id = LWM2M_FOTA_UPDATE_IMAGE_REQ, + .update_req.obj_inst_id = 0 + }; last_cb_type = UINT8_MAX; - firmware_update_state_cb(STATE_UPDATING); + firmware_update_event_cb(&event); TEST_ASSERT_EQUAL(UINT8_MAX, last_cb_type); } -void test_lwm2m_integration_fota_unexpected_event(void) -{ - __cmock_lwm2m_get_u8_IgnoreAndReturn(0); - - /* Trigger an event update with an unknown event type. */ - firmware_update_state_cb(UINT8_MAX); - TEST_ASSERT_EQUAL(CLOUD_WRAP_EVT_FOTA_ERROR, last_cb_type); -} - void main(void) { (void)unity_main();