config_test.cc revision b55040cc6448a8847490da807d2b6362aa8cb8d9
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\ 47d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati"; 48d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 49ee2aa45def216a3c4d6a23481fa96f1b02a5de8cZach Johnsonclass ConfigTest : public AllocationTestHarness { 50b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson protected: 51b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson virtual void SetUp() { 52b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson AllocationTestHarness::SetUp(); 53b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson FILE* fp = fopen(CONFIG_FILE, "wt"); 54b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson fwrite(CONFIG_FILE_CONTENT, 1, sizeof(CONFIG_FILE_CONTENT), fp); 55b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson fclose(fp); 56b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson } 57d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati}; 58d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 597f280eb2f5f674e0329e21e0babe459a8b205b3fSharvil NanavatiTEST_F(ConfigTest, config_new_empty) { 60b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new_empty(); 617f280eb2f5f674e0329e21e0babe459a8b205b3fSharvil Nanavati EXPECT_TRUE(config != NULL); 627f280eb2f5f674e0329e21e0babe459a8b205b3fSharvil Nanavati config_free(config); 637f280eb2f5f674e0329e21e0babe459a8b205b3fSharvil Nanavati} 647f280eb2f5f674e0329e21e0babe459a8b205b3fSharvil Nanavati 65d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_new_no_file) { 66b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new("/meow"); 67d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_TRUE(config == NULL); 68ee2aa45def216a3c4d6a23481fa96f1b02a5de8cZach Johnson config_free(config); 69d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 70d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 71d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_new) { 72b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 73d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_TRUE(config != NULL); 74d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati config_free(config); 75d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 76d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 77b55040cc6448a8847490da807d2b6362aa8cb8d9Myles WatsonTEST_F(ConfigTest, config_free_null) { config_free(NULL); } 78d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 794cef24d88eb14396011bf31a185d4cab9d0254aaMarie JanssenTEST_F(ConfigTest, config_new_clone) { 80b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 81b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* clone = config_new_clone(config); 82d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen 83d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen config_set_string(clone, CONFIG_DEFAULT_SECTION, "first_key", "not_value"); 84d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen 85b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson EXPECT_STRNE( 86b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_get_string(config, CONFIG_DEFAULT_SECTION, "first_key", "one"), 87b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_get_string(clone, CONFIG_DEFAULT_SECTION, "first_key", "one")); 88d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen 89d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen config_free(config); 90d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen config_free(clone); 91d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen} 92d9ebc239abf77a1133c3456db84444ccbc8d0fddMarie Janssen 93d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_has_section) { 94b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 95d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_TRUE(config_has_section(config, "DID")); 96d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati config_free(config); 97d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 98d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 99d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_has_key_in_default_section) { 100b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 101d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_TRUE(config_has_key(config, CONFIG_DEFAULT_SECTION, "first_key")); 102b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson EXPECT_STREQ( 103b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_get_string(config, CONFIG_DEFAULT_SECTION, "first_key", "meow"), 104b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson "value"); 105d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati config_free(config); 106d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 107d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 108d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_has_keys) { 109b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 110d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_TRUE(config_has_key(config, "DID", "recordNumber")); 111d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_TRUE(config_has_key(config, "DID", "primaryRecord")); 112d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_TRUE(config_has_key(config, "DID", "productId")); 113d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_TRUE(config_has_key(config, "DID", "version")); 114d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati config_free(config); 115d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 116d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 117d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_no_bad_keys) { 118b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 119d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_FALSE(config_has_key(config, "DID_BAD", "primaryRecord")); 120d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_FALSE(config_has_key(config, "DID", "primaryRecord_BAD")); 121d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_FALSE(config_has_key(config, CONFIG_DEFAULT_SECTION, "primaryRecord")); 122d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati config_free(config); 123d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 124d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 125d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_get_int_version) { 126b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 127d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_EQ(config_get_int(config, "DID", "version", 0), 0x1436); 128d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati config_free(config); 129d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 130d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati 131d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil NanavatiTEST_F(ConfigTest, config_get_int_default) { 132b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 133d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati EXPECT_EQ(config_get_int(config, "DID", "primaryRecord", 123), 123); 134d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati config_free(config); 135d1c453f4f9648bb5eef80df106e79e3f916f301cSharvil Nanavati} 13636c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 13736c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_remove_section) { 138b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 13936c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(config_remove_section(config, "DID")); 14036c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_FALSE(config_has_section(config, "DID")); 14136c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_FALSE(config_has_key(config, "DID", "productId")); 14236c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati config_free(config); 14336c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 14436c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 14536c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_remove_section_missing) { 146b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 14736c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_FALSE(config_remove_section(config, "not a section")); 14836c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati config_free(config); 14936c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 15036c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 15136c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_remove_key) { 152b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 15336c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_EQ(config_get_int(config, "DID", "productId", 999), 0x1200); 15436c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(config_remove_key(config, "DID", "productId")); 15536c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_FALSE(config_has_key(config, "DID", "productId")); 15636c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati config_free(config); 15736c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 15836c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 15936c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_remove_key_missing) { 160b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 16136c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_EQ(config_get_int(config, "DID", "productId", 999), 0x1200); 16236c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(config_remove_key(config, "DID", "productId")); 16336c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_EQ(config_get_int(config, "DID", "productId", 999), 999); 16436c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati config_free(config); 16536c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 16636c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 16736c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_section_begin) { 168b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 169b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson const config_section_node_t* section = config_section_begin(config); 17036c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(section != NULL); 171b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson const char* section_name = config_section_name(section); 17236c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(section != NULL); 17336c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(!strcmp(section_name, CONFIG_DEFAULT_SECTION)); 17436c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati config_free(config); 17536c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 17636c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 17736c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_section_next) { 178b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 179b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson const config_section_node_t* section = config_section_begin(config); 18036c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(section != NULL); 18136c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati section = config_section_next(section); 18236c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(section != NULL); 183b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson const char* section_name = config_section_name(section); 18436c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(section != NULL); 18536c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(!strcmp(section_name, "DID")); 18636c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati config_free(config); 18736c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 18836c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 18936c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_section_end) { 190b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 191b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson const config_section_node_t* section = config_section_begin(config); 19236c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati section = config_section_next(section); 19336c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati section = config_section_next(section); 19436c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_EQ(section, config_section_end(config)); 19536c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati config_free(config); 19636c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 19736c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati 19836c1c09593a58717c78497cd55c4ed1dcf52183eSharvil NanavatiTEST_F(ConfigTest, config_save_basic) { 199b55040cc6448a8847490da807d2b6362aa8cb8d9Myles Watson config_t* config = config_new(CONFIG_FILE); 20036c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati EXPECT_TRUE(config_save(config, CONFIG_FILE)); 20136c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati config_free(config); 20236c1c09593a58717c78497cd55c4ed1dcf52183eSharvil Nanavati} 203