void testGroupByDay(CuTest *tc) { struct NameValuePair fromParam = {"from", "0", NULL}; struct NameValuePair toParam = {"to", "1258281927", &fromParam}; struct NameValuePair groupParam = {"group", "2", &toParam}; struct Request req = {"GET", "/query", &groupParam, NULL}; emptyDb(); addDbRow(makeTs("2009-11-01 10:00:00"), 3600, NULL, 1, 1, ""); addDbRow(makeTs("2009-11-01 11:00:00"), 3600, NULL, 2, 2, ""); addDbRow(makeTs("2009-11-01 12:00:00"), 3600, NULL, 4, 4, ""); addDbRow(makeTs("2009-11-02 09:00:00"), 3600, NULL, 8, 8, ""); addDbRow(makeTs("2009-11-02 23:00:00"), 3600, NULL, 16, 16, ""); int tmpFd = makeTmpFile(); processQueryRequest(tmpFd, &req); char* result = readTmpFile(); CuAssertStrEquals(tc, "HTTP/1.0 200 OK" HTTP_EOL "Content-Type: application/json" HTTP_EOL "Server: BitMeterOS " VERSION " Web Server" HTTP_EOL "Date: Sun, 08 Nov 2009 10:00:00 +0000" HTTP_EOL "Connection: Close" HTTP_EOL HTTP_EOL "[{\"dl\": 7,\"ul\": 7,\"ts\": 1257120000,\"dr\": 54000},{\"dl\": 24,\"ul\": 24,\"ts\": 1257206400,\"dr\": 86400}]" , result); }
void testParamsOk(CuTest *tc) { struct NameValuePair fromParam = {"from", "1257120000", NULL}; // 2009-11-02 struct NameValuePair toParam = {"to", "1257292800", &fromParam}; // 2009-11-04 struct NameValuePair groupParam = {"group", "5", &toParam}; // Total struct Request req = {"GET", "/query", &groupParam, NULL}; // The query range covers the second, third and fourth rows only emptyDb(); addDbRow(makeTs("2009-11-01 12:00:00"), 3600, NULL, 1, 1, ""); addDbRow(makeTs("2009-11-02 12:00:00"), 3600, NULL, 2, 2, ""); // Match addDbRow(makeTs("2009-11-03 12:00:00"), 3600, NULL, 4, 4, ""); // Match addDbRow(makeTs("2009-11-04 12:00:00"), 3600, NULL, 8, 8, ""); // Match addDbRow(makeTs("2009-11-05 12:00:00"), 3600, NULL, 16, 16, ""); int tmpFd = makeTmpFile(); processQueryRequest(tmpFd, &req); char* result = readTmpFile(); // The 'ts' value = 2009-11-05 00:00:00, ie the end of the date range covered by the query // The 'dr' value = 3 * 24 * 3600, ie the number of seconds in 3 days CuAssertStrEquals(tc, "HTTP/1.0 200 OK" HTTP_EOL "Content-Type: application/json" HTTP_EOL "Server: BitMeterOS " VERSION " Web Server" HTTP_EOL "Date: Sun, 08 Nov 2009 10:00:00 +0000" HTTP_EOL "Connection: Close" HTTP_EOL HTTP_EOL "[{\"dl\": 14,\"ul\": 14,\"ts\": 1257379200,\"dr\": 259200}]" , result); }
void testGroupByDayCsv(CuTest *tc) { struct NameValuePair fromParam = {"from", "0", NULL}; struct NameValuePair toParam = {"to", "1258281927", &fromParam}; struct NameValuePair groupParam = {"group", "2", &toParam}; struct NameValuePair csvParam = {"csv", "1", &groupParam}; struct Request req = {"GET", "/query", &csvParam, NULL}; emptyDb(); addDbRow(makeTs("2009-11-01 10:00:00"), 3600, NULL, 1, 1, ""); addDbRow(makeTs("2009-11-01 11:00:00"), 3600, NULL, 2, 2, ""); addDbRow(makeTs("2009-11-01 12:00:00"), 3600, NULL, 4, 4, ""); addDbRow(makeTs("2009-11-02 09:00:00"), 3600, NULL, 8, 8, ""); addDbRow(makeTs("2009-11-02 23:00:00"), 3600, NULL, 16, 16, ""); int tmpFd = makeTmpFile(); processQueryRequest(tmpFd, &req); char* result = readTmpFile(); CuAssertStrEquals(tc, "HTTP/1.0 200 OK" HTTP_EOL "Content-Type: text/csv" HTTP_EOL "Server: BitMeterOS " VERSION " Web Server" HTTP_EOL "Date: Sun, 08 Nov 2009 10:00:00 +0000" HTTP_EOL "Connection: Close" HTTP_EOL "Content-Disposition: attachment;filename=bitmeterOsQuery.csv" HTTP_EOL HTTP_EOL "2009-11-01 09:00:00,7,7\n" "2009-11-02 00:00:00,24,24\n" , result); }
void testSummaryWithHosts(CuTest *tc) { emptyDb(); addDbRow(makeTs("2008-11-02 12:00:00"), 3600, NULL, 1, 1, "server"); // Last year addDbRow(makeTs("2009-10-01 12:00:00"), 3600, NULL, 2, 2, ""); // Earlier this year addDbRow(makeTs("2009-11-04 12:00:00"), 3600, NULL, 4, 4, "windowsbox"); // Earlier this month addDbRow(makeTs("2009-11-08 01:00:00"), 3600, NULL, 8, 8, "windowsbox"); // Today struct Request req = {"GET", "/summary", NULL, NULL}; time_t now = makeTs("2009-11-08 10:00:00"); setTime(now); int tmpFd = makeTmpFile(); processSummaryRequest(tmpFd, &req); char* result = readTmpFile(); CuAssertStrEquals(tc, "HTTP/1.0 200 OK" HTTP_EOL "Content-Type: application/json" HTTP_EOL "Server: BitMeterOS " VERSION " Web Server" HTTP_EOL "Date: Sun, 08 Nov 2009 10:00:00 +0000" HTTP_EOL "Connection: Close" HTTP_EOL HTTP_EOL "{\"today\": {\"dl\": 8,\"ul\": 8,\"ts\": 0,\"dr\": 0}, \"month\": {\"dl\": 12,\"ul\": 12,\"ts\": 0,\"dr\": 0}, \"year\": {\"dl\": 14,\"ul\": 14,\"ts\": 0,\"dr\": 0}, \"total\": {\"dl\": 15,\"ul\": 15,\"ts\": 0,\"dr\": 0}" ", \"hosts\": [\"server\", \"windowsbox\"], \"since\": 1225627200}" , result); }
void testMissingParam(CuTest *tc) { // The 3 parameters are required, so we should get an HTTP error if they are missing struct Request req = {"GET", "/query", NULL, NULL}; time_t now = makeTs("2009-11-08 10:00:00"); setTime(now); int tmpFd = makeTmpFile(); processQueryRequest(tmpFd, &req); char* result = readTmpFile(); CuAssertStrEquals(tc, "HTTP/1.0 500 Bad/missing parameter" HTTP_EOL "Server: BitMeterOS " VERSION " Web Server" HTTP_EOL "Date: Sun, 08 Nov 2009 10:00:00 +0000" HTTP_EOL "Connection: Close" HTTP_EOL HTTP_EOL , result); }
static void test_value_datetime_varytime(const char * const datestring, time_t const datetime, unsigned int const usec) { xmlrpc_value * v; xmlrpc_env env; const char * readBackString; time_t readBackDt; unsigned int readBackUsec; const char * datestringSec; #if XMLRPC_HAVE_TIMEVAL struct timeval const dtTimeval = makeTv(datetime, usec); struct timeval readBackTv; #endif #if XMLRPC_HAVE_TIMESPEC struct timespec const dtTimespec = makeTs(datetime, usec); struct timespec readBackTs; #endif const char * const dt8601 = make8601(datetime, usec); const char * readBack8601; datestringSec = truncateFracSec(datestring); xmlrpc_env_init(&env); /* Test xmlrpc_datetime_new_str and time read functions*/ v = xmlrpc_datetime_new_str(&env, datestring); TEST_NO_FAULT(&env); TEST(XMLRPC_TYPE_DATETIME == xmlrpc_value_type(v)); xmlrpc_read_datetime_sec(&env, v, &readBackDt); TEST_NO_FAULT(&env); TEST(readBackDt == datetime); xmlrpc_read_datetime_usec(&env, v, &readBackDt, &readBackUsec); TEST_NO_FAULT(&env); TEST(readBackDt == datetime); TEST(readBackUsec == usec); #if XMLRPC_HAVE_TIMEVAL xmlrpc_read_datetime_timeval(&env, v, &readBackTv); TEST_NO_FAULT(&env); TEST(tvIsEqual(dtTimeval, readBackTv)); #endif #if XMLRPC_HAVE_TIMESPEC xmlrpc_read_datetime_timespec(&env, v, &readBackTs); TEST_NO_FAULT(&env); TEST(tsIsEqual(dtTimespec, readBackTs)); #endif xmlrpc_read_datetime_8601(&env, v, &readBack8601); TEST_NO_FAULT(&env); TEST(xmlrpc_streq(dt8601, readBack8601)); strfree(readBack8601); xmlrpc_DECREF(v); /* Test xmlrpc_datetime_new_sec */ v = xmlrpc_datetime_new_sec(&env, datetime); TEST_NO_FAULT(&env); TEST(XMLRPC_TYPE_DATETIME == xmlrpc_value_type(v)); xmlrpc_read_datetime_str(&env, v, &readBackString); TEST_NO_FAULT(&env); TEST(streq(readBackString, datestringSec)); strfree(readBackString); xmlrpc_DECREF(v); /* Test xmlrpc_datetime_new_usec */ v = xmlrpc_datetime_new_usec(&env, datetime, usec); TEST_NO_FAULT(&env); TEST(XMLRPC_TYPE_DATETIME == xmlrpc_value_type(v)); xmlrpc_read_datetime_str(&env, v, &readBackString); TEST_NO_FAULT(&env); TEST(streq(readBackString, datestring)); strfree(readBackString); xmlrpc_DECREF(v); #if XMLRPC_HAVE_TIMEVAL /* Test xmlrpc_datetime_new_timeval */ v = xmlrpc_datetime_new_timeval(&env, dtTimeval); TEST_NO_FAULT(&env); TEST(XMLRPC_TYPE_DATETIME == xmlrpc_value_type(v)); xmlrpc_read_datetime_str(&env, v, &readBackString); TEST_NO_FAULT(&env); TEST(streq(readBackString, datestring)); strfree(readBackString); xmlrpc_DECREF(v); #endif #if XMLRPC_HAVE_TIMESPEC /* Test xmlrpc_datetime_new_timespec */ v = xmlrpc_datetime_new_timespec(&env, dtTimespec); TEST_NO_FAULT(&env); TEST(XMLRPC_TYPE_DATETIME == xmlrpc_value_type(v)); xmlrpc_read_datetime_str(&env, v, &readBackString); TEST_NO_FAULT(&env); TEST(streq(readBackString, datestring)); strfree(readBackString); xmlrpc_DECREF(v); #endif xmlrpc_env_clean(&env); strfree(datestringSec); }