54 "V4,dev-type tun,link-mtu 1457,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
60 "V4,dev-type tun,link-mtu 1458,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server,comp-lzo");
64 "V4,dev-type tun,link-mtu 2,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
68 assert_string_equal(input, output);
71 input =
"V4,dev-type tun";
74 assert_string_equal(input, output);
78 "V4,dev-type tun,link-mtu 999,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
84 "V4,dev-type tun,link-mtu 1000,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server,comp-lzo");
94 const char *teststr =
"TEMP:There are no flags here [really not]";
97 assert_string_equal(
msg,
"There are no flags here [really not]");
105 const char *teststr =
"[backoff 42,advance no]";
108 assert_string_equal(
msg,
"");
118 const char *teststr =
"[advance remote,backoff 77]:go round and round";
121 assert_string_equal(
msg,
"go round and round");
136 const char *str = (
const char *)
key;
137 const uint32_t len = (uint32_t)strlen(str);
138 return hash_func((
const uint8_t *)str, len, *(uint32_t *)(hash_key));
144 return strcmp((
const char *)key1, (
const char *)
key2) == 0;
179 char wordfile[PATH_MAX] = { 0 };
182 FILE *words = fopen(wordfile,
"r");
183 assert_non_null(words);
193 if (!fgets(buf,
sizeof(buf), words))
204 if (isalnum(c) || c ==
'_')
206 assert_true(wbi < (
int)
sizeof(wordbuf));
215 ASSERT(wbi < (
int)
sizeof(wordbuf));
216 wordbuf[wbi++] =
'\0';
225 assert_string_equal(w->
word, wordbuf);
245 assert_int_equal(wordcount, 2971);
271 if (!strcmp(w->
word,
"is"))
273 assert_int_equal(w->
n, 49);
275 else if (!strcmp(w->
word,
"redistribute"))
277 assert_int_equal(w->
n, 5);
279 else if (!strcmp(w->
word,
"circumstances"))
281 assert_int_equal(w->
n, 1);
283 else if (!strcmp(w->
word,
"so"))
285 assert_int_equal(w->
n, 8);
287 else if (!strcmp(w->
word,
"BECAUSE"))
289 assert_int_equal(w->
n, 1);
348 assert_int_equal(
atoi_warn(
"1234", msglevel), 1234);
349 assert_int_equal(
atoi_warn(
"0", msglevel), 0);
350 assert_int_equal(
atoi_warn(
"-1194", msglevel), -1194);
353 assert_true(
atoi_constrained(
"1234", ¶meter,
"test", 0, INT_MAX, msglevel));
354 assert_int_equal(parameter, 1234);
356 assert_int_equal(parameter, 0);
357 assert_true(
atoi_constrained(
"-1194", ¶meter,
"test", INT_MIN, INT_MAX, msglevel));
358 assert_int_equal(parameter, -1194);
360 int64_t parameter64 = 0;
361 assert_true(
positive_atoll(
"1234", ¶meter64,
"test", msglevel));
362 assert_int_equal(parameter64, 1234);
364 assert_int_equal(parameter64, 0);
365 assert_true(
positive_atoll(
"2147483653", ¶meter64,
"test", msglevel));
366 assert_int_equal(parameter64, 2147483653);
368 assert_true(
positive_atoll(
"9223372036854775810", ¶meter64,
"test", msglevel));
369 assert_int_equal(parameter64, 9223372036854775807);
373 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '-1234' as non-negative integer");
378 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '2147483653' as non-negative integer");
381 assert_int_equal(
atoi_warn(
"2147483653", msglevel), 0);
382 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '2147483653' as integer");
386 assert_false(
atoi_constrained(
"2147483653", ¶meter,
"test", 0, INT_MAX, msglevel));
387 assert_string_equal(
mock_msg_buf,
"test: Cannot parse '2147483653' as integer");
388 assert_int_equal(parameter, -42);
392 assert_string_equal(
mock_msg_buf,
"Cannot parse argument 'foo77' as non-negative integer");
396 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '77foo' as non-negative integer");
400 assert_false(
atoi_constrained(
"foo77", ¶meter,
"test", 0, INT_MAX, msglevel));
401 assert_string_equal(
mock_msg_buf,
"test: Cannot parse 'foo77' as integer");
402 assert_int_equal(parameter, -42);
406 assert_false(
atoi_constrained(
"77foo", ¶meter,
"test", 0, INT_MAX, msglevel));
407 assert_string_equal(
mock_msg_buf,
"test: Cannot parse '77foo' as integer");
408 assert_int_equal(parameter, -42);
411 assert_int_equal(
atoi_warn(
"foo77", msglevel), 0);
412 assert_string_equal(
mock_msg_buf,
"Cannot parse argument 'foo77' as integer");
415 assert_int_equal(
atoi_warn(
"77foo", msglevel), 0);
416 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '77foo' as integer");
422 assert_string_equal(
mock_msg_buf,
"test: Must be an integer between 0 and 76, not 77");
423 assert_int_equal(parameter, -42);
427 assert_false(
atoi_constrained(
"-77", ¶meter,
"test", -76, 76, msglevel));
428 assert_string_equal(
mock_msg_buf,
"test: Must be an integer between -76 and 76, not -77");
429 assert_int_equal(parameter, -42);
433 assert_false(
atoi_constrained(
"-77", ¶meter,
"test", 0, INT_MAX, msglevel));
434 assert_string_equal(
mock_msg_buf,
"test: Must be an integer >= 0, not -77");
435 assert_int_equal(parameter, -42);
439 assert_false(
atoi_constrained(
"0", ¶meter,
"test", 1, INT_MAX, msglevel));
440 assert_string_equal(
mock_msg_buf,
"test: Must be an integer >= 1, not 0");
441 assert_int_equal(parameter, -42);
451 assert_true(
win_path_in_dir(L
"C:\\openvpn_plugins\\foo.dll", L
"C:\\openvpn_plugins"));
454 assert_false(
win_path_in_dir(L
"C:\\openvpn_plugins_evil\\foo.dll", L
"C:\\openvpn_plugins"));
457 assert_true(
win_path_in_dir(L
"C:\\openvpn_plugins\\foo.dll", L
"C:\\openvpn_plugins\\"));
458 assert_false(
win_path_in_dir(L
"C:\\openvpn_plugins_evil\\foo.dll", L
"C:\\openvpn_plugins\\"));
461 assert_true(
win_path_in_dir(L
"C:\\openvpn_plugins/foo.dll", L
"C:\\openvpn_plugins"));
464 assert_true(
win_path_in_dir(L
"c:\\OPENVPN_PLUGINS\\foo.dll", L
"C:\\openvpn_plugins"));
467 assert_false(
win_path_in_dir(L
"C:\\openvpn_plugins", L
"C:\\openvpn_plugins"));
470 assert_true(
win_path_in_dir(L
"C:\\openvpn_plugins\\sub\\foo.dll", L
"C:\\openvpn_plugins"));
494 return cmocka_run_group_tests(
misc_tests, NULL, NULL);
char * string_alloc(const char *str, struct gc_arena *gc)
Duplicate a string, allocating memory under garbage collection.
#define ALLOC_OBJ_GC(dptr, type, gc)
Allocate a garbage-collected object of the given type (uninitialised).
static void gc_free(struct gc_arena *a)
Free all allocations in a garbage collection arena.
static struct gc_arena gc_new(void)
Allocate and return a new, empty garbage collection arena.
int64_t get_random(void)
an analogue to the random() function, but use prng_bytes and also int64_t instead of long to avoid LL...
Data Channel Cryptography Module.
void hash_iterator_free(struct hash_iterator *hi)
struct hash_element * hash_iterator_next(struct hash_iterator *hi)
void hash_iterator_init(struct hash *hash, struct hash_iterator *hi)
struct hash * hash_init(const uint32_t n_buckets, uint64_t(*hash_function)(const void *key, const uint8_t hash_key[HASH_KEY_LEN]), bool(*compare_function)(const void *key1, const void *key2))
void hash_free(struct hash *hash)
bool hash_add(struct hash *hash, const void *key, void *value, bool replace)
void hash_remove_by_value(struct hash *hash, void *value)
void hash_iterator_init_range(struct hash *hash, struct hash_iterator *hi, uint32_t start_bucket, uint32_t end_bucket)
uint64_t hash_func(const uint8_t *k, uint32_t length, uint32_t initval)
static bool hash_remove(struct hash *hash, const void *key)
static void * hash_lookup(struct hash *hash, const void *key)
static uint32_t hash_n_elements(const struct hash *hash)
static uint32_t hash_n_buckets(const struct hash *hash)
msglvl_t mock_get_debug_level(void)
void mock_set_debug_level(msglvl_t level)
Mock debug level defaults to 0, which gives clean(-ish) test reports.
char mock_msg_buf[MOCK_MSG_BUF]
int atoi_warn(const char *str, msglvl_t msglevel)
Converts a str to an integer if the string can be represented as an integer number.
int positive_atoi(const char *str, msglvl_t msglevel)
Converts a str to a positive number if the string represents a postive integer number.
bool positive_atoll(const char *str, int64_t *value, const char *name, msglvl_t msglevel)
Converts a str to an integer if the string can be represented as an integer number and is >= 0.
const char * parse_auth_failed_temp(struct options *o, const char *reason)
bool valid_integer(const char *str, bool positive)
Checks if the string is a valid integer by checking if it can be converted to an integer.
bool atoi_constrained(const char *str, int *value, const char *name, int min, int max, msglvl_t msglevel)
Converts a str to an integer if the string can be represented as an integer number and is between min...
const char * options_string_compat_lzo(const char *options, struct gc_arena *gc)
Takes a locally produced OCC string for TLS server mode and modifies as if the option comp-lzo was en...
Garbage collection arena used to keep track of dynamically allocated memory.
Container for bidirectional cipher and HMAC key material.
Container for unidirectional cipher and HMAC key material.
static void openvpn_unit_test_setup(void)
Sets up the environment for unit tests like making both stderr and stdout non-buffered to avoid messa...
static void openvpn_test_get_srcdir_dir(char *buf, size_t bufsize, const char *filename)
Helper function to get a file path from the unit test directory to open it or pass its path to anothe...
static uint64_t word_hash_function(const void *key, const uint8_t hash_key[HASH_KEY_LEN])
static void test_win_path_in_dir(void **state)
static void test_atoi_variants(void **state)
static void test_auth_fail_temp_flags(void **state)
static void test_compat_lzo_string(void **state)
static void test_list(void **state)
static void test_auth_fail_temp_no_flags(void **state)
const struct CMUnitTest misc_tests[]
static bool word_compare_function(const void *key1, const void *key2)
static struct hash_element * hash_lookup_by_value(struct hash *hash, void *value)
static void test_auth_fail_temp_flags_msg(void **state)
void schedule_test(void **state)
Runs the schedule test.
bool win_path_in_dir(const WCHAR *path, const WCHAR *dir)
Check whether path resides within directory dir.