NFC Unit tests part 1.1 (#1927)
* Mifare Classic 1/4K, 4/7b uid, NFC-A: NFC-A is not complete yet, as there are no 4b uid tests. Also, Mifare Classic tests don't cover the key cache yet. * NFC unit tests require access to the NFC app * Made nfc_device_save accept full path as an argument * Move from cstrs to furi strings and fix logic * nfc tests: fix memory leak * nfc: add mf_classic_get_total_blocks() to API * nfc tests: simplify nfc tests * nfc: fix memory leak in shadow file saving * nfc: fix set uid scene * nfc: fix saving files * nfc: fix preload nfc file path * nfc: remove comments Co-authored-by: Sergey Gavrilov <who.just.the.doctor@gmail.com> Co-authored-by: gornekich <n.gorbadey@gmail.com> Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		@@ -314,7 +314,7 @@ static void nfc_generate_ntag_i2c_plus_2k(NfcDeviceData* data) {
 | 
			
		||||
    mful->version.storage_size = 0x15;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType type) {
 | 
			
		||||
void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType type) {
 | 
			
		||||
    nfc_generate_common_start(data);
 | 
			
		||||
    nfc_generate_mf_classic_common(data, uid_len, type);
 | 
			
		||||
 | 
			
		||||
@@ -337,6 +337,9 @@ static void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClas
 | 
			
		||||
            }
 | 
			
		||||
            mf_classic_set_block_read(mfc, i, &mfc->block[i]);
 | 
			
		||||
        }
 | 
			
		||||
        // Set SAK to 18
 | 
			
		||||
        data->nfc_data.sak = 0x18;
 | 
			
		||||
 | 
			
		||||
    } else if(type == MfClassicType1k) {
 | 
			
		||||
        // Set every block to 0xFF
 | 
			
		||||
        for(uint16_t i = 1; i < MF_CLASSIC_1K_TOTAL_SECTORS_NUM * 4; i += 1) {
 | 
			
		||||
@@ -347,6 +350,8 @@ static void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClas
 | 
			
		||||
            }
 | 
			
		||||
            mf_classic_set_block_read(mfc, i, &mfc->block[i]);
 | 
			
		||||
        }
 | 
			
		||||
        // Set SAK to 08
 | 
			
		||||
        data->nfc_data.sak = 0x08;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mfc->type = type;
 | 
			
		||||
 
 | 
			
		||||
