232 lines
7.1 KiB
C
232 lines
7.1 KiB
C
#include <unittest.h>
|
|
#include <lib/env.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
extern int do_printenv(int argc, void *);
|
|
extern void env_reset(void);
|
|
|
|
/* Before each test case is called, empty out the environment */
|
|
void test_env_suite_setup(void)
|
|
{
|
|
env_reset();
|
|
}
|
|
|
|
void test_env(uintptr_t context)
|
|
{
|
|
const uint8_t source[] =
|
|
"numvar=1234567890\0"
|
|
"truevar=true\0"
|
|
"falsevar=false\0"
|
|
"zerovar=0\0"
|
|
"strvar=hi mom 123=abc-_*\0"
|
|
"ethaddr=12:34:56:78:ab:cd\0"
|
|
"ipaddr=32.1.0.100\0"
|
|
"blacklisted=nocando\0"
|
|
"com.apple.System.hideme=hidden";
|
|
uint8_t ethaddr[6];
|
|
uint32_t ipaddr;
|
|
|
|
TEST_ASSERT_EQ(env_unserialize(source, sizeof(source)), 0);
|
|
|
|
// Test getting variables as strings
|
|
TEST_ASSERT_STR_EQ(env_get("numvar"), "1234567890");
|
|
TEST_ASSERT_STR_EQ(env_get("truevar"), "true");
|
|
TEST_ASSERT_STR_EQ(env_get("falsevar"), "false");
|
|
TEST_ASSERT_STR_EQ(env_get("zerovar"), "0");
|
|
TEST_ASSERT_STR_EQ(env_get("strvar"), "hi mom 123=abc-_*");
|
|
TEST_ASSERT_STR_EQ(env_get("ethaddr"), "12:34:56:78:ab:cd");
|
|
TEST_ASSERT_STR_EQ(env_get("ipaddr"), "32.1.0.100");
|
|
TEST_ASSERT_STR_EQ(env_get("com.apple.System.hideme"), "hidden");
|
|
|
|
// Test getting variables as booleans
|
|
TEST_ASSERT_EQ(env_get_bool("truevar", false), true);
|
|
TEST_ASSERT_EQ(env_get_bool("truevar", true), true);
|
|
TEST_ASSERT_EQ(env_get_bool("falsevar", false), false);
|
|
TEST_ASSERT_EQ(env_get_bool("falsevar", true), false);
|
|
TEST_ASSERT_EQ(env_get_bool("zerovar", false), false);
|
|
TEST_ASSERT_EQ(env_get_bool("zerovar", true), false);
|
|
TEST_ASSERT_EQ(env_get_bool("numvar", false), true);
|
|
TEST_ASSERT_EQ(env_get_bool("numvar", true), true);
|
|
TEST_ASSERT_EQ(env_get_bool("strvar", false), false);
|
|
TEST_ASSERT_EQ(env_get_bool("strvar", true), false);
|
|
// Test default value for env_get_bool
|
|
TEST_ASSERT_EQ(env_get_bool("notavar", true), true);
|
|
TEST_ASSERT_EQ(env_get_bool("notavar", false), false);
|
|
|
|
// Test getting variables as numbers
|
|
TEST_ASSERT_EQ(env_get_uint("numvar", 0), 1234567890ULL);
|
|
// Test default value for env_get_uint
|
|
TEST_ASSERT_EQ(env_get_uint("notavar", 123456), 123456);
|
|
|
|
// Test getting variables as MAC addresses
|
|
TEST_ASSERT_EQ(env_get_ethaddr("ethaddr", ethaddr), 0);
|
|
TEST_ASSERT_MEM_EQ(ethaddr, TEST_ARRAY(uint8_t, 0x12, 0x34, 0x56, 0x78, 0xab, 0xcd), sizeof(ethaddr));
|
|
// Test rejecting malformed MAC addresses
|
|
TEST_ASSERT_NEQ(env_get_ethaddr("strvar", ethaddr), 0);
|
|
TEST_ASSERT_NEQ(env_get_ethaddr("numvar", ethaddr), 0);
|
|
TEST_ASSERT_NEQ(env_get_ethaddr("notavar", ethaddr), 0);
|
|
|
|
// Test getting variables as IP addresses
|
|
TEST_ASSERT_EQ(env_get_ipaddr("ipaddr", &ipaddr), 0);
|
|
TEST_ASSERT_EQ(ipaddr, 0x64000120);
|
|
|
|
// Test getting a blacklisted variable fails
|
|
TEST_ASSERT_NULL(env_get("blacklisted"));
|
|
|
|
// Test setting a non-persistent variable
|
|
TEST_ASSERT_EQ(env_set("temp", "don't save me", 0), 0);
|
|
TEST_ASSERT_STR_EQ(env_get("temp"), "don't save me");
|
|
|
|
// Test setting a persistent variable
|
|
TEST_ASSERT_EQ(env_set("persist", "save this var", ENV_PERSISTENT), 0);
|
|
TEST_ASSERT_STR_EQ(env_get("persist"), "save this var");
|
|
|
|
// Test env_set_uint
|
|
TEST_ASSERT_EQ(env_set_uint("uint", 0xabcd1234, 0), 0);
|
|
TEST_ASSERT_EQ(env_get_uint("uint", 0), 0xabcd1234);
|
|
|
|
// Test overwriting a persistent variable
|
|
TEST_ASSERT_EQ(env_set("overwrite", "will not be saved", ENV_PERSISTENT), 0);
|
|
TEST_ASSERT_STR_EQ(env_get("overwrite"), "will not be saved");
|
|
TEST_ASSERT_EQ(env_set("overwrite", "save this value", ENV_PERSISTENT), 0);
|
|
TEST_ASSERT_STR_EQ(env_get("overwrite"), "save this value");
|
|
|
|
// Test unsetting a value
|
|
TEST_ASSERT_EQ(env_set("unset", "about to unset", ENV_PERSISTENT), 0);
|
|
TEST_ASSERT_STR_EQ(env_get("unset"), "about to unset");
|
|
TEST_ASSERT_EQ(env_unset("unset"), 1);
|
|
TEST_ASSERT_NULL(env_get("unset"));
|
|
// unsetting a non-existant variable should fail
|
|
TEST_ASSERT_EQ(env_unset("unset"), 0);
|
|
|
|
// Test serializing - everything from the source should be serialized,
|
|
// plus persistent variables set with env_set
|
|
const uint8_t expected[] =
|
|
"numvar=1234567890\0"
|
|
"truevar=true\0"
|
|
"falsevar=false\0"
|
|
"zerovar=0\0"
|
|
"strvar=hi mom 123=abc-_*\0"
|
|
"ethaddr=12:34:56:78:ab:cd\0"
|
|
"ipaddr=32.1.0.100\0"
|
|
"blacklisted=nocando\0"
|
|
"com.apple.System.hideme=hidden\0"
|
|
"persist=save this var\0"
|
|
"overwrite=save this value";
|
|
|
|
uint8_t *serialized = malloc(sizeof(expected) * 2);
|
|
|
|
TEST_ASSERT_EQ(env_serialize(serialized, sizeof(expected) * 2), sizeof(expected));
|
|
TEST_ASSERT_MEM_EQ(serialized, expected, sizeof(expected));
|
|
|
|
memset(serialized, 0, sizeof(expected));
|
|
TEST_ASSERT_EQ(env_serialize(serialized, sizeof(expected) + 1), sizeof(expected));
|
|
TEST_ASSERT_MEM_EQ(serialized, expected, sizeof(expected));
|
|
|
|
// Too small buffer should fail serialization
|
|
TEST_ASSERT_EQ(env_serialize(serialized, sizeof(expected) - 1), 0);
|
|
}
|
|
|
|
void test_env_max_len_var(uintptr_t context)
|
|
{
|
|
int result;
|
|
size_t serialized_len;
|
|
const char *long_var =
|
|
"0001020304050607"
|
|
"08090a0b0c0d0e0f"
|
|
"1011121314151617"
|
|
"18191a1b1c1d1e1f"
|
|
"2021222324252627"
|
|
"28292a2b2c2d2e2f"
|
|
"3031323334353637"
|
|
"38393a3b3c3d3e3f"
|
|
"4041424344454647"
|
|
"48494a4b4c4d4e4f"
|
|
"5051525354555657"
|
|
"58595a5b5c5d5e5f"
|
|
"6061626364656667"
|
|
"68696a6b6c6d6e6f"
|
|
"7071727374757677"
|
|
"78797a7b7c7d7e_";
|
|
|
|
const uint8_t expected[] =
|
|
"testvar="
|
|
"0001020304050607"
|
|
"08090a0b0c0d0e0f"
|
|
"1011121314151617"
|
|
"18191a1b1c1d1e1f"
|
|
"2021222324252627"
|
|
"28292a2b2c2d2e2f"
|
|
"3031323334353637"
|
|
"38393a3b3c3d3e3f"
|
|
"4041424344454647"
|
|
"48494a4b4c4d4e4f"
|
|
"5051525354555657"
|
|
"58595a5b5c5d5e5f"
|
|
"6061626364656667"
|
|
"68696a6b6c6d6e6f"
|
|
"7071727374757677"
|
|
"78797a7b7c7d7e_"
|
|
"\0testvar2=abc";
|
|
|
|
// Setting the variable should succeed
|
|
result = env_set("testvar", long_var, ENV_PERSISTENT);
|
|
TEST_ASSERT_EQ(result, 0);
|
|
|
|
// Add a dummy variable after testvar for serialization test
|
|
result = env_set("testvar2", "abc", ENV_PERSISTENT);
|
|
TEST_ASSERT_EQ(result, 0);
|
|
|
|
// The variable should read back correctly
|
|
TEST_ASSERT_STR_EQ(env_get("testvar"), long_var);
|
|
|
|
// The variable should serialize correctly
|
|
uint8_t *serialized = malloc(sizeof(expected) * 2);
|
|
serialized_len = env_serialize(serialized, sizeof(expected) * 2);
|
|
TEST_ASSERT_EQ(serialized_len, sizeof(expected));
|
|
TEST_ASSERT_MEM_EQ(serialized, expected, sizeof(expected));
|
|
|
|
// Clear out the environment to prepare for deserialization
|
|
env_reset();
|
|
|
|
// Make sure the environment really was cleared
|
|
TEST_ASSERT_NULL(env_get("testvar"));
|
|
TEST_ASSERT_NULL(env_get("testvar2"));
|
|
|
|
// Now load the environment back in from the serialized buffer
|
|
result = env_unserialize(serialized, serialized_len);
|
|
TEST_ASSERT_EQ(result, 0);
|
|
|
|
// And make sure everything came through OK
|
|
TEST_ASSERT_STR_EQ(env_get("testvar"), long_var);
|
|
TEST_ASSERT_STR_EQ(env_get("testvar2"), "abc");
|
|
}
|
|
|
|
bool env_blacklist(const char *name, bool write)
|
|
{
|
|
if (strcmp(name, "set-blacklisted") == 0)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
bool env_blacklist_nvram(const char *name)
|
|
{
|
|
if (strcmp(name, "blacklisted") == 0)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
static struct test_suite env_test_suite = {
|
|
.name = "env",
|
|
.description = "tests the environment module",
|
|
.setup_function = test_env_suite_setup,
|
|
.test_cases = {
|
|
{ "env", test_env, 0 },
|
|
{ "env_max_len_var", test_env_max_len_var, 0 },
|
|
TEST_CASE_LAST
|
|
}
|
|
};
|
|
|
|
TEST_SUITE(env_test_suite);
|