# ADD_DEFINITIONS(-g -Werror -Wall -Wextra)
-ADD_CUSTOM_TARGET(ctest ALL make test WORKING_DIRECTORY ./ USES_TERMINAL)
+ADD_CUSTOM_TARGET(ctest ALL make CTEST_OUTPUT_ON_FAILURE=1 test WORKING_DIRECTORY ./ USES_TERMINAL)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/library)
endfunction(add_mocked_test)
add_mocked_test(diagnostics_set_notification_cb "-Wl,--wrap=system_info_get_platform_bool,--wrap=dbus_subscribe")
+add_mocked_test(diagnostics_unset_notification_cb "-Wl,--wrap=system_info_get_platform_bool")
add_mocked_test(diagnostics_request_client_data "-Wl,--wrap=system_info_get_platform_bool,--wrap=dumpsys_dump")
add_mocked_test(diagnostics_get_client_id "-Wl,--wrap=system_info_get_platform_bool")
add_mocked_test(diagnostics_get_report_path "")
return (int)mock();
}
-struct _diagnostics_ctx_s *build_ctx_crash()
+GVariant *build_signal_parameters_crash()
{
- struct _diagnostics_ctx_s *ctx = calloc(1, sizeof(struct _diagnostics_ctx_s));
- ctx->signal = calloc(1, sizeof(struct dbus_signal_s));
GVariantBuilder builder;
g_variant_builder_init(&builder, G_VARIANT_TYPE("(sssssiia{sv})"));
g_variant_builder_add(&builder, "{sv}", SIG_CRASH_EX_ARMPC, g_variant_new_int32(3055767608));
g_variant_builder_add(&builder, "{sv}", SIG_CRASH_EX_ARMLR, g_variant_new_int32(0));
g_variant_builder_close(&builder);
- ctx->signal->parameters = g_variant_builder_end(&builder);
+
+ return g_variant_builder_end(&builder);
+}
+
+struct _diagnostics_ctx_s *build_ctx_crash()
+{
+ struct _diagnostics_ctx_s *ctx = calloc(1, sizeof(struct _diagnostics_ctx_s));
+ ctx->signal = calloc(1, sizeof(struct dbus_signal_s));
+
+ ctx->signal_type = SIG_TYPE_CRASH;
ctx->signal->signal_name = g_strdup(DBUS_MEMBER_CRASH);
ctx->signal->sender_name = g_strdup(DBUS_SENDER_CRASH);
- ctx->signal_type = SIG_TYPE_CRASH;
+ ctx->signal->parameters = build_signal_parameters_crash();
ctx->client_id = ctx->signal->sender_name;
{
(void) state;
diagnostics_ctx_h ctx = NULL;
- diagnostics_destroy(ctx);
+ assert_int_equal(diagnostics_destroy(ctx), DIAGNOSTICS_ERROR_INVALID_PARAMETER);
assert_null(ctx);
}
{
(void) state;
diagnostics_data_h data = NULL;
- diagnostics_data_destroy(data);
+ assert_int_equal(diagnostics_data_destroy(data), DIAGNOSTICS_ERROR_INVALID_PARAMETER);
assert_null(data);
}
(void) state;
diagnostics_ctx_h ctx = build_ctx_crash();
- diagnostics_destroy(ctx);
+ assert_int_equal(diagnostics_destroy(ctx), DIAGNOSTICS_ERROR_NONE);
}
static void test_diagnostics_data_destroy_p2(void **state)
(void) state;
diagnostics_data_h data = calloc(1, sizeof(struct _diagnostics_data_s));
- diagnostics_data_destroy(data);
+ assert_int_equal(diagnostics_data_destroy(data), DIAGNOSTICS_ERROR_NONE);
}
int main(void)
static void test_diagnostics_get_data_n2(void **state)
{
(void) state;
- diagnostics_ctx_h br_ptr = build_ctx_crash();
+ diagnostics_ctx_h ctx = build_ctx_crash();
diagnostics_data_h data;
const char *params[] = {"cs_full"};
- assert_int_equal(diagnostics_get_data(br_ptr, params, -1, (void**)&data), DIAGNOSTICS_ERROR_INVALID_PARAMETER);
+ assert_int_equal(diagnostics_get_data(ctx, params, -1, (void**)&data), DIAGNOSTICS_ERROR_INVALID_PARAMETER);
- destroy_ctx(br_ptr);
+ destroy_ctx(ctx);
}
static void test_diagnostics_get_data_n3(void **state)
{
(void) state;
- diagnostics_ctx_h br_ptr = build_ctx_crash();
+ diagnostics_ctx_h ctx = build_ctx_crash();
const char *params[] = {"cs_full"};
- assert_int_equal(diagnostics_get_data(br_ptr, params, 1, NULL), DIAGNOSTICS_ERROR_INVALID_PARAMETER);
+ assert_int_equal(diagnostics_get_data(ctx, params, 1, NULL), DIAGNOSTICS_ERROR_INVALID_PARAMETER);
+
+ destroy_ctx(ctx);
+}
- destroy_ctx(br_ptr);
+static void test_diagnostics_get_data_n4(void **state)
+{
+ (void) state;
+ struct _diagnostics_ctx_s *ctx = build_ctx_crash();
+ struct _diagnostics_data_s *data = NULL;
+ const char *params[] = {"cs_foo"};
+
+ int result = diagnostics_get_data(ctx, params, 1, (void**)&data);
+
+ assert_int_equal(result, DIAGNOSTICS_ERROR_NOT_SUPPORTED);
+ assert_null(data);
+
+ destroy_ctx(ctx);
}
static void test_diagnostics_get_data_p1(void **state)
cmocka_unit_test(test_diagnostics_get_data_n1),
cmocka_unit_test(test_diagnostics_get_data_n2),
cmocka_unit_test(test_diagnostics_get_data_n3),
+ cmocka_unit_test(test_diagnostics_get_data_n4),
cmocka_unit_test(test_diagnostics_get_data_p1),
};
return cmocka_run_group_tests(tests, NULL, NULL);
assert_int_equal(diagnostics_set_notification_cb(NULL, NULL), DIAGNOSTICS_ERROR_INVALID_PARAMETER);
}
+static void test_diagnostics_set_notification_cb_n2(void **state)
+{
+ (void) state;
+
+ will_return(__wrap_dbus_subscribe, -1);
+
+ assert_int_equal(diagnostics_set_notification_cb(callback, NULL), DIAGNOSTICS_ERROR_IO_ERROR);
+}
+
static void test_diagnostics_set_notification_cb_p1(void **state)
{
(void) state;
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_diagnostics_set_notification_cb_n1),
+ cmocka_unit_test(test_diagnostics_set_notification_cb_n2),
cmocka_unit_test(test_diagnostics_set_notification_cb_p1),
cmocka_unit_test(test_diagnostics_set_notification_cb_p2),
};
void *user_data;
};
+struct _diagnostics_ctx_s *ctx = NULL;
+
void signal_callback(void *_ctx, void *user_data)
{
- struct _diagnostics_ctx_s *ctx = _ctx;
+ ctx = _ctx;
- assert_string_equal(ctx->signal->sender_name, "sender");
- assert_string_equal(ctx->signal->object_path, "object path");
- assert_string_equal(ctx->signal->interface_name, "interface name");
- assert_string_equal(ctx->signal->signal_name, "signal name");
assert_ptr_equal(user_data, NULL);
- assert_null(ctx->signal->parameters);
+}
+
+static void test_diagnostics_signal_handler_n1(void **state)
+{
+ (void) state;
+ GVariant *parameters = build_signal_parameters_crash();
+
+ cb_info.cb = NULL;
+ cb_info.user_data = NULL;
+
+ signal_handler(NULL, DBUS_SENDER_CRASH, DBUS_OBJECT_PATH, DBUS_INTERFACE_NAME, DBUS_MEMBER_CRASH, parameters, NULL);
+ assert_null(ctx);
+
+ g_variant_unref(parameters);
+}
+
+static void test_diagnostics_signal_handler_n2(void **state)
+{
+ (void) state;
+ GVariant *parameters = build_signal_parameters_crash();
+
+ cb_info.cb = signal_callback;
+ cb_info.user_data = NULL;
+
+ signal_handler(NULL, DBUS_SENDER_CRASH, DBUS_OBJECT_PATH, DBUS_INTERFACE_NAME, "foo", parameters, NULL);
+ assert_null(ctx);
+
+ g_variant_unref(parameters);
}
static void test_diagnostics_signal_handler_p1(void **state)
{
(void) state;
- const gchar *sender_name = g_strdup("sender");
- const gchar *object_path = g_strdup("object path");
- const gchar *interface_name = g_strdup("interface name");
- const gchar *signal_name = g_strdup("signal name");
- char *t = "abc";
- gboolean en = FALSE;
- GVariant *parameters = g_variant_new_parsed("{'title': <%s>, 'enabled': <%b>}", t, en);
+ GVariant *parameters = build_signal_parameters_crash();
+
cb_info.cb = signal_callback;
+ cb_info.user_data = NULL;
+
+ signal_handler(NULL, DBUS_SENDER_CRASH, DBUS_OBJECT_PATH, DBUS_INTERFACE_NAME, DBUS_MEMBER_CRASH, parameters, NULL);
- signal_handler(NULL, sender_name, object_path, interface_name, signal_name, parameters, NULL);
+ assert_non_null(ctx);
+ assert_string_equal(ctx->signal->sender_name, DBUS_SENDER_CRASH);
+ assert_string_equal(ctx->signal->object_path, DBUS_OBJECT_PATH);
+ assert_string_equal(ctx->signal->interface_name, DBUS_INTERFACE_NAME);
+ assert_string_equal(ctx->signal->signal_name, DBUS_MEMBER_CRASH);
+ assert_non_null(ctx->signal->parameters);
- g_free((gchar*)sender_name);
- g_free((gchar*)object_path);
- g_free((gchar*)interface_name);
- g_free((gchar*)signal_name);
g_variant_unref(parameters);
}
int main(void)
{
const struct CMUnitTest tests[] = {
+ cmocka_unit_test(test_diagnostics_signal_handler_n1),
+ cmocka_unit_test(test_diagnostics_signal_handler_n2),
cmocka_unit_test(test_diagnostics_signal_handler_p1),
};
return cmocka_run_group_tests(tests, NULL, NULL);
--- /dev/null
+/*
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stddef.h>
+#include <stdarg.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+#include "diagnostics.h"
+#include <gio/gio.h>
+#include <glib.h>
+
+#include "test_diagnostics.h"
+
+static void test_diagnostics_unset_notification_cb_p1(void **state)
+{
+ (void) state;
+
+ assert_int_equal(diagnostics_unset_notification_cb(), DIAGNOSTICS_ERROR_NONE);
+}
+
+int main(void)
+{
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test(test_diagnostics_unset_notification_cb_p1),
+ };
+ return cmocka_run_group_tests(tests, NULL, NULL);
+}