From d348ac3a507f0ffb4283e88f37a58befe8ba0029 Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Sat, 25 Oct 2025 20:43:22 +0200 Subject: [PATCH] add valid button action --- CMakeLists.txt | 1 + src/kds_s2000w_handler_opts.c | 10 +++++- tests/kds_s2000w_client_mock.c | 7 ++++ tests/kds_s2000w_client_mock.h | 2 ++ tests/kds_s2000w_net_set_opt_tests.c | 52 ++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bbdc72f..09d684a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,7 @@ IF (RUN_TESTS) --wrap,kds_s2000w_client_delete_image,\ --wrap,kds_s2000w_client_get_option,\ --wrap,kds_s2000w_client_set_option,\ +--wrap,kds_s2000w_client_get_capabilities,\ --wrap,kds_s2000w_image_converter_to_pnm,\ --wrap,sanei_config_get_paths" CACHE STRING "test coverage compiler flags" FORCE) diff --git a/src/kds_s2000w_handler_opts.c b/src/kds_s2000w_handler_opts.c index 475d318..a511e5b 100644 --- a/src/kds_s2000w_handler_opts.c +++ b/src/kds_s2000w_handler_opts.c @@ -82,14 +82,19 @@ void _kds_s2000w_handler_opts_set_option_to_default(handler_t* h) kds_s2000w_client_get_capabilities(resp); json_object* capabilities = json_tokener_parse(resp->data); json_object* default_values = json_object_object_get(capabilities, "Defaults"); + json_object* default_config = json_object_new_object(); - json_object_object_add(default_config, CONFIGURATION, default_values); + json_object* copy_default_values = NULL; + json_object_deep_copy(default_values, ©_default_values, json_c_shallow_copy_default); + json_object_object_add(default_config, CONFIGURATION, copy_default_values); json_object_put(h->scanner_config); h->scanner_config = NULL; h->scanner_config = default_config; + json_object_put(capabilities); + capabilities = NULL; kds_s2000w_client_response_free(resp); resp = NULL; } @@ -137,6 +142,9 @@ json_object* _kds_s2000w_handler_opts_load_config(handler_t* h) bool _kds_s2000w_opts_validate(SANE_Option_Descriptor* descriptor, const void* value) { + if (descriptor->constraint_type == SANE_CONSTRAINT_NONE) + return true; + if (descriptor->constraint_type == SANE_CONSTRAINT_WORD_LIST) { const int32_t* int_value = (const int32_t*) value; for (int32_t i = 1; i < descriptor->constraint.word_list[0]; i++) { diff --git a/tests/kds_s2000w_client_mock.c b/tests/kds_s2000w_client_mock.c index 8836f7e..73a8074 100644 --- a/tests/kds_s2000w_client_mock.c +++ b/tests/kds_s2000w_client_mock.c @@ -87,6 +87,13 @@ uint8_t __wrap_kds_s2000w_client_set_option(int64_t sessionid, response_t* respo return mock_type(int); } +uint8_t __wrap_kds_s2000w_client_get_capabilities(response_t* response) +{ + function_called(); + mock_response(response); + return mock_type(int); +} + void __wrap_kds_s2000w_image_converter_to_pnm(blobdata_t* in, blobdata_t* out) { if (in->data == NULL) diff --git a/tests/kds_s2000w_client_mock.h b/tests/kds_s2000w_client_mock.h index 1f7f131..f1eeceb 100644 --- a/tests/kds_s2000w_client_mock.h +++ b/tests/kds_s2000w_client_mock.h @@ -26,6 +26,8 @@ uint8_t __wrap_kds_s2000w_client_delete_image(int64_t sessionid, uint8_t img_num uint8_t __wrap_kds_s2000w_client_get_option(int64_t sessionid, response_t* response); uint8_t __wrap_kds_s2000w_client_set_option(int64_t sessionid, response_t* response); +uint8_t __wrap_kds_s2000w_client_get_capabilities(response_t* response); + void __wrap_kds_s2000w_convert_jpg_to_pnm_with_depth(blobdata_t* in, blobdata_t* out); void __wrap_kds_s2000w_convert_tiff_to_pnm(blobdata_t* in, blobdata_t* out); #endif \ No newline at end of file diff --git a/tests/kds_s2000w_net_set_opt_tests.c b/tests/kds_s2000w_net_set_opt_tests.c index 5e1d6bf..5c807f8 100644 --- a/tests/kds_s2000w_net_set_opt_tests.c +++ b/tests/kds_s2000w_net_set_opt_tests.c @@ -166,6 +166,57 @@ void kds_s2000w_net_set_option_int(void** state) set_value = NULL; } +void kds_s2000w_net_set_option_reset(void** state) +{ + int32_t* set_value = malloc(sizeof(int32_t)); + if (set_value == NULL) + return; + + const char* json = "{\"Defaults\": {\"DPI\": 200}}"; + response_t* defauls_resp = kds_s2000w_client_response_init(); + defauls_resp->data = malloc(sizeof(char) * 27); + memcpy(defauls_resp->data, json, 27); + defauls_resp->size = 27; + defauls_resp->code = 200; + + *set_value = 1; + response_t* resp = (response_t*) *state; + handler_t* h = kds_s2000w_handler_init(); + response_t* set_opt_resp = kds_s2000w_client_response_init(); + set_opt_resp->code = 200; + + will_return(mock_response, resp); + will_return(__wrap_kds_s2000w_client_get_option, 0); + will_return(mock_response, set_opt_resp); + will_return(__wrap_kds_s2000w_client_set_option, 0); + will_return(mock_response, defauls_resp); + will_return(__wrap_kds_s2000w_client_get_capabilities, 0); + will_return(mock_response, set_opt_resp); + will_return(__wrap_kds_s2000w_client_set_option, 0); + expect_function_call(__wrap_kds_s2000w_client_get_option); + expect_function_call(__wrap_kds_s2000w_client_set_option); + expect_function_call(__wrap_kds_s2000w_client_get_capabilities); + expect_function_call(__wrap_kds_s2000w_client_set_option); + + SANE_Status status = sane_kds_s2000w_net_control_option(h, 31, SANE_ACTION_SET_VALUE, set_value, NULL); + + json_object* config = json_object_object_get(h->scanner_config, "Configuration"); + json_object* value_object = json_object_object_get(config, DPI); + int32_t value = json_object_get_int(value_object); + + assert_int_equal(status, SANE_STATUS_GOOD); + assert_int_equal(value, 200); + + kds_s2000w_client_response_free(defauls_resp); + defauls_resp = NULL; + kds_s2000w_client_response_free(set_opt_resp); + set_opt_resp = NULL; + kds_s2000w_handler_free(h); + h = NULL; + free(set_value); + set_value = NULL; +} + void kds_s2000w_net_set_option_int_br_x(void** state) { int32_t* set_value = malloc(sizeof(int32_t)); @@ -342,6 +393,7 @@ int main() const struct CMUnitTest net_tests[] = { cmocka_unit_test_setup_teardown(kds_s2000w_net_set_option_string, setup_default_option, teardown_default_option), cmocka_unit_test_setup_teardown(kds_s2000w_net_set_option_int, setup_default_option, teardown_default_option), + cmocka_unit_test_setup_teardown(kds_s2000w_net_set_option_reset, setup_default_option, teardown_default_option), cmocka_unit_test_setup_teardown(kds_s2000w_net_set_option_int_br_x, setup_default_option, teardown_default_option), cmocka_unit_test_setup_teardown(kds_s2000w_net_set_option_int_word_list, setup_default_option, teardown_default_option), cmocka_unit_test_setup_teardown(kds_s2000w_net_set_invalid_option_string, setup_default_option, teardown_default_option), -- 2.47.3