diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2012-12-09 12:46:11 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-12-09 12:46:11 +0100 |
commit | 68f4f17a7e39055418639eb58e453688b4639820 (patch) | |
tree | a641f46406e5ccf17b1de22e5c354da147b92545 /unit/test-uuid.c | |
parent | 5a2fda0be9f398b11478bfac9292dd57b739e007 (diff) | |
download | bluez-68f4f17a7e39055418639eb58e453688b4639820.tar.gz |
unit: Convert uuidtest utility into a real unit test
Diffstat (limited to 'unit/test-uuid.c')
-rw-r--r-- | unit/test-uuid.c | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/unit/test-uuid.c b/unit/test-uuid.c new file mode 100644 index 000000000..cbccc8278 --- /dev/null +++ b/unit/test-uuid.c @@ -0,0 +1,226 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2011 Intel Corporation + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <glib.h> + +#include <bluetooth/bluetooth.h> +#include <bluetooth/uuid.h> + +struct uuid_test_data { + const char *str; + uint16_t val16; + uint32_t val32; + unsigned char *binary; + uint8_t type; + const char *str128; + unsigned char *binary128; +}; + +static unsigned char uuid_base_binary[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb }; + +static struct uuid_test_data uuid_base = { + .str = "00000000-0000-1000-8000-00805F9B34FB", + .binary = uuid_base_binary, + .type = BT_UUID128, + .str128 = "00000000-0000-1000-8000-00805F9B34FB", + .binary128 = uuid_base_binary, +}; + +static unsigned char uuid_sixteen_binary[] = { + 0x00, 0x00, 0x12, 0x34, 0x00, 0x00, 0x10, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb }; + +static struct uuid_test_data uuid_sixteen1 = { + .str = "0x1234", + .val16 = 0x1234, + .type = BT_UUID16, + .str128 = "00001234-0000-1000-8000-00805F9B34FB", + .binary128 = uuid_sixteen_binary, +}; + +static struct uuid_test_data uuid_sixteen2 = { + .str = "1234", + .val16 = 0x1234, + .type = BT_UUID16, + .str128 = "00001234-0000-1000-8000-00805F9B34FB", + .binary128 = uuid_sixteen_binary, +}; + +static unsigned char uuid_32_binary[] = { + 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x10, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb }; + +static struct uuid_test_data uuid_32_1 = { + .str = "0x12345678", + .val32 = 0x12345678, + .type = BT_UUID32, + .str128 = "12345678-0000-1000-8000-00805F9B34FB", + .binary128 = uuid_32_binary, +}; + +static struct uuid_test_data uuid_32_2 = { + .str = "12345678", + .val32 = 0x12345678, + .type = BT_UUID32, + .str128 = "12345678-0000-1000-8000-00805F9B34FB", + .binary128 = uuid_32_binary, +}; + +static void test_uuid(gconstpointer data) +{ + const struct uuid_test_data *test_data = data; + bt_uuid_t uuid; + uint128_t n128, u128; + + g_assert(bt_string_to_uuid(&uuid, test_data->str) == 0); + g_assert(uuid.type == test_data->type); + + switch (uuid.type) { + case BT_UUID16: + g_assert(uuid.value.u16 == test_data->val16); + break; + case BT_UUID32: + g_assert(uuid.value.u32 == test_data->val32); + break; + case BT_UUID128: + memcpy(&n128, test_data->binary, 16); + ntoh128(&n128, &u128); + g_assert(memcmp(&uuid.value.u128, &u128, 16) == 0); + break; + default: + return; + } +} + +static void test_str(gconstpointer data) +{ + const struct uuid_test_data *test_data = data; + const char *str; + char buf[128]; + bt_uuid_t uuid; + + if (g_str_has_prefix(test_data->str, "0x") == TRUE) + str = test_data->str + 2; + else + str = test_data->str; + + g_assert(bt_string_to_uuid(&uuid, test_data->str) == 0); + + bt_uuid_to_string(&uuid, buf, sizeof(buf)); + g_assert(strcasecmp(buf, str) == 0); + + switch (test_data->type) { + case BT_UUID16: + bt_uuid16_create(&uuid, test_data->val16); + break; + case BT_UUID32: + bt_uuid32_create(&uuid, test_data->val32); + break; + default: + return; + } + + bt_uuid_to_string(&uuid, buf, sizeof(buf)); + g_assert(strcasecmp(buf, str) == 0); +} + +static void test_cmp(gconstpointer data) +{ + const struct uuid_test_data *test_data = data; + bt_uuid_t uuid1, uuid2; + + g_assert(bt_string_to_uuid(&uuid1, test_data->str) == 0); + g_assert(bt_string_to_uuid(&uuid2, test_data->str128) == 0); + + g_assert(bt_uuid_cmp(&uuid1, &uuid2) == 0); +} + +static const char *malformed[] = { + "0", + "01", + "012", + "xxxx", + "xxxxx", + "0xxxxx", + "0123456", + "012g4567", + "012345678", + "0x234567u9", + "01234567890", + "00001234-0000-1000-8000-00805F9B34F", + "00001234-0000-1000-8000 00805F9B34FB", + "00001234-0000-1000-8000-00805F9B34FBC", + "00001234-0000-1000-800G-00805F9B34FB", + NULL, +}; + +static void test_malformed(gconstpointer data) +{ + const char *str = data; + bt_uuid_t uuid; + + g_assert(bt_string_to_uuid(&uuid, str) != 0); +} + +int main(int argc, char *argv[]) +{ + int i; + + g_test_init(&argc, &argv, NULL); + + g_test_add_data_func("/uuid/base", &uuid_base, test_uuid); + g_test_add_data_func("/uuid/base/str", &uuid_base, test_str); + g_test_add_data_func("/uuid/base/cmp", &uuid_base, test_cmp); + + g_test_add_data_func("/uuid/sixteen1", &uuid_sixteen1, test_uuid); + g_test_add_data_func("/uuid/sixteen1/str", &uuid_sixteen1, test_str); + g_test_add_data_func("/uuid/sixteen1/cmp", &uuid_sixteen1, test_cmp); + + g_test_add_data_func("/uuid/sixteen2", &uuid_sixteen2, test_uuid); + g_test_add_data_func("/uuid/sixteen2/str", &uuid_sixteen2, test_str); + g_test_add_data_func("/uuid/sixteen2/cmp", &uuid_sixteen2, test_cmp); + + g_test_add_data_func("/uuid/thirtytwo1", &uuid_32_1, test_uuid); + g_test_add_data_func("/uuid/thirtytwo1/str", &uuid_32_1, test_str); + g_test_add_data_func("/uuid/thirtytwo1/cmp", &uuid_32_1, test_cmp); + + g_test_add_data_func("/uuid/thirtytwo2", &uuid_32_2, test_uuid); + g_test_add_data_func("/uuid/thritytwo2/str", &uuid_32_2, test_str); + g_test_add_data_func("/uuid/thirtytwo2/cmp", &uuid_32_2, test_cmp); + + for (i = 0; malformed[i]; i++) { + char *testpath; + + testpath = g_strdup_printf("/uuid/malformed/%s", malformed[i]); + g_test_add_data_func(testpath, malformed[i], test_malformed); + g_free(testpath); + } + + return g_test_run(); +} |