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 uint32_t len = (uint32_t)strlen(str);
132 return hash_func((
const uint8_t *)str, len, iv);
138 return strcmp((
const char *)
key1, (
const char *)
key2) == 0;
145 return (uint32_t)rand();
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);
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);
362 int64_t parameter64 = 0;
363 assert_true(
positive_atoll(
"1234", ¶meter64,
"test", msglevel));
364 assert_int_equal(parameter64, 1234);
366 assert_int_equal(parameter64, 0);
367 assert_true(
positive_atoll(
"2147483653", ¶meter64,
"test", msglevel));
368 assert_int_equal(parameter64, 2147483653);
370 assert_true(
positive_atoll(
"9223372036854775810", ¶meter64,
"test", msglevel));
371 assert_int_equal(parameter64, 9223372036854775807);
375 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '-1234' as non-negative integer");
380 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '2147483653' as non-negative integer");
383 assert_int_equal(
atoi_warn(
"2147483653", msglevel), 0);
384 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '2147483653' as integer");
388 assert_false(
atoi_constrained(
"2147483653", ¶meter,
"test", 0, INT_MAX, msglevel));
389 assert_string_equal(
mock_msg_buf,
"test: Cannot parse '2147483653' as integer");
390 assert_int_equal(parameter, -42);
394 assert_string_equal(
mock_msg_buf,
"Cannot parse argument 'foo77' as non-negative integer");
398 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '77foo' as non-negative integer");
402 assert_false(
atoi_constrained(
"foo77", ¶meter,
"test", 0, INT_MAX, msglevel));
403 assert_string_equal(
mock_msg_buf,
"test: Cannot parse 'foo77' as integer");
404 assert_int_equal(parameter, -42);
408 assert_false(
atoi_constrained(
"77foo", ¶meter,
"test", 0, INT_MAX, msglevel));
409 assert_string_equal(
mock_msg_buf,
"test: Cannot parse '77foo' as integer");
410 assert_int_equal(parameter, -42);
413 assert_int_equal(
atoi_warn(
"foo77", msglevel), 0);
414 assert_string_equal(
mock_msg_buf,
"Cannot parse argument 'foo77' as integer");
417 assert_int_equal(
atoi_warn(
"77foo", msglevel), 0);
418 assert_string_equal(
mock_msg_buf,
"Cannot parse argument '77foo' as integer");
424 assert_string_equal(
mock_msg_buf,
"test: Must be an integer between 0 and 76, not 77");
425 assert_int_equal(parameter, -42);
429 assert_false(
atoi_constrained(
"-77", ¶meter,
"test", -76, 76, msglevel));
430 assert_string_equal(
mock_msg_buf,
"test: Must be an integer between -76 and 76, not -77");
431 assert_int_equal(parameter, -42);
435 assert_false(
atoi_constrained(
"-77", ¶meter,
"test", 0, INT_MAX, msglevel));
436 assert_string_equal(
mock_msg_buf,
"test: Must be an integer >= 0, not -77");
437 assert_int_equal(parameter, -42);
441 assert_false(
atoi_constrained(
"0", ¶meter,
"test", 1, INT_MAX, msglevel));
442 assert_string_equal(
mock_msg_buf,
"test: Must be an integer >= 1, not 0");
443 assert_int_equal(parameter, -42);
459 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 uint32_t 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))
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)
void hash_iterator_init_range(struct hash *hash, struct hash_iterator *hi, uint32_t start_bucket, uint32_t end_bucket)
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_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 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)