1d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati#include <gtest/gtest.h> 2d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 3ee2aa45def216a3c4d6a23481fa96f1b02a5de8cZach Johnson#include "AllocationTestHarness.h" 4ee2aa45def216a3c4d6a23481fa96f1b02a5de8cZach Johnson 5c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov#include "osi/include/config.h" 6d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 7d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavatistatic const char CONFIG_FILE[] = "/data/local/tmp/config_test.conf"; 8d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavatistatic const char CONFIG_FILE_CONTENT[] = 9b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson " \n\ 10d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavatifirst_key=value \n\ 11d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati \n\ 12d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Device ID (DID) configuration \n\ 13d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati[DID] \n\ 14d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati \n\ 15d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Record Number: 1, 2 or 3 - maximum of 3 records \n\ 16d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatirecordNumber = 1 \n\ 17d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati \n\ 18d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Primary Record - true or false (default) \n\ 19d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# There can be only one primary record \n\ 20d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiprimaryRecord = true \n\ 21d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati \n\ 22d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Vendor ID '0xFFFF' indicates no Device ID Service Record is present in the device \n\ 23d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# 0x000F = Broadcom Corporation (default) \n\ 24d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati#vendorId = 0x000F \n\ 25d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati \n\ 26d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Vendor ID Source \n\ 27d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# 0x0001 = Bluetooth SIG assigned Device ID Vendor ID value (default) \n\ 28d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# 0x0002 = USB Implementer's Forum assigned Device ID Vendor ID value \n\ 29d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati#vendorIdSource = 0x0001 \n\ 30d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati \n\ 31d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Product ID & Product Version \n\ 32d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Per spec DID v1.3 0xJJMN for version is interpreted as JJ.M.N \n\ 33d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# JJ: major version number, M: minor version number, N: sub-minor version number \n\ 34d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# For example: 1200, v14.3.6 \n\ 35d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiproductId = 0x1200 \n\ 36d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavativersion = 0x1111 \n\ 37d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati \n\ 38d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Optional attributes \n\ 39d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati#clientExecutableURL = \n\ 40d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati#serviceDescription = \n\ 41d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati#documentationURL = \n\ 42d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati \n\ 43d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati# Additional optional DID records. Bluedroid supports up to 3 records. \n\ 44d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati[DID] \n\ 45d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati[DID] \n\ 46d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavativersion = 0x1436 \n\ 471c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski \n\ 481c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub PawlowskiHiSyncId = 18446744073709551615 \n\ 491c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub PawlowskiHiSyncId2 = 15001900 \n\ 50d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati"; 51d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 52ee2aa45def216a3c4d6a23481fa96f1b02a5de8cZach Johnsonclass ConfigTest : public AllocationTestHarness { 53b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson protected: 54b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson virtual void SetUp() { 55b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson AllocationTestHarness::SetUp(); 56b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson FILE* fp = fopen(CONFIG_FILE, "wt"); 57b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson fwrite(CONFIG_FILE_CONTENT, 1, sizeof(CONFIG_FILE_CONTENT), fp); 58b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson fclose(fp); 59b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson } 60d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati}; 61d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 627f280eb2f5f674e0329e21e0babe459a8b205b3fSharvil NanavatiTEST_F(ConfigTest, config_new_empty) { 63f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new_empty(); 64f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config.get() != NULL); 657f280eb2f5f674e0329e21e0babe459a8b205b3fSharvil Nanavati} 667f280eb2f5f674e0329e21e0babe459a8b205b3fSharvil Nanavati 67d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_new_no_file) { 68f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new("/meow"); 69f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config.get() == NULL); 70d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 71d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 72d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_new) { 73f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 74f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config.get() != NULL); 75d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 76d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 774cef24d88eb14396011bf31a185d4cab9d0254aaMarie JanssenTEST_F(ConfigTest, config_new_clone) { 78f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 79f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> clone = config_new_clone(*config); 80d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen 81f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski config_set_string(clone.get(), CONFIG_DEFAULT_SECTION, "first_key", 82f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski "not_value"); 83d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen 84f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::string one = std::string("one"); 85b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson EXPECT_STRNE( 86f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski config_get_string(*config, CONFIG_DEFAULT_SECTION, "first_key", &one) 87f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski ->c_str(), 88f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski config_get_string(*clone, CONFIG_DEFAULT_SECTION, "first_key", &one) 89f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski ->c_str()); 90d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen} 91d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen 92d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_has_section) { 93f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 94f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_has_section(*config, "DID")); 95d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 96d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 97d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_has_key_in_default_section) { 98f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 99f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_has_key(*config, CONFIG_DEFAULT_SECTION, "first_key")); 100b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson EXPECT_STREQ( 101f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski config_get_string(*config, CONFIG_DEFAULT_SECTION, "first_key", nullptr) 102f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski ->c_str(), 103b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson "value"); 104d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 105d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 106d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_has_keys) { 107f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 108f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_has_key(*config, "DID", "recordNumber")); 109f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_has_key(*config, "DID", "primaryRecord")); 110f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_has_key(*config, "DID", "productId")); 111f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_has_key(*config, "DID", "version")); 112d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 113d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 114d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_no_bad_keys) { 115f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 116f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_FALSE(config_has_key(*config, "DID_BAD", "primaryRecord")); 117f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_FALSE(config_has_key(*config, "DID", "primaryRecord_BAD")); 118f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_FALSE( 119f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski config_has_key(*config, CONFIG_DEFAULT_SECTION, "primaryRecord")); 120d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 121d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 122d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_get_int_version) { 123f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 124f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_EQ(config_get_int(*config, "DID", "version", 0), 0x1436); 125d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 126d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 127d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_get_int_default) { 128f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 129f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_EQ(config_get_int(*config, "DID", "primaryRecord", 123), 123); 130d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 13136c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 1321c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub PawlowskiTEST_F(ConfigTest, config_get_uint64) { 1331c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 1341c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski EXPECT_EQ(config_get_uint64(*config, "DID", "HiSyncId", 0), 1351c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski 0xFFFFFFFFFFFFFFFF); 1361c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski EXPECT_EQ(config_get_uint64(*config, "DID", "HiSyncId2", 0), 1371c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski uint64_t(15001900)); 1381c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski} 1391c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski 1401c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub PawlowskiTEST_F(ConfigTest, config_get_uint64_default) { 1411c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 1421c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski EXPECT_EQ(config_get_uint64(*config, "DID", "primaryRecord", 123), 1431c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski uint64_t(123)); 1441c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski} 1451c5e31a2be2343ea3da95bb09cd328e36cd0457aJakub Pawlowski 14636c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_remove_section) { 147f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 148f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_remove_section(config.get(), "DID")); 149f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_FALSE(config_has_section(*config, "DID")); 150f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_FALSE(config_has_key(*config, "DID", "productId")); 15136c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 15236c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 15336c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_remove_section_missing) { 154f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 155f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_FALSE(config_remove_section(config.get(), "not a section")); 15636c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 15736c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 15836c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_remove_key) { 159f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 160f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_EQ(config_get_int(*config, "DID", "productId", 999), 0x1200); 161f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_remove_key(config.get(), "DID", "productId")); 162f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_FALSE(config_has_key(*config, "DID", "productId")); 16336c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 16436c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 16536c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_remove_key_missing) { 166f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 167f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_EQ(config_get_int(*config, "DID", "productId", 999), 0x1200); 168f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_remove_key(config.get(), "DID", "productId")); 169f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_EQ(config_get_int(*config, "DID", "productId", 999), 999); 17036c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 17136c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 17236c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_save_basic) { 173f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski std::unique_ptr<config_t> config = config_new(CONFIG_FILE); 174f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski EXPECT_TRUE(config_save(*config, CONFIG_FILE)); 17536c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 176