blob: 4880fad462fc793fa41c40f5e131a5d6ed6465a9 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
time_t now = 1000;
static time_t monotime(void)
{
return now;
}
#define UNIT_TESTS
const char *stations_dir;
#define STATIONS_DIR stations_dir
#define WIFIINFO_DIR STATIONS_DIR
#include "wifi_files.cc"
int exit_code = 0;
#define TEST_ASSERT(x) \
if (x) printf("! %s:%d \"x\"\tok\n", __FUNCTION__, __LINE__); \
else { \
printf("! %s:%d \"x\"\tFAILED\n", __FUNCTION__, __LINE__); \
exit_code = 1; \
}
void testPrintSsidEscaped()
{
FILE *f = tmpfile();
char buf[32];
const uint8_t ssid[] = {'b', 0x86, ' ', 'c'}; /* not NUL terminated. */
const uint8_t expected[] = {'b', '\\', 'u', '0', '0', '8', '6', ' ', 'c'};
printf("Testing \"%s\" in %s:\n", __FUNCTION__, __FILE__);
memset(buf, 0, sizeof(buf));
TEST_ASSERT(f != NULL);
print_ssid_escaped(f, sizeof(ssid), ssid);
fflush(f);
rewind(f);
TEST_ASSERT(fread(buf, 1, sizeof(buf), f) > 0);
TEST_ASSERT(memcmp(buf, expected, sizeof(expected)) == 0);
fclose(f);
printf("! %s:%d\t%s\tok\n", __FILE__, __LINE__, __FUNCTION__);
}
void testPrintSsidEscapedQuoteBackslash()
{
FILE *f = tmpfile();
char buf[32];
const uint8_t ssid[] = {'"', '\\'}; /* not NUL terminated. */
const uint8_t expected[] = {'\\', '"', '\\', '\\'};
printf("Testing \"%s\" in %s:\n", __FUNCTION__, __FILE__);
memset(buf, 0, sizeof(buf));
TEST_ASSERT(f != NULL);
print_ssid_escaped(f, sizeof(ssid), ssid);
fflush(f);
rewind(f);
TEST_ASSERT(fread(buf, 1, sizeof(buf), f) > 0);
printf("%s\n", buf);
TEST_ASSERT(memcmp(buf, expected, sizeof(expected)) == 0);
fclose(f);
printf("! %s:%d\t%s\tok\n", __FILE__, __LINE__, __FUNCTION__);
}
void testFrequencyToChannel()
{
printf("Testing \"%s\" in %s:\n", __FUNCTION__, __FILE__);
TEST_ASSERT(ieee80211_frequency_to_channel(2484) == 14);
TEST_ASSERT(ieee80211_frequency_to_channel(5745) == 149);
printf("! %s:%d\t%s\tok\n", __FILE__, __LINE__, __FUNCTION__);
}
static const char *expected_json = "{\n"
" \"addr\": \"00:11:22:33:44:55\",\n"
" \"inactive since\": 0.000,\n"
" \"inactive msec\": 0,\n"
" \"active\": false,\n"
" \"rx bitrate\": 4.7,\n"
" \"rx bytes\": 0,\n"
" \"rx packets\": 0,\n"
" \"tx bitrate\": 0.0,\n"
" \"tx bytes\": 0,\n"
" \"tx packets\": 0,\n"
" \"tx retries\": 0,\n"
" \"tx failed\": 0,\n"
" \"rx mcs\": 0,\n"
" \"rx max mcs\": 0,\n"
" \"rx vht mcs\": 0,\n"
" \"rx max vht mcs\": 0,\n"
" \"rx width\": 0,\n"
" \"rx max width\": 0,\n"
" \"rx ht_nss\": 0,\n"
" \"rx max ht_nss\": 0,\n"
" \"rx vht_nss\": 0,\n"
" \"rx max vht_nss\": 0,\n"
" \"rx SHORT_GI\": false,\n"
" \"rx SHORT_GI seen\": false,\n"
" \"signal\": 0,\n"
" \"signal_avg\": 0,\n"
" \"authorized\": \"no\",\n"
" \"authenticated\": \"yes\",\n"
" \"preamble\": \"no\",\n"
" \"wmm_wme\": \"no\",\n"
" \"mfp\": \"no\",\n"
" \"tdls_peer\": \"no\",\n"
" \"preamble length\": \"long\",\n"
" \"rx bytes64\": 1,\n"
" \"rx drop64\": 2,\n"
" \"tx bytes64\": 0,\n"
" \"tx retries64\": 0,\n"
" \"expected Mbps\": 7.009,\n"
" \"ifname\": \"\"\n"
"}";
void testClientStateToJson()
{
client_state_t state;
char *buf;
char filename[PATH_MAX];
int fd;
printf("Testing \"%s\" in %s:\n", __FUNCTION__, __FILE__);
TEST_ASSERT(ieee80211_frequency_to_channel(2484) == 14);
memset(&state, 0, sizeof(client_state_t));
snprintf(state.macstr, sizeof(state.macstr), "00:11:22:33:44:55");
state.s.rx_bytes64 = 1ULL;
state.s.rx_drop64 = 2ULL;
state.s.rx_bitrate = 47;
state.s.authorized = 0;
state.s.authenticated = 1;
state.s.preamble_length = 0;
state.s.expected_mbps = 7009;
ClientStateToJson(&state);
#define SIZ 65536
TEST_ASSERT((buf = (char *)malloc(SIZ)) != NULL);
memset(buf, 0, SIZ);
snprintf(filename, sizeof(filename), "%s/%s", STATIONS_DIR, state.macstr);
TEST_ASSERT((fd = open(filename, O_RDONLY)) >= 0);
TEST_ASSERT(read(fd, buf, SIZ) > 0);
close(fd);
TEST_ASSERT(unlink(filename) == 0);
TEST_ASSERT(strcmp(buf, expected_json));
free(buf);
printf("! %s:%d\t%s\tok\n", __FILE__, __LINE__, __FUNCTION__);
}
void testAgeOutClients()
{
uint8_t mac[] = {0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
client_state_t *state;
printf("Testing \"%s\" in %s:\n", __FUNCTION__, __FILE__);
mac[5] = 0x01;
state = FindClientState(mac);
state->last_seen = 1000;
mac[5] = 0x02;
state = FindClientState(mac);
state->last_seen = 10000;
TEST_ASSERT(clients.size() == 2);
now = 1000 + MAX_CLIENT_AGE_SECS + 1;
ConsolidateAssociatedDevices();
TEST_ASSERT(clients.size() == 1);
now = 10000 + MAX_CLIENT_AGE_SECS + 1;
ConsolidateAssociatedDevices();
TEST_ASSERT(clients.size() == 0);
printf("! %s:%d\t%s\tok\n", __FILE__, __LINE__, __FUNCTION__);
}
int main(int argc, char** argv)
{
char filename[PATH_MAX];
stations_dir = mkdtemp(strdup("/tmp/wifi_files_test_XXXXXX"));
printf("stations_dir = %s\n", stations_dir);
testPrintSsidEscaped();
testPrintSsidEscapedQuoteBackslash();
testFrequencyToChannel();
testClientStateToJson();
testAgeOutClients();
snprintf(filename, sizeof(filename), "%s/updated.new", STATIONS_DIR);
unlink(filename);
TEST_ASSERT(rmdir(stations_dir) == 0);
exit(exit_code);
}