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