Files
NetworkManager/shared/n-dhcp4/src/test-message.c
Tom Gundersen e43b1791a3 Merge commit 'e23b3c9c3ac86b065eef002fa5c4321cc4a87df2' as 'shared/n-dhcp4'
Imported n-dhcp4 code with command:

  git subtree add --prefix shared/n-dhcp4/ git@github.com:nettools/n-dhcp4.git master --squash

To update the library use:

  git subtree pull --prefix shared/n-dhcp4/ git@github.com:nettools/n-dhcp4.git master --squash
2019-05-25 02:02:04 +02:00

160 lines
4.7 KiB
C

/*
* Tests for DHCP4 Message Handling
*/
#undef NDEBUG
#include <assert.h>
#include <c-stdaux.h>
#include <endian.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "n-dhcp4-private.h"
static void test_outgoing(void) {
NDhcp4Outgoing *outgoing;
int r;
/* verify basic NEW/FREE */
outgoing = NULL;
r = n_dhcp4_outgoing_new(&outgoing, 0, 0);
c_assert(!r);
c_assert(outgoing);
outgoing = n_dhcp4_outgoing_free(outgoing);
c_assert(!outgoing);
}
static void test_incoming(void) {
NDhcp4Incoming *incoming;
struct {
NDhcp4Header header;
uint8_t sname[64];
uint8_t file[128];
uint32_t magic;
uint8_t options[1024];
} m;
uint8_t *v;
size_t l;
int r;
/* verify that messages must be at least the size of the header */
r = n_dhcp4_incoming_new(&incoming, NULL, 0);
c_assert(r == N_DHCP4_E_MALFORMED);
r = n_dhcp4_incoming_new(&incoming, NULL, sizeof(m.header) + 64 + 128 + 3);
c_assert(r == N_DHCP4_E_MALFORMED);
/* verify that magic must be set */
memset(&m, 0, sizeof(m));
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m));
c_assert(r == N_DHCP4_E_MALFORMED);
/* verify basic NEW/FREE */
memset(&m, 0, sizeof(m));
m.magic = htobe32(N_DHCP4_MESSAGE_MAGIC);
incoming = NULL;
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m.header) + 64 + 128 + 4);
c_assert(!r);
c_assert(incoming);
incoming = n_dhcp4_incoming_free(incoming);
c_assert(!incoming);
/* verify that PAD is properly handled */
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m));
c_assert(!r);
incoming = n_dhcp4_incoming_free(incoming);
/* verify that SNAME/FILE are only looked at if OVERLOAD is set */
m.sname[0] = 1;
m.sname[1] = 0;
m.file[0] = 2;
m.file[1] = 0;
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m));
c_assert(!r);
r = n_dhcp4_incoming_query(incoming, 1, NULL, NULL);
c_assert(r == N_DHCP4_E_UNSET);
r = n_dhcp4_incoming_query(incoming, 2, NULL, NULL);
c_assert(r == N_DHCP4_E_UNSET);
incoming = n_dhcp4_incoming_free(incoming);
m.options[0] = N_DHCP4_OPTION_OVERLOAD;
m.options[1] = 1;
m.options[2] = 0;
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m));
c_assert(!r);
r = n_dhcp4_incoming_query(incoming, 1, NULL, NULL);
c_assert(r == N_DHCP4_E_UNSET);
r = n_dhcp4_incoming_query(incoming, 2, NULL, NULL);
c_assert(r == N_DHCP4_E_UNSET);
incoming = n_dhcp4_incoming_free(incoming);
m.options[0] = N_DHCP4_OPTION_OVERLOAD;
m.options[1] = 1;
m.options[2] = N_DHCP4_OVERLOAD_SNAME;
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m));
c_assert(!r);
r = n_dhcp4_incoming_query(incoming, 1, NULL, NULL);
c_assert(r == 0);
r = n_dhcp4_incoming_query(incoming, 2, NULL, NULL);
c_assert(r == N_DHCP4_E_UNSET);
incoming = n_dhcp4_incoming_free(incoming);
m.options[0] = N_DHCP4_OPTION_OVERLOAD;
m.options[1] = 1;
m.options[2] = N_DHCP4_OVERLOAD_FILE;
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m));
c_assert(!r);
r = n_dhcp4_incoming_query(incoming, 1, NULL, NULL);
c_assert(r == N_DHCP4_E_UNSET);
r = n_dhcp4_incoming_query(incoming, 2, NULL, NULL);
c_assert(r == 0);
incoming = n_dhcp4_incoming_free(incoming);
m.options[0] = N_DHCP4_OPTION_OVERLOAD;
m.options[1] = 1;
m.options[2] = N_DHCP4_OVERLOAD_FILE | N_DHCP4_OVERLOAD_SNAME;
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m));
c_assert(!r);
r = n_dhcp4_incoming_query(incoming, 1, NULL, NULL);
c_assert(r == 0);
r = n_dhcp4_incoming_query(incoming, 2, NULL, NULL);
c_assert(r == 0);
incoming = n_dhcp4_incoming_free(incoming);
/* verify basic concatenation */
m.options[3] = 1;
m.options[4] = 1;
m.options[5] = 0xef;
m.sname[1] = 1;
m.sname[2] = 0xcf;
r = n_dhcp4_incoming_new(&incoming, &m, sizeof(m));
c_assert(!r);
r = n_dhcp4_incoming_query(incoming, 1, &v, &l);
c_assert(r == 0);
c_assert(l == 2);
c_assert(v[0] == 0xef && v[1] == 0xcf);
incoming = n_dhcp4_incoming_free(incoming);
}
int main(int argc, char **argv) {
test_outgoing();
test_incoming();
return 0;
}