#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.c"


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 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.rx_bytes64 = 1ULL;
  state.rx_drop64 = 2ULL;
  state.rx_bitrate = 47;
  state.authorized = 0;
  state.authenticated = 1;
  state.preamble_length = 0;
  state.expected_mbps = 7009;
  ClientStateToJson((gpointer)(&state.macstr), (gpointer)&state, NULL);

  #define SIZ 65536
  TEST_ASSERT((buf = 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(g_hash_table_size(clients) == 2);

  now = 1000 + MAX_CLIENT_AGE_SECS + 1;
  ConsolidateAssociatedDevices();
  TEST_ASSERT(g_hash_table_size(clients) == 1);

  now = 10000 + MAX_CLIENT_AGE_SECS + 1;
  ConsolidateAssociatedDevices();
  TEST_ASSERT(g_hash_table_size(clients) == 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);
  clients = g_hash_table_new(g_str_hash, g_str_equal);

  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);
}
