51 "V4,dev-type tun,link-mtu 1457,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
57 "V4,dev-type tun,link-mtu 1458,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server,comp-lzo");
61 "V4,dev-type tun,link-mtu 2,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
65 assert_string_equal(input, output);
68 input =
"V4,dev-type tun";
71 assert_string_equal(input, output);
75 "V4,dev-type tun,link-mtu 999,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
81 "V4,dev-type tun,link-mtu 1000,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server,comp-lzo");
91 const char *teststr =
"TEMP:There are no flags here [really not]";
94 assert_string_equal(
msg,
"There are no flags here [really not]");
102 const char *teststr =
"[backoff 42,advance no]";
105 assert_string_equal(
msg,
"");
115 const char *teststr =
"[advance remote,backoff 77]:go round and round";
118 assert_string_equal(
msg,
"go round and round");
133 const char *str = (
const char *)
key;
134 const uint32_t len = (uint32_t)strlen(str);
135 return hash_func((
const uint8_t *)str, len, iv);
141 return strcmp((
const char *)key1, (
const char *)
key2) == 0;
148 return (uint32_t)rand();
184 char wordfile[PATH_MAX] = { 0 };
187 FILE *words = fopen(wordfile,
"r");
188 assert_non_null(words);
198 if (!fgets(buf,
sizeof(buf), words))
209 if (isalnum(c) || c ==
'_')
211 assert_true(wbi < (
int)
sizeof(wordbuf));
220 ASSERT(wbi < (
int)
sizeof(wordbuf));
221 wordbuf[wbi++] =
'\0';
230 assert_string_equal(w->
word, wordbuf);
250 assert_int_equal(wordcount, 2971);
276 if (!strcmp(w->
word,
"is"))
278 assert_int_equal(w->
n, 49);
280 else if (!strcmp(w->
word,
"redistribute"))
282 assert_int_equal(w->
n, 5);
284 else if (!strcmp(w->
word,
"circumstances"))
286 assert_int_equal(w->
n, 1);
288 else if (!strcmp(w->
word,
"so"))
290 assert_int_equal(w->
n, 8);
292 else if (!strcmp(w->
word,
"BECAUSE"))
294 assert_int_equal(w->
n, 1);
353 assert_int_equal(
atoi_warn(
"1234", msglevel), 1234);
354 assert_int_equal(
atoi_warn(
"0", msglevel), 0);
355 assert_int_equal(
atoi_warn(
"-1194", msglevel), -1194);
358 assert_true(
atoi_constrained(
"1234", ¶meter,
"test", 0, INT_MAX, msglevel));
359 assert_int_equal(parameter, 1234);
361 assert_int_equal(parameter, 0);
362 assert_true(
atoi_constrained(
"-1194", ¶meter,
"test", INT_MIN, INT_MAX, msglevel));
363 assert_int_equal(parameter, -1194);
365 int64_t parameter64 = 0;
366 assert_true(
positive_atoll(
"1234", ¶meter64,
"test", msglevel));
367 assert_int_equal(parameter64, 1234);
369 assert_int_equal(parameter64, 0);
370 assert_true(
positive_atoll(
"2147483653", ¶meter64,
"test", msglevel));
371 assert_int_equal(parameter64, 2147483653);
373 assert_true(
positive_atoll(
"9223372036854775810", ¶meter64,
"test", msglevel));
374 assert_int_equal(parameter64, 9223372036854775807);
378 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '-1234' as non-negative integer");
383 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '2147483653' as non-negative integer");
386 assert_int_equal(
atoi_warn(
"2147483653", msglevel), 0);
387 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '2147483653' as integer");
391 assert_false(
atoi_constrained(
"2147483653", ¶meter,
"test", 0, INT_MAX, msglevel));
392 assert_string_equal(
mock_msg_buf,
"test: Cannot parse '2147483653' as integer");
393 assert_int_equal(parameter, -42);
397 assert_string_equal(
mock_msg_buf,
"Cannot parse argument 'foo77' as non-negative integer");
401 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '77foo' as non-negative integer");
405 assert_false(
atoi_constrained(
"foo77", ¶meter,
"test", 0, INT_MAX, msglevel));
406 assert_string_equal(
mock_msg_buf,
"test: Cannot parse 'foo77' as integer");
407 assert_int_equal(parameter, -42);
411 assert_false(
atoi_constrained(
"77foo", ¶meter,
"test", 0, INT_MAX, msglevel));
412 assert_string_equal(
mock_msg_buf,
"test: Cannot parse '77foo' as integer");
413 assert_int_equal(parameter, -42);
416 assert_int_equal(
atoi_warn(
"foo77", msglevel), 0);
417 assert_string_equal(
mock_msg_buf,
"Cannot parse argument 'foo77' as integer");
420 assert_int_equal(
atoi_warn(
"77foo", msglevel), 0);
421 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '77foo' as integer");
427 assert_string_equal(
mock_msg_buf,
"test: Must be an integer between 0 and 76, not 77");
428 assert_int_equal(parameter, -42);
432 assert_false(
atoi_constrained(
"-77", ¶meter,
"test", -76, 76, msglevel));
433 assert_string_equal(
mock_msg_buf,
"test: Must be an integer between -76 and 76, not -77");
434 assert_int_equal(parameter, -42);
438 assert_false(
atoi_constrained(
"-77", ¶meter,
"test", 0, INT_MAX, msglevel));
439 assert_string_equal(
mock_msg_buf,
"test: Must be an integer >= 0, not -77");
440 assert_int_equal(parameter, -42);
444 assert_false(
atoi_constrained(
"0", ¶meter,
"test", 1, INT_MAX, msglevel));
445 assert_string_equal(
mock_msg_buf,
"test: Must be an integer >= 1, not 0");
446 assert_int_equal(parameter, -42);
456 assert_true(
win_path_in_dir(L
"C:\\openvpn_plugins\\foo.dll", L
"C:\\openvpn_plugins"));
459 assert_false(
win_path_in_dir(L
"C:\\openvpn_plugins_evil\\foo.dll", L
"C:\\openvpn_plugins"));
462 assert_true(
win_path_in_dir(L
"C:\\openvpn_plugins\\foo.dll", L
"C:\\openvpn_plugins\\"));
463 assert_false(
win_path_in_dir(L
"C:\\openvpn_plugins_evil\\foo.dll", L
"C:\\openvpn_plugins\\"));
466 assert_true(
win_path_in_dir(L
"C:\\openvpn_plugins/foo.dll", L
"C:\\openvpn_plugins"));
469 assert_true(
win_path_in_dir(L
"c:\\OPENVPN_PLUGINS\\foo.dll", L
"C:\\openvpn_plugins"));
472 assert_false(
win_path_in_dir(L
"C:\\openvpn_plugins", L
"C:\\openvpn_plugins"));
475 assert_true(
win_path_in_dir(L
"C:\\openvpn_plugins\\sub\\foo.dll", L
"C:\\openvpn_plugins"));
498 return cmocka_run_group_tests(
misc_tests, NULL, NULL);
char * string_alloc(const char *str, struct gc_arena *gc)
#define ALLOC_OBJ_GC(dptr, type, gc)
static void gc_free(struct gc_arena *a)
static struct gc_arena gc_new(void)
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, const uint32_t iv, uint64_t(*hash_function)(const void *key, uint32_t iv), 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...
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 uint32_t get_random(void)
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 uint64_t word_hash_function(const void *key, uint32_t iv)
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)
bool win_path_in_dir(const WCHAR *path, const WCHAR *dir)
Check whether path resides within directory dir.