48 "V4,dev-type tun,link-mtu 1457,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
54 "V4,dev-type tun,link-mtu 1458,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server,comp-lzo");
58 "V4,dev-type tun,link-mtu 2,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
62 assert_string_equal(input, output);
65 input =
"V4,dev-type tun";
68 assert_string_equal(input, output);
72 "V4,dev-type tun,link-mtu 999,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server";
78 "V4,dev-type tun,link-mtu 1000,tun-mtu 1400,proto UDPv4,auth SHA1,keysize 128,key-method 2,tls-server,comp-lzo");
88 const char *teststr =
"TEMP:There are no flags here [really not]";
91 assert_string_equal(
msg,
"There are no flags here [really not]");
99 const char *teststr =
"[backoff 42,advance no]";
102 assert_string_equal(
msg,
"");
112 const char *teststr =
"[advance remote,backoff 77]:go round and round";
115 assert_string_equal(
msg,
"go round and round");
130 const char *str = (
const char *)
key;
131 const int len = strlen(str);
132 return hash_func((
const uint8_t *)str, len, iv);
138 return strcmp((
const char *)
key1, (
const char *)
key2) == 0;
181 char wordfile[PATH_MAX] = { 0 };
184 FILE *words = fopen(wordfile,
"r");
185 assert_non_null(words);
195 if (!fgets(buf,
sizeof(buf), words))
206 if (isalnum(c) || c ==
'_')
208 assert_true(wbi < (
int)
sizeof(wordbuf));
217 ASSERT(wbi < (
int)
sizeof(wordbuf));
218 wordbuf[wbi++] =
'\0';
227 assert_string_equal(w->
word, wordbuf);
247 assert_int_equal(wordcount, 2971);
273 if (!strcmp(w->
word,
"is"))
275 assert_int_equal(w->
n, 49);
277 else if (!strcmp(w->
word,
"redistribute"))
279 assert_int_equal(w->
n, 5);
281 else if (!strcmp(w->
word,
"circumstances"))
283 assert_int_equal(w->
n, 1);
285 else if (!strcmp(w->
word,
"so"))
287 assert_int_equal(w->
n, 8);
289 else if (!strcmp(w->
word,
"BECAUSE"))
291 assert_int_equal(w->
n, 1);
342 int msglevel =
D_LOW;
350 assert_int_equal(
atoi_warn(
"1234", msglevel), 1234);
351 assert_int_equal(
atoi_warn(
"0", msglevel), 0);
352 assert_int_equal(
atoi_warn(
"-1194", msglevel), -1194);
355 assert_true(
atoi_constrained(
"1234", ¶meter,
"test", 0, INT_MAX, msglevel));
356 assert_int_equal(parameter, 1234);
358 assert_int_equal(parameter, 0);
359 assert_true(
atoi_constrained(
"-1194", ¶meter,
"test", INT_MIN, INT_MAX, msglevel));
360 assert_int_equal(parameter, -1194);
364 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '-1234' as non-negative integer");
369 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '2147483653' as non-negative integer");
372 assert_int_equal(
atoi_warn(
"2147483653", msglevel), 0);
373 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '2147483653' as integer");
377 assert_false(
atoi_constrained(
"2147483653", ¶meter,
"test", 0, INT_MAX, msglevel));
378 assert_string_equal(
mock_msg_buf,
"test: Cannot parse '2147483653' as integer");
379 assert_int_equal(parameter, -42);
383 assert_string_equal(
mock_msg_buf,
"Cannot parse argument 'foo77' as non-negative integer");
387 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '77foo' as non-negative integer");
391 assert_false(
atoi_constrained(
"foo77", ¶meter,
"test", 0, INT_MAX, msglevel));
392 assert_string_equal(
mock_msg_buf,
"test: Cannot parse 'foo77' as integer");
393 assert_int_equal(parameter, -42);
397 assert_false(
atoi_constrained(
"77foo", ¶meter,
"test", 0, INT_MAX, msglevel));
398 assert_string_equal(
mock_msg_buf,
"test: Cannot parse '77foo' as integer");
399 assert_int_equal(parameter, -42);
402 assert_int_equal(
atoi_warn(
"foo77", msglevel), 0);
403 assert_string_equal(
mock_msg_buf,
"Cannot parse argument 'foo77' as integer");
406 assert_int_equal(
atoi_warn(
"77foo", msglevel), 0);
407 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '77foo' as integer");
413 assert_string_equal(
mock_msg_buf,
"test: Must be an integer between 0 and 76, not 77");
414 assert_int_equal(parameter, -42);
418 assert_false(
atoi_constrained(
"-77", ¶meter,
"test", -76, 76, msglevel));
419 assert_string_equal(
mock_msg_buf,
"test: Must be an integer between -76 and 76, not -77");
420 assert_int_equal(parameter, -42);
424 assert_false(
atoi_constrained(
"-77", ¶meter,
"test", 0, INT_MAX, msglevel));
425 assert_string_equal(
mock_msg_buf,
"test: Must be an integer >= 0, not -77");
426 assert_int_equal(parameter, -42);
430 assert_false(
atoi_constrained(
"0", ¶meter,
"test", 1, INT_MAX, msglevel));
431 assert_string_equal(
mock_msg_buf,
"test: Must be an integer >= 1, not 0");
432 assert_int_equal(parameter, -42);
448 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)
static const char *const key1
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 int n_buckets, const uint32_t iv, uint32_t(*hash_function)(const void *key, uint32_t iv), bool(*compare_function)(const void *key1, const void *key2))
void hash_iterator_init_range(struct hash *hash, struct hash_iterator *hi, int start_bucket, int end_bucket)
uint32_t hash_func(const uint8_t *k, uint32_t length, uint32_t initval)
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)
static bool hash_remove(struct hash *hash, const void *key)
static void * hash_lookup(struct hash *hash, const void *key)
static int hash_n_elements(const struct hash *hash)
static int hash_n_buckets(const struct hash *hash)
int mock_get_debug_level(void)
char mock_msg_buf[MOCK_MSG_BUF]
void mock_set_debug_level(int level)
Mock debug level defaults to 0, which gives clean(-ish) test reports.
bool atoi_constrained(const char *str, int *value, const char *name, int min, int max, int msglevel)
Converts a str to an integer if the string can be represented as an integer number and is between min...
int positive_atoi(const char *str, int msglevel)
Converts a str to a positive number if the string represents a postive integer number.
int atoi_warn(const char *str, int msglevel)
Converts a str to an integer if the string can be represented as an integer number.
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.
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 void test_atoi_variants(void **state)
static void test_auth_fail_temp_flags(void **state)
static void test_compat_lzo_string(void **state)
static uint32_t word_hash_function(const void *key, uint32_t iv)
static void test_list(void **state)
static void test_auth_fail_temp_no_flags(void **state)
const struct CMUnitTest misc_tests[]
static unsigned long get_random(void)
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)