@@ -11,3 +11,5 @@ struct NfcGenerator {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern const NfcGenerator* const nfc_generators[];
 | 
			
		||||
 | 
			
		||||
void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType type);
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,9 @@ void nfc_free(Nfc* nfc) {
 | 
			
		||||
        // Stop worker
 | 
			
		||||
        nfc_worker_stop(nfc->worker);
 | 
			
		||||
        // Save data in shadow file
 | 
			
		||||
        nfc_device_save_shadow(nfc->dev, nfc->dev->dev_name);
 | 
			
		||||
        if(furi_string_size(nfc->dev->load_path)) {
 | 
			
		||||
            nfc_device_save_shadow(nfc->dev, furi_string_get_cstr(nfc->dev->load_path));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if(nfc->rpc_ctx) {
 | 
			
		||||
        rpc_system_app_send_exited(nfc->rpc_ctx);
 | 
			
		||||
@@ -218,6 +220,13 @@ void nfc_blink_stop(Nfc* nfc) {
 | 
			
		||||
    notification_message(nfc->notifications, &sequence_blink_stop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nfc_save_file(Nfc* nfc) {
 | 
			
		||||
    furi_string_printf(
 | 
			
		||||
        nfc->dev->load_path, "%s/%s%s", NFC_APP_FOLDER, nfc->dev->dev_name, NFC_APP_EXTENSION);
 | 
			
		||||
    bool file_saved = nfc_device_save(nfc->dev, furi_string_get_cstr(nfc->dev->load_path));
 | 
			
		||||
    return file_saved;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nfc_show_loading_popup(void* context, bool show) {
 | 
			
		||||
    Nfc* nfc = context;
 | 
			
		||||
    TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME);
 | 
			
		||||
 
 | 
			
		||||
@@ -114,4 +114,6 @@ void nfc_blink_detect_start(Nfc* nfc);
 | 
			
		||||
 | 
			
		||||
void nfc_blink_stop(Nfc* nfc);
 | 
			
		||||
 | 
			
		||||
bool nfc_save_file(Nfc* nfc);
 | 
			
		||||
 | 
			
		||||
void nfc_show_loading_popup(void* context, bool show);
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,9 @@ void nfc_scene_file_select_on_enter(void* context) {
 | 
			
		||||
    Nfc* nfc = context;
 | 
			
		||||
    // Process file_select return
 | 
			
		||||
    nfc_device_set_loading_callback(nfc->dev, nfc_show_loading_popup, nfc);
 | 
			
		||||
    if(!furi_string_size(nfc->dev->load_path)) {
 | 
			
		||||
        furi_string_set_str(nfc->dev->load_path, NFC_APP_FOLDER);
 | 
			
		||||
    }
 | 
			
		||||
    if(nfc_file_select(nfc->dev)) {
 | 
			
		||||
        scene_manager_set_scene_state(nfc->scene_manager, NfcSceneSavedMenu, 0);
 | 
			
		||||
        scene_manager_next_scene(nfc->scene_manager, NfcSceneSavedMenu);
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,10 @@ bool nfc_scene_mf_classic_emulate_on_event(void* context, SceneManagerEvent even
 | 
			
		||||
           NFC_MF_CLASSIC_DATA_CHANGED) {
 | 
			
		||||
            scene_manager_set_scene_state(
 | 
			
		||||
                nfc->scene_manager, NfcSceneMfClassicEmulate, NFC_MF_CLASSIC_DATA_NOT_CHANGED);
 | 
			
		||||
            nfc_device_save_shadow(nfc->dev, nfc->dev->dev_name);
 | 
			
		||||
            // Save shadow file
 | 
			
		||||
            if(furi_string_size(nfc->dev->load_path)) {
 | 
			
		||||
                nfc_device_save_shadow(nfc->dev, furi_string_get_cstr(nfc->dev->load_path));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        consumed = false;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ bool nfc_scene_mf_classic_update_on_event(void* context, SceneManagerEvent event
 | 
			
		||||
    if(event.type == SceneManagerEventTypeCustom) {
 | 
			
		||||
        if(event.event == NfcWorkerEventSuccess) {
 | 
			
		||||
            nfc_worker_stop(nfc->worker);
 | 
			
		||||
            if(nfc_device_save_shadow(nfc->dev, nfc->dev->dev_name)) {
 | 
			
		||||
            if(nfc_device_save_shadow(nfc->dev, furi_string_get_cstr(nfc->dev->load_path))) {
 | 
			
		||||
                scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicUpdateSuccess);
 | 
			
		||||
            } else {
 | 
			
		||||
                scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicWrongCard);
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,10 @@ bool nfc_scene_mf_ultralight_emulate_on_event(void* context, SceneManagerEvent e
 | 
			
		||||
           NFC_MF_UL_DATA_CHANGED) {
 | 
			
		||||
            scene_manager_set_scene_state(
 | 
			
		||||
                nfc->scene_manager, NfcSceneMfUltralightEmulate, NFC_MF_UL_DATA_NOT_CHANGED);
 | 
			
		||||
            nfc_device_save_shadow(nfc->dev, nfc->dev->dev_name);
 | 
			
		||||
            // Save shadow file
 | 
			
		||||
            if(furi_string_size(nfc->dev->load_path)) {
 | 
			
		||||
                nfc_device_save_shadow(nfc->dev, furi_string_get_cstr(nfc->dev->load_path));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        consumed = false;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ bool nfc_scene_save_name_on_event(void* context, SceneManagerEvent event) {
 | 
			
		||||
                nfc->dev->dev_data.nfc_data = nfc->dev_edit_data;
 | 
			
		||||
            }
 | 
			
		||||
            strlcpy(nfc->dev->dev_name, nfc->text_store, strlen(nfc->text_store) + 1);
 | 
			
		||||
            if(nfc_device_save(nfc->dev, nfc->text_store)) {
 | 
			
		||||
            if(nfc_save_file(nfc)) {
 | 
			
		||||
                scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveSuccess);
 | 
			
		||||
                if(!scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) {
 | 
			
		||||
                    // Nothing, do not count editing as saving
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ bool nfc_scene_set_uid_on_event(void* context, SceneManagerEvent event) {
 | 
			
		||||
        if(event.event == NfcCustomEventByteInputDone) {
 | 
			
		||||
            if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) {
 | 
			
		||||
                nfc->dev->dev_data.nfc_data = nfc->dev_edit_data;
 | 
			
		||||
                if(nfc_device_save(nfc->dev, nfc->dev->dev_name)) {
 | 
			
		||||
                if(nfc_save_file(nfc)) {
 | 
			
		||||
                    scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveSuccess);
 | 
			
		||||
                    consumed = true;
 | 
			
		||||
                }
 | 
			
		||||
@@ -41,6 +41,7 @@ bool nfc_scene_set_uid_on_event(void* context, SceneManagerEvent event) {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return consumed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user