freebsd-dev/sbin/dhclient/tests/option-domain-search.c
Julio Merino c68de7484a Migrate tools/regression/sbin/ to the new tests layout.
Pretty much all that this change does is shuffles the code around and hooks
it into the regular build.  The code of the old tests has not changed.
2014-03-16 02:07:08 +00:00

329 lines
5.5 KiB
C

/* $FreeBSD$ */
#include <setjmp.h>
#include <stdlib.h>
#include "dhcpd.h"
jmp_buf env;
void expand_domain_search(struct packet *packet);
void
no_option_present()
{
int ret;
struct option_data option;
struct packet p;
option.data = NULL;
option.len = 0;
p.options[DHO_DOMAIN_SEARCH] = option;
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (p.options[DHO_DOMAIN_SEARCH].len != 0 ||
p.options[DHO_DOMAIN_SEARCH].data != NULL)
abort();
}
void
one_domain_valid()
{
int ret;
struct packet p;
struct option_data *option;
char *data = "\007example\003org\0";
char *expected = "example.org.";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 13;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (option->len != strlen(expected) ||
strcmp(option->data, expected) != 0)
abort();
free(option->data);
}
void
one_domain_truncated1()
{
int ret;
struct option_data *option;
struct packet p;
char *data = "\007example\003org";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 12;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (ret != 1)
abort();
free(option->data);
}
void
one_domain_truncated2()
{
int ret;
struct option_data *option;
struct packet p;
char *data = "\007ex";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 3;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (ret != 1)
abort();
free(option->data);
}
void
two_domains_valid()
{
int ret;
struct packet p;
struct option_data *option;
char *data = "\007example\003org\0\007example\003com\0";
char *expected = "example.org. example.com.";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 26;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (option->len != strlen(expected) ||
strcmp(option->data, expected) != 0)
abort();
free(option->data);
}
void
two_domains_truncated1()
{
int ret;
struct option_data *option;
struct packet p;
char *data = "\007example\003org\0\007example\003com";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 25;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (ret != 1)
abort();
free(option->data);
}
void
two_domains_truncated2()
{
int ret;
struct option_data *option;
struct packet p;
char *data = "\007example\003org\0\007ex";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 16;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (ret != 1)
abort();
free(option->data);
}
void
two_domains_compressed()
{
int ret;
struct packet p;
struct option_data *option;
char *data = "\007example\003org\0\006foobar\xc0\x08";
char *expected = "example.org. foobar.org.";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 22;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (option->len != strlen(expected) ||
strcmp(option->data, expected) != 0)
abort();
free(option->data);
}
void
two_domains_infloop()
{
int ret;
struct packet p;
struct option_data *option;
char *data = "\007example\003org\0\006foobar\xc0\x0d";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 22;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (ret != 1)
abort();
free(option->data);
}
void
two_domains_forwardptr()
{
int ret;
struct packet p;
struct option_data *option;
char *data = "\007example\003org\xc0\x0d\006foobar\0";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 22;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (ret != 1)
abort();
free(option->data);
}
void
two_domains_truncatedptr()
{
int ret;
struct packet p;
struct option_data *option;
char *data = "\007example\003org\0\006foobar\xc0";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 21;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (ret != 1)
abort();
free(option->data);
}
void
multiple_domains_valid()
{
int ret;
struct packet p;
struct option_data *option;
char *data =
"\007example\003org\0\002cl\006foobar\003com\0\002fr\xc0\x10";
char *expected = "example.org. cl.foobar.com. fr.foobar.com.";
option = &p.options[DHO_DOMAIN_SEARCH];
option->len = 33;
option->data = malloc(option->len);
memcpy(option->data, data, option->len);
ret = setjmp(env);
if (ret == 0)
expand_domain_search(&p);
if (option->len != strlen(expected) ||
strcmp(option->data, expected) != 0)
abort();
free(option->data);
}
int
main(int argc, char *argv[])
{
no_option_present();
one_domain_valid();
one_domain_truncated1();
one_domain_truncated2();
two_domains_valid();
two_domains_truncated1();
two_domains_truncated2();
two_domains_compressed();
two_domains_infloop();
two_domains_forwardptr();
two_domains_truncatedptr();
multiple_domains_valid();
return (0);
}