/* * This function waits for the process to change state. If the process state doesn't match the expectation, * a failed event is posted to notify the user. The time is saved on enter so in the case that the time steps * backwards/forwards, the wait_process will wait for absolute time and not stall or prematurely exit. * @param service A Service to wait for * @param expect A expected state (see Process_Status) * @return Either Process_Started if the process is running or Process_Stopped if it's not running */ static Process_Status wait_process(Service_T s, Process_Status expect) { int debug = Run.debug, isrunning = FALSE; unsigned long now = time(NULL) * 1000, wait = 50; assert(s->start || s->restart); unsigned long timeout = (s->start ? s->start->timeout : s->restart->timeout) * 1000 + now; ASSERT(s); do { Time_usleep(wait * USEC_PER_MSEC); now += wait ; wait = wait < 1000 ? wait * 2 : 1000; // double the wait during each cycle until 1s is reached isrunning = Util_isProcessRunning(s, TRUE); if ((expect == Process_Stopped && ! isrunning) || (expect == Process_Started && isrunning)) break; Run.debug = FALSE; // Turn off debug second time through to avoid flooding the log with pid file does not exist. This poll stuff here _will_ be refactored away } while (now < timeout && ! Run.stopped); Run.debug = debug; // restore the debug state if (isrunning) { if (expect == Process_Started) Event_post(s, Event_Exec, STATE_SUCCEEDED, s->action_EXEC, "started"); else Event_post(s, Event_Exec, STATE_FAILED, s->action_EXEC, "failed to stop"); return Process_Started; } else { if (expect == Process_Started) Event_post(s, Event_Exec, STATE_FAILED, s->action_EXEC, "failed to start"); else Event_post(s, Event_Exec, STATE_SUCCEEDED, s->action_EXEC, "stopped"); return Process_Stopped; } }
int main(void) { setenv("TZ", "CET", 1); tzset(); Bootstrap(); // Need to initialize library printf("============> Start Time Tests\n\n"); printf("=> Test1: check string ouput\n"); { char result[30]; Time_string(1267441200, result); /* 01 Mar 2010 12:00:00 */ printf("\tResult: unix time 1267441200 to localtime:\n\t %s\n", result); assert(Str_isEqual(result, "Mon, 01 Mar 2010 12:00:00")); Time_gmtstring(1267441200, result); /* 01 Mar 2010 12:00:00 GMT */ printf("\tResult: unix time 1267441200 to UTC:\n\t %s\n", result); assert(Str_isEqual("Mon, 01 Mar 2010 11:00:00 GMT", result)); } printf("=> Test1: OK\n\n"); printf("=> Test2: check current time\n"); { struct timeval tv; assert(!gettimeofday(&tv, NULL)); assert(Time_now() == tv.tv_sec); } printf("=> Test2: OK\n\n"); printf("=> Test3: sleep 1s\n"); { time_t now; now = Time_now(); Time_usleep(1000000); assert((now + 1) == Time_now()); } printf("=> Test3: OK\n\n"); printf("=> Test4: uptime\n"); { time_t days = 668040; time_t hours = 63240; time_t min = 2040; char result[24]; printf("\tResult: uptime days: %s\n", Time_uptime(days, result)); assert(Str_isEqual(result, "7d, 17h, 34m")); printf("\tResult: uptime hours: %s\n", Time_uptime(hours, result)); assert(Str_isEqual(result, "17h, 34m")); printf("\tResult: uptime min: %s\n", Time_uptime(min, result)); assert(Str_isEqual(result, "34m")); printf("\tResult: uptime 0: %s\n", Time_uptime(0, result)); assert(Str_isEqual(result, "")); assert(Time_uptime(0, NULL) == NULL); } printf("=> Test4: OK\n\n"); printf("=> Test5: Time attributes\n"); { char b[STRLEN]; time_t time = 730251059; // Sun, 21. Feb 1993 00:30:59 printf("\tResult: %s (winter time)\n", Time_string(time, b)); assert(Time_seconds(time) == 59); assert(Time_minutes(time) == 30); assert(Time_hour(time) == 0); assert(Time_weekday(time) == 0); assert(Time_day(time) == 21); assert(Time_month(time) == 2); assert(Time_year(time) == 1993); time = 1253045894; // Tue, 15 Sep 2009 22:18:14 +0200 printf("\tResult: %s (DTS/summer time)\n", Time_string(time, b)); assert(Str_startsWith(b, "Tue, 15 Sep 2009 22:18:14")); } printf("=> Test5: OK\n\n"); printf("=> Test6: Time_build\n"); { time_t time = Time_build(2001, 1, 29, 12, 0, 0); assert(Time_seconds(time) == 0); assert(Time_minutes(time) == 0); assert(Time_hour(time) == 12); assert(Time_day(time) == 29); assert(Time_month(time) == 1); assert(Time_year(time) == 2001); // Verify assert on out of range TRY { Time_build(1969, 1, 29, 12, 0, 0); printf("Test failed\n"); exit(1); } CATCH (AssertException) END_TRY; TRY { Time_build(1970, 0, 29, 12, 0, 0); printf("Test failed\n"); exit(1); } CATCH (AssertException) END_TRY; } printf("=> Test6: OK\n\n"); printf("=> Test7: Time_incron\n"); { const char *exactmatch = "27 11 5 7 2"; const char *matchall = "* * * * *"; const char *invalid1 = "a bc d"; const char *invalid2 = "* * * * "; // Too few fields const char *invalid3 = "* * * * * * "; // Too many fields const char *range1 = "* 10-11 1-5 * 1-5"; const char *rangeoutside = "1-10 9-10 1-5 * 1-5"; const char *sequence = "* 10,11 1-3,5,6 * *"; const char *sequenceoutside = "* 10,11,12 4,5,6 * 0,6"; time_t time = Time_build(2011, 7, 5, 11, 27, 5); assert(Time_incron(exactmatch, time)); assert(Time_incron(matchall, time)); assert(! Time_incron(invalid1, time)); assert(! Time_incron(invalid2, time)); assert(! Time_incron(invalid3, time)); assert(Time_incron(range1, time)); assert(! Time_incron(rangeoutside, time)); assert(Time_incron(sequence, time)); assert(! Time_incron(sequenceoutside, time)); } printf("=> Test7: OK\n\n"); printf("============> Time Tests: OK\n\n"); return 0; }
static int _commandExecute(Service_T S, command_t c, char *msg, int msglen, int64_t *timeout) { ASSERT(S); ASSERT(c); ASSERT(msg); msg[0] = 0; int status = -1; Command_T C = NULL; TRY { // May throw exception if the program doesn't exist (was removed while Monit was up) C = Command_new(c->arg[0], NULL); } ELSE { snprintf(msg, msglen, "Program %s failed: %s", c->arg[0], Exception_frame.message); } END_TRY; if (C) { for (int i = 1; i < c->length; i++) Command_appendArgument(C, c->arg[i]); if (c->has_uid) Command_setUid(C, c->uid); if (c->has_gid) Command_setGid(C, c->gid); Command_setEnv(C, "MONIT_DATE", Time_string(Time_now(), (char[26]){})); Command_setEnv(C, "MONIT_SERVICE", S->name); Command_setEnv(C, "MONIT_HOST", Run.system->name); Command_setEnv(C, "MONIT_EVENT", c == S->start ? "Started" : c == S->stop ? "Stopped" : "Restarted"); Command_setEnv(C, "MONIT_DESCRIPTION", c == S->start ? "Started" : c == S->stop ? "Stopped" : "Restarted"); if (S->type == Service_Process) { Command_vSetEnv(C, "MONIT_PROCESS_PID", "%d", Util_isProcessRunning(S, false)); Command_vSetEnv(C, "MONIT_PROCESS_MEMORY", "%ld", S->inf->priv.process.mem_kbyte); Command_vSetEnv(C, "MONIT_PROCESS_CHILDREN", "%d", S->inf->priv.process.children); Command_vSetEnv(C, "MONIT_PROCESS_CPU_PERCENT", "%d", S->inf->priv.process.cpu_percent); } Process_T P = Command_execute(C); Command_free(&C); if (P) { do { Time_usleep(RETRY_INTERVAL); *timeout -= RETRY_INTERVAL; } while ((status = Process_exitStatus(P)) < 0 && *timeout > 0 && ! (Run.flags & Run_Stopped)); if (*timeout <= 0) snprintf(msg, msglen, "Program %s timed out", c->arg[0]); int n, total = 0; char buf[STRLEN]; do { if ((n = _getOutput(Process_getErrorStream(P), buf, sizeof(buf))) <= 0) n = _getOutput(Process_getInputStream(P), buf, sizeof(buf)); if (n > 0) { buf[n] = 0; DEBUG("%s", buf); // Report the first message (override existing plain timeout message if some program output is available) if (! total) snprintf(msg, msglen, "%s: %s%s", c->arg[0], *timeout <= 0 ? "Program timed out -- " : "", buf); total += n; } } while (n > 0 && Run.debug && total < 2048); // Limit the debug output (if the program will have endless output, such as 'yes' utility, we have to stop at some point to not spin here forever) Process_free(&P); // Will kill the program if still running } }
int main(void) { setenv("TZ", "CET", 1); tzset(); Bootstrap(); // Need to initialize library printf("============> Start Time Tests\n\n"); printf("=> Test1: check string ouput\n"); { char result[STRLEN]; Time_string(1267441200, result); /* 01 Mar 2010 12:00:00 */ printf("\tResult: unix time 1267441200 to localtime:\n\t %s\n", result); assert(Str_isEqual(result, "Mon, 01 Mar 2010 12:00:00")); Time_gmtstring(1267441200, result); /* 01 Mar 2010 12:00:00 GMT */ printf("\tResult: unix time 1267441200 to UTC:\n\t %s\n", result); assert(Str_isEqual("Mon, 01 Mar 2010 11:00:00 GMT", result)); Time_fmt(result, STRLEN, "%D %T", 1267441200); printf("\tResult: 1267441200 -> %s\n", result); assert(Str_isEqual(result, "03/01/10 12:00:00")); Time_fmt(result, STRLEN, "%D %z", 1267441200); printf("\tResult: 1267441200 -> %s\n", result); #ifdef AIX assert(Str_startsWith(result, "03/01/10 CET")); #else assert(Str_startsWith(result, "03/01/10 +")); #endif } printf("=> Test1: OK\n\n"); printf("=> Test2: check current time\n"); { struct timeval tv; assert(!gettimeofday(&tv, NULL)); assert(Time_now() == tv.tv_sec); } printf("=> Test2: OK\n\n"); printf("=> Test3: sleep 1s\n"); { time_t now; now = Time_now(); Time_usleep(1000000); assert((now + 1) == Time_now()); } printf("=> Test3: OK\n\n"); printf("=> Test4: uptime\n"); { time_t days = 668040; time_t hours = 63240; time_t min = 2040; char result[24]; printf("\tResult: uptime days: %s\n", Time_uptime(days, result)); assert(Str_isEqual(result, "7d, 17h, 34m")); printf("\tResult: uptime hours: %s\n", Time_uptime(hours, result)); assert(Str_isEqual(result, "17h, 34m")); printf("\tResult: uptime min: %s\n", Time_uptime(min, result)); assert(Str_isEqual(result, "34m")); printf("\tResult: uptime 0: %s\n", Time_uptime(0, result)); assert(Str_isEqual(result, "")); assert(Time_uptime(0, NULL) == NULL); } printf("=> Test4: OK\n\n"); printf("=> Test5: Time attributes\n"); { char b[STRLEN]; time_t time = 730251059; // Sun, 21. Feb 1993 00:30:59 printf("\tResult: %s (winter time)\n", Time_string(time, b)); assert(Time_seconds(time) == 59); assert(Time_minutes(time) == 30); assert(Time_hour(time) == 0); assert(Time_weekday(time) == 0); assert(Time_day(time) == 21); assert(Time_month(time) == 2); assert(Time_year(time) == 1993); time = 1253045894; // Tue, 15 Sep 2009 22:18:14 +0200 printf("\tResult: %s (DTS/summer time)\n", Time_string(time, b)); assert(Str_startsWith(b, "Tue, 15 Sep 2009 22:18:14")); } printf("=> Test5: OK\n\n"); printf("=> Test6: Time_build\n"); { time_t time = Time_build(2001, 1, 29, 12, 0, 0); assert(Time_seconds(time) == 0); assert(Time_minutes(time) == 0); assert(Time_hour(time) == 12); assert(Time_day(time) == 29); assert(Time_month(time) == 1); assert(Time_year(time) == 2001); // Verify assert on out of range TRY { Time_build(1969, 1, 29, 12, 0, 0); printf("Test failed\n"); exit(1); } CATCH (AssertException) END_TRY; TRY { Time_build(1970, 0, 29, 12, 0, 0); printf("Test failed\n"); exit(1); } CATCH (AssertException) END_TRY; } printf("=> Test6: OK\n\n"); printf("=> Test7: Time_incron\n"); { const char *exactmatch = "27 11 5 7 2"; const char *matchall = "* * * * *"; const char *invalid1 = "a bc d"; const char *invalid2 = "* * * * "; // Too few fields const char *invalid3 = "* * * * * * "; // Too many fields const char *range1 = "* 10-11 1-5 * 1-5"; const char *rangeoutside = "1-10 9-10 1-5 * 1-5"; const char *sequence = "* 10,11 1-3,5,6 * *"; const char *sequenceoutside = "* 10,11,12 4,5,6 * 0,6"; time_t time = Time_build(2011, 7, 5, 11, 27, 5); assert(Time_incron(exactmatch, time)); assert(Time_incron(matchall, time)); assert(! Time_incron(invalid1, time)); assert(! Time_incron(invalid2, time)); assert(! Time_incron(invalid3, time)); assert(Time_incron(range1, time)); assert(! Time_incron(rangeoutside, time)); assert(Time_incron(sequence, time)); assert(! Time_incron(sequenceoutside, time)); } printf("=> Test7: OK\n\n"); printf("=> Test8: Time_toDateTime\n"); { #if HAVE_STRUCT_TM_TM_GMTOFF #define TM_GMTOFF tm_gmtoff #else #define TM_GMTOFF tm_wday #endif struct tm t; // DateTime ISO-8601 format assert(Time_toDateTime("2013-12-14T09:38:08Z", &t)); assert(t.tm_year == 2013); assert(t.tm_mon == 11); assert(t.tm_mday == 14); assert(t.tm_hour == 9); assert(t.tm_min == 38); assert(t.tm_sec == 8); // Date assert(Time_toDateTime("2013-12-14", &t)); assert(t.tm_year == 2013); assert(t.tm_mon == 11); assert(t.tm_mday == 14); // Time assert(Time_toDateTime("09:38:08", &t)); assert(t.tm_hour == 9); assert(t.tm_min == 38); assert(t.tm_sec == 8); // Compressed DateTime assert(Time_toDateTime(" 20131214093808", &t)); assert(t.tm_year == 2013); assert(t.tm_mon == 11); assert(t.tm_mday == 14); assert(t.tm_hour == 9); assert(t.tm_min == 38); assert(t.tm_sec == 8); // Compressed Date assert(Time_toDateTime(" 20131214 ", &t)); assert(t.tm_year == 2013); assert(t.tm_mon == 11); assert(t.tm_mday == 14); // Compressed Time assert(Time_toDateTime("093808", &t)); assert(t.tm_hour == 9); assert(t.tm_min == 38); assert(t.tm_sec == 8); // Reverse DateTime assert(Time_toDateTime(" 09:38:08 2013-12-14", &t)); assert(t.tm_year == 2013); assert(t.tm_mon == 11); assert(t.tm_mday == 14); assert(t.tm_hour == 9); assert(t.tm_min == 38); assert(t.tm_sec == 8); // DateTime with timezone Zulu (UTC) assert(Time_toDateTime("The Battle of Stamford Bridge 1066-09-25 12:15:33+00:00", &t)); assert(t.tm_year == 1066); assert(t.tm_mon == 8); assert(t.tm_mday == 25); assert(t.tm_hour == 12); assert(t.tm_min == 15); assert(t.tm_sec == 33); assert(t.TM_GMTOFF == 0); // offset from UTC in seconds // Time with timezone assert(Time_toDateTime(" 09:38:08+01:45", &t)); assert(t.tm_hour == 9); assert(t.tm_min == 38); assert(t.tm_sec == 8); assert(t.TM_GMTOFF == 6300); // Time with timezone PST compressed assert(Time_toDateTime("Pacific Time Zone 09:38:08 -0800 ", &t)); assert(t.tm_hour == 9); assert(t.tm_min == 38); assert(t.tm_sec == 8); assert(t.TM_GMTOFF == -28800); // Date without time, tz should not be set assert(Time_toDateTime("2013-12-15-0800 ", &t)); assert(t.TM_GMTOFF == 0); // Invalid date TRY { Time_toDateTime("1901-123-45", &t); printf("\t Test Failed\n"); exit(1); } CATCH (AssertException) { // OK } ELSE { printf("\t Test Failed with wrong exception\n"); exit(1); } END_TRY; } printf("=> Test8: OK\n\n"); printf("=> Test9: Time_toTimestamp\n"); { // Time, fraction of second is ignored. No timezone in string means UTC time_t t = Time_toTimestamp("2013-12-15 00:12:58.123456"); assert(t == 1387066378); // TimeZone east t = Time_toTimestamp("Tokyo timezone: 2013-12-15 09:12:58+09:00"); assert(t == 1387066378); // TimeZone west t = Time_toTimestamp("New York timezone: 2013-12-14 19:12:58-05:00"); assert(t == 1387066378); // TimeZone east with hour and minute offset t = Time_toTimestamp("Nepal timezone: 2013-12-15 05:57:58+05:45"); assert(t == 1387066378); // TimeZone Zulu t = Time_toTimestamp("Grenwich timezone: 2013-12-15 00:12:58Z"); assert(t == 1387066378); // Compressed t = Time_toTimestamp("20131214191258-0500"); assert(t == 1387066378); // Invalid timestamp string TRY { Time_toTimestamp("1901-123-45 10:12:14"); // Should not come here printf("\t Test Failed\n"); exit(1); } CATCH (AssertException) { // OK } ELSE { printf("\t Test Failed with wrong exception\n"); exit(1); } END_TRY; } printf("=> Test9: OK\n\n"); printf("============> Time Tests: OK\n\n"); return 0; }
int main(void) { Bootstrap(); // Need to initialize library printf("============> Start Time Tests\n\n"); printf("=> Test1: Parse String\n"); { long r; char d1[STRLEN]; char s[] = " Thu, 17 Oct 2002 19:10:01; "; char y[] = "Year: 2011 Day: 14 Month: June"; printf("\tParsing a null date string: %ld\n", Time_parse(NULL)); assert(Time_parse(NULL) == -1); r = Time_parse(s); printf("\tParsed datestring has value: %ld\n", r); assert(r == 1034874601); printf("\tWhich transform to the local date: %s\n", Time_fmt(d1, STRLEN, "%a, %d %b %Y %H:%M:%S %z", r)); r = Time_parse(y); printf("\tSecond parsed datestring has value: %ld\n", r); assert(r == 1308002400); printf("\tWhich transform to the local date: %s\n", Time_fmt(d1, STRLEN, "%a, %d %b %Y %H:%M:%S %z", r)); } printf("=> Test1: OK\n\n"); printf("=> Test2: check string ouput\n"); { char result[30]; Time_string(1267441200, result); /* 01 Mar 2010 12:00:00 */ printf("\tResult: local unix time 1267441200 to localtime:\n\t %s\n", result); assert(Str_isEqual(result, "Mon, 01 Mar 2010 12:00:00")); Time_gmtstring(1267441200, result); /* 01 Mar 2010 12:00:00 GMT */ printf("\tResult: local unix time 1267441200 to UTC:\n\t %s\n", result); assert(Str_isEqual("Mon, 01 Mar 2010 11:00:00 GMT", result)); } printf("=> Test2: OK\n\n"); printf("=> Test3: check current time\n"); { struct timeval tv; assert(!gettimeofday(&tv, NULL)); assert(Time_now() == tv.tv_sec); } printf("=> Test3: OK\n\n"); printf("=> Test4: convert CEST time_t to GMT\n"); { assert(Time_gmt(1267441200) == 1267437600); } printf("=> Test4: OK\n\n"); printf("=> Test5: sleep 1s\n"); { time_t now; now = Time_now(); Time_usleep(1000000); assert((now + 1) == Time_now()); } printf("=> Test5: OK\n\n"); printf("=> Test6: uptime\n"); { time_t days = 668040; time_t hours = 63240; time_t min = 2040; char result[24]; printf("\tResult: uptime days: %s\n", Time_uptime(days, result)); assert(Str_isEqual(result, "7d, 17h, 34m")); printf("\tResult: uptime hours: %s\n", Time_uptime(hours, result)); assert(Str_isEqual(result, "17h, 34m")); printf("\tResult: uptime min: %s\n", Time_uptime(min, result)); assert(Str_isEqual(result, "34m")); printf("\tResult: uptime 0: %s\n", Time_uptime(0, result)); assert(Str_isEqual(result, "")); assert(Time_uptime(0, NULL) == NULL); } printf("=> Test6: OK\n\n"); printf("=> Test7: fmt\n"); { char result[STRLEN]; Time_fmt(result, STRLEN, "%D %T", 1267441200); printf("\tResult: 1267441200 -> %s\n", result); assert(Str_isEqual(result, "03/01/10 12:00:00")); Time_fmt(result, STRLEN, "%D", 1267441200); printf("\tResult: 1267441200 -> %s\n", result); assert(Str_startsWith(result, "03/01/10")); } printf("=> Test7: OK\n\n"); printf("=> Test8: Time attributes\n"); { char b[STRLEN]; time_t time = 730251059; // Sun, 21. Feb 1993 00:30:59 printf("\tResult: %s (winter time)\n", Time_string(time, b)); assert(Time_seconds(time) == 59); assert(Time_minutes(time) == 30); assert(Time_hour(time) == 0); assert(Time_weekday(time) == 0); assert(Time_day(time) == 21); assert(Time_month(time) == 2); assert(Time_year(time) == 1993); time = 1253045894; // Tue, 15 Sep 2009 22:18:14 +0200 printf("\tResult: %s (DTS/summer time)\n", Time_string(time, b)); assert(Str_startsWith(b, "Tue, 15 Sep 2009 22:18:14")); } printf("=> Test8: OK\n\n"); printf("=> Test9: Time_add\n"); { char b[STRLEN]; time_t t = 730251059; // Sun, 21. Feb 1993 00:30:59 time_t time = Time_add(t, -1, -1, 8); // Wed, 29 Jan 1992 00:30:59 printf("\tResult: %s\n", Time_string(time, b)); assert(Time_seconds(time) == 59); assert(Time_minutes(time) == 30); assert(Time_hour(time) == 0); assert(Time_day(time) == 29); assert(Time_month(time) == 1); assert(Time_year(time) == 1992); } printf("=> Test9: OK\n\n"); printf("=> Test10: Time_build\n"); { time_t time = Time_build(2001, 1, 29, 12, 0, 0); assert(Time_seconds(time) == 0); assert(Time_minutes(time) == 0); assert(Time_hour(time) == 12); assert(Time_day(time) == 29); assert(Time_month(time) == 1); assert(Time_year(time) == 2001); // Verify assert on out of range TRY { Time_build(1969, 1, 29, 12, 0, 0); printf("Test failed\n"); exit(1); } CATCH (AssertException) END_TRY; TRY { Time_build(1970, 0, 29, 12, 0, 0); printf("Test failed\n"); exit(1); } CATCH (AssertException) END_TRY; } printf("=> Test10: OK\n\n"); printf("=> Test11: Time_daysBetween\n"); { time_t from = Time_build(2001, 1, 29, 0, 0, 0); time_t to = from; assert(Time_daysBetween(from, to) == 0); assert(Time_daysBetween(from, Time_build(2001, 1, 30, 0, 0, 0)) == 1); assert(Time_daysBetween(from, Time_build(2001, 1, 28, 0, 0, 0)) == 1); assert(Time_daysBetween(Time_build(2001, 1, 1, 0, 0, 0), Time_build(2002, 1, 1, 0, 0, 0)) == 365); } printf("=> Test11: OK\n\n"); printf("=> Test12: Time_incron\n"); { const char *exactmatch = "27 11 5 7 2"; const char *matchall = "* * * * *"; const char *invalid1 = "a bc d"; const char *invalid2 = "* * * * "; // Too few fields const char *invalid3 = "* * * * * * "; // Too many fields const char *range1 = "* 10-11 1-5 * 1-5"; const char *rangeoutside = "1-10 9-10 1-5 * 1-5"; const char *sequence = "* 10,11 1-3,5,6 * *"; const char *sequenceoutside = "* 10,11,12 4,5,6 * 0,6"; time_t time = Time_build(2011, 7, 5, 11, 27, 5); assert(Time_incron(exactmatch, time)); assert(Time_incron(matchall, time)); assert(! Time_incron(invalid1, time)); assert(! Time_incron(invalid2, time)); assert(! Time_incron(invalid3, time)); assert(Time_incron(range1, time)); assert(! Time_incron(rangeoutside, time)); assert(Time_incron(sequence, time)); assert(! Time_incron(sequenceoutside, time)); } printf("=> Test12: OK\n\n"); printf("============> Time Tests: OK\n\n"); return 0; }