Skip to content

Commit

Permalink
Synchronize each miscrosec test to the next second (splunk#109)
Browse files Browse the repository at this point in the history
* Synchronize each miscrosec test to the next second

The aim is to avoid false positives in test_microsec when the seconds,
minutes or hours change during time read between the second_clock and
the microsec_clock.

* Improved readability of the microcec_time_clock test
  • Loading branch information
cclienti authored and JeffGarland committed Oct 8, 2019
1 parent 29bb209 commit 3cc68a4
Showing 1 changed file with 87 additions and 58 deletions.
145 changes: 87 additions & 58 deletions test/posix_time/testmicrosec_time_clock.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
* Use, modification and distribution is subject to the
* Use, modification and distribution is subject to the
* Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
Expand All @@ -12,95 +12,125 @@
#include <windows.h>
#endif

void
sync_to_next_second()
{
using namespace boost::posix_time;

ptime t_prev;
ptime t_now = second_clock::local_time();

// Wait the next seconds
do
{
t_prev = t_now;
t_now = second_clock::local_time();
} while (t_now.time_of_day().seconds() == t_prev.time_of_day().seconds());

// Wait 300ms in order to avoid seconds of second_clock > microsec_clock.
t_now = microsec_clock::local_time();
t_prev = t_now;
do
{
t_now = microsec_clock::local_time();
} while (t_now - t_prev < milliseconds(300));

}


int
main()
main()
{
#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK

using namespace boost::posix_time;

// ptime last = boost::date_time::microsec_resolution_clock<ptime>::local_time();
ptime last = microsec_clock::local_time();
std::cout << "Check local time of microsec_clock against second_clock" << std::endl;

ptime last = microsec_clock::local_time();
int max = 30;
int i = 0;
for (i = 0; i<max; i++)
for (int i=0; i<max; i++)
{
for (int j=0; j<100000; j++)
{
// some systems loop too fast so "last is less" tests fail
// due to 'last' & 't2' being equal. These calls slow
// it down enough to make 'last' & 't2' different
#if defined(BOOST_HAS_GETTIMEOFDAY)
timeval tv;
gettimeofday(&tv, 0);
#endif
#if defined(BOOST_HAS_FTIME)
SYSTEMTIME st;
GetSystemTime(&st);
#endif
}
// Some systems loop too fast so "last is less" tests fail due to
// 'last' & 't2' being equal. These calls slow it down enough to
// make 'last' & 't2' different. Moreover, we must wait the next
// second to avoid a change in hour, minute or second field
// between acquisition of t1 and t2.
sync_to_next_second();

ptime t1 = second_clock::local_time();
std::cout << to_simple_string(t1) << std::endl;

ptime t2 = microsec_clock::local_time();
std::cout << to_simple_string(t2) << std::endl;
check("hours match", t1.time_of_day().hours() == t2.time_of_day().hours());
check("minutes match",
t1.time_of_day().minutes() == t2.time_of_day().minutes());
check("seconds match",

check("check equality of hours "
"between second_clock and microsec_clock timestamps",
t1.time_of_day().hours() == t2.time_of_day().hours());

check("check equality of minutes "
"between second_clock and microsec_clock timestamps",
t1.time_of_day().minutes() == t2.time_of_day().minutes());
check("hours date", t1.date() == t2.date());
if( !check("last is less", last <= t2) ) {
std::cout << to_simple_string(last) << " < "
<< to_simple_string(t2) << std::endl;

check("check equality of seconds "
"between second_clock and microsec_clock timestamps",
t1.time_of_day().seconds() == t2.time_of_day().seconds());

check("check equality of date"
"between second_clock and microsec_clock timestamps",
t1.date() == t2.date());

if( !check("check that previous microsec_clock timestamp "
"is less than the current", last < t2) ) {
std::cout << to_simple_string(last) << " < "
<< to_simple_string(t2) << std::endl;
}
last = t2;


last = t2;
}


std::cout << "Now do the same test for universal time -- a few less iterations" << std::endl;
std::cout << "Check universal time of microsec_clock against second_clock" << std::endl;
max = 10;
last = microsec_clock::universal_time();
for (i = 0; i<max; i++)
for (int i=0; i<max; i++)
{
for (int j=0; j<100000; j++)
{
// some systems loop too fast so "last is less" tests fail
// due to 'last' & 't2' being equal. These calls slow
// it down enough to make 'last' & 't2' different
#if defined(BOOST_HAS_GETTIMEOFDAY)
timeval tv;
gettimeofday(&tv, 0);
#endif
#if defined(BOOST_HAS_FTIME)
SYSTEMTIME st;
GetSystemTime(&st);
#endif
}
// Some systems loop too fast so "last is less" tests fail due to
// 'last' & 't2' being equal. These calls slow it down enough to
// make 'last' & 't2' different. Moreover, we must wait the next
// second to avoid a change in hour, minute or second field
// between acquisition of t1 and t2.
sync_to_next_second();

ptime t1 = second_clock::universal_time();
std::cout << to_simple_string(t1) << std::endl;

ptime t2 = microsec_clock::universal_time();
std::cout << to_simple_string(t2) << std::endl;
check("hours match", t1.time_of_day().hours() == t2.time_of_day().hours());
check("minutes match",
t1.time_of_day().minutes() == t2.time_of_day().minutes());
check("seconds match",

check("check equality of hours "
"between second_clock and microsec_clock timestamps",
t1.time_of_day().hours() == t2.time_of_day().hours());

check("check equality of minutes "
"between second_clock and microsec_clock timestamps",
t1.time_of_day().minutes() == t2.time_of_day().minutes());
check("hours date", t1.date() == t2.date());
//following check might be equal on a really fast machine
if( !check("last is less", last <= t2) ) {
std::cout << to_simple_string(last) << " < "
<< to_simple_string(t2) << std::endl;

check("check equality of seconds "
"between second_clock and microsec_clock timestamps",
t1.time_of_day().seconds() == t2.time_of_day().seconds());

check("check equality of date"
"between second_clock and microsec_clock timestamps",
t1.date() == t2.date());

if( !check("check that previous microsec_clock timestamp "
"is less than the current", last < t2) ) {
std::cout << to_simple_string(last) << " < "
<< to_simple_string(t2) << std::endl;
}
last = t2;


last = t2;
}

#else
Expand All @@ -109,4 +139,3 @@ main()
return printTestStats();

}

0 comments on commit 3cc68a4

Please sign in to comment.