blob: 14fe4506fc45f016d5fb14719330c6f528e1bf89 [file] [log] [blame]
/* 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[])
{
char **whitelist = &argv[1];
int whitelist_len = argc - 1;
RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
}