| /* Copyright (c) 2016 Google, Inc. | 
 |  * Barret Rhoden <brho@cs.berkeley.edu> | 
 |  * See LICENSE for details. */ | 
 |  | 
 | #include <utest/utest.h> | 
 | #include <parlib/dtls.h> | 
 | #include <stdio.h> | 
 |  | 
 | TEST_SUITE("DTLS"); | 
 |  | 
 | /* <--- Begin definition of test cases ---> */ | 
 |  | 
 | bool test_get_without_set(void) | 
 | { | 
 | 	dtls_key_t key; | 
 | 	void *got_val; | 
 |  | 
 | 	key = dtls_key_create(0); | 
 | 	got_val = get_dtls(key); | 
 | 	UT_ASSERT_FMT("Expected 0, got %p", got_val == 0, 0, got_val); | 
 | 	destroy_dtls(); | 
 | 	return TRUE; | 
 | } | 
 |  | 
 | /* This catches a bug, but it had to have a set happen at some point. */ | 
 | bool test_get_after_reset(void) | 
 | { | 
 | 	dtls_key_t key; | 
 | 	void *set_val = (void*)0x15; | 
 | 	void *got_val; | 
 |  | 
 | 	key = dtls_key_create(0); | 
 | 	set_dtls(key, set_val); | 
 | 	destroy_dtls(); | 
 |  | 
 | 	key = dtls_key_create(0); | 
 | 	got_val = get_dtls(key); | 
 | 	UT_ASSERT_FMT("Expected 0, got %p", got_val == 0, 0, got_val); | 
 | 	destroy_dtls(); | 
 | 	return TRUE; | 
 | } | 
 |  | 
 | bool test_set_and_get(void) | 
 | { | 
 | 	dtls_key_t key; | 
 | 	void *set_val = (void*)0x15; | 
 | 	void *got_val; | 
 |  | 
 | 	key = dtls_key_create(0); | 
 | 	set_dtls(key, set_val); | 
 | 	got_val = get_dtls(key); | 
 | 	UT_ASSERT_FMT("Expected %p, got %p", got_val == set_val, set_val, got_val); | 
 | 	destroy_dtls(); | 
 | 	return TRUE; | 
 | } | 
 |  | 
 | bool test_set_twice(void) | 
 | { | 
 | 	dtls_key_t key; | 
 | 	void *set_val = (void*)0x15; | 
 | 	void *got_val; | 
 |  | 
 | 	key = dtls_key_create(0); | 
 | 	set_dtls(key, set_val); | 
 | 	set_dtls(key, set_val + 1); | 
 | 	destroy_dtls(); | 
 | 	return TRUE; | 
 | } | 
 |  | 
 | static dtls_key_t sfd_global_key; | 
 |  | 
 | static void setting_dtor(void *arg) | 
 | { | 
 | 	set_dtls(sfd_global_key, (void*)0xf00); | 
 | } | 
 |  | 
 | /* Users can set from a destructor.  In some implementations of pthread keys, | 
 |  * you can't safely set_specific from within a destructor without the risk of an | 
 |  * infinite loop or storage loss.  Our DTLS implementation shouldn't be doing | 
 |  * either, though we can't check for storage loss. */ | 
 | bool test_set_from_dtor(void) | 
 | { | 
 | 	void *set_val = (void*)0x15; | 
 |  | 
 | 	sfd_global_key = dtls_key_create(setting_dtor); | 
 | 	set_dtls(sfd_global_key, set_val); | 
 | 	destroy_dtls(); | 
 | 	return TRUE; | 
 | } | 
 |  | 
 | /* <--- End definition of test cases ---> */ | 
 |  | 
 | struct utest utests[] = { | 
 | 	UTEST_REG(get_without_set), | 
 | 	UTEST_REG(get_after_reset), | 
 | 	UTEST_REG(set_and_get), | 
 | 	UTEST_REG(set_twice), | 
 | 	UTEST_REG(set_from_dtor), | 
 | }; | 
 | int num_utests = sizeof(utests) / sizeof(struct utest); | 
 |  | 
 | int main(int argc, char *argv[]) | 
 | { | 
 | 	// Run test suite passing it all the args as whitelist of what tests to run. | 
 | 	char **whitelist = &argv[1]; | 
 | 	int whitelist_len = argc - 1; | 
 |  | 
 | 	RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len); | 
 | } |