xref: /src/contrib/kyua/utils/datetime_test.cpp (revision 6b13d60bf49ee40626d7e3a5d5a80519f0067307)
108334c51SBrooks Davis // Copyright 2010 The Kyua Authors.
208334c51SBrooks Davis // All rights reserved.
308334c51SBrooks Davis //
408334c51SBrooks Davis // Redistribution and use in source and binary forms, with or without
508334c51SBrooks Davis // modification, are permitted provided that the following conditions are
608334c51SBrooks Davis // met:
708334c51SBrooks Davis //
808334c51SBrooks Davis // * Redistributions of source code must retain the above copyright
908334c51SBrooks Davis //   notice, this list of conditions and the following disclaimer.
1008334c51SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
1108334c51SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
1208334c51SBrooks Davis //   documentation and/or other materials provided with the distribution.
1308334c51SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
1408334c51SBrooks Davis //   may be used to endorse or promote products derived from this software
1508334c51SBrooks Davis //   without specific prior written permission.
1608334c51SBrooks Davis //
1708334c51SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1808334c51SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1908334c51SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2008334c51SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2108334c51SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2208334c51SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2308334c51SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2408334c51SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2508334c51SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2608334c51SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2708334c51SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2808334c51SBrooks Davis 
2908334c51SBrooks Davis #include "utils/datetime.hpp"
3008334c51SBrooks Davis 
3108334c51SBrooks Davis extern "C" {
3208334c51SBrooks Davis #include <time.h>
3308334c51SBrooks Davis #include <unistd.h>
3408334c51SBrooks Davis }
3508334c51SBrooks Davis 
3608334c51SBrooks Davis #include <sstream>
3708334c51SBrooks Davis #include <stdexcept>
3808334c51SBrooks Davis 
3908334c51SBrooks Davis #include <atf-c++.hpp>
4008334c51SBrooks Davis 
4108334c51SBrooks Davis namespace datetime = utils::datetime;
4208334c51SBrooks Davis 
4308334c51SBrooks Davis 
4408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__defaults);
ATF_TEST_CASE_BODY(delta__defaults)4508334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__defaults)
4608334c51SBrooks Davis {
4708334c51SBrooks Davis     const datetime::delta delta;
4808334c51SBrooks Davis     ATF_REQUIRE_EQ(0, delta.seconds);
4908334c51SBrooks Davis     ATF_REQUIRE_EQ(0, delta.useconds);
5008334c51SBrooks Davis }
5108334c51SBrooks Davis 
5208334c51SBrooks Davis 
5308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__overrides);
ATF_TEST_CASE_BODY(delta__overrides)5408334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__overrides)
5508334c51SBrooks Davis {
5608334c51SBrooks Davis     const datetime::delta delta(1, 2);
5708334c51SBrooks Davis     ATF_REQUIRE_EQ(1, delta.seconds);
5808334c51SBrooks Davis     ATF_REQUIRE_EQ(2, delta.useconds);
5908334c51SBrooks Davis 
6008334c51SBrooks Davis     ATF_REQUIRE_THROW_RE(
6108334c51SBrooks Davis         std::runtime_error, "Negative.*not supported.*-4999997us",
6208334c51SBrooks Davis         datetime::delta(-5, 3));
6308334c51SBrooks Davis }
6408334c51SBrooks Davis 
6508334c51SBrooks Davis 
6608334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__from_microseconds);
ATF_TEST_CASE_BODY(delta__from_microseconds)6708334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__from_microseconds)
6808334c51SBrooks Davis {
6908334c51SBrooks Davis     {
7008334c51SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(0);
7108334c51SBrooks Davis         ATF_REQUIRE_EQ(0, delta.seconds);
7208334c51SBrooks Davis         ATF_REQUIRE_EQ(0, delta.useconds);
7308334c51SBrooks Davis     }
7408334c51SBrooks Davis     {
7508334c51SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(
7608334c51SBrooks Davis             999999);
7708334c51SBrooks Davis         ATF_REQUIRE_EQ(0, delta.seconds);
7808334c51SBrooks Davis         ATF_REQUIRE_EQ(999999, delta.useconds);
7908334c51SBrooks Davis     }
8008334c51SBrooks Davis     {
8108334c51SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(
8208334c51SBrooks Davis             1000000);
8308334c51SBrooks Davis         ATF_REQUIRE_EQ(1, delta.seconds);
8408334c51SBrooks Davis         ATF_REQUIRE_EQ(0, delta.useconds);
8508334c51SBrooks Davis     }
8608334c51SBrooks Davis     {
8708334c51SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(
8808334c51SBrooks Davis             10576293);
8908334c51SBrooks Davis         ATF_REQUIRE_EQ(10, delta.seconds);
9008334c51SBrooks Davis         ATF_REQUIRE_EQ(576293, delta.useconds);
9108334c51SBrooks Davis     }
9208334c51SBrooks Davis     {
9308334c51SBrooks Davis         const datetime::delta delta = datetime::delta::from_microseconds(
9408334c51SBrooks Davis             123456789123456LL);
9508334c51SBrooks Davis         ATF_REQUIRE_EQ(123456789, delta.seconds);
9608334c51SBrooks Davis         ATF_REQUIRE_EQ(123456, delta.useconds);
9708334c51SBrooks Davis     }
9808334c51SBrooks Davis 
9908334c51SBrooks Davis     ATF_REQUIRE_THROW_RE(
10008334c51SBrooks Davis         std::runtime_error, "Negative.*not supported.*-12345us",
10108334c51SBrooks Davis         datetime::delta::from_microseconds(-12345));
10208334c51SBrooks Davis }
10308334c51SBrooks Davis 
10408334c51SBrooks Davis 
10508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__to_microseconds);
ATF_TEST_CASE_BODY(delta__to_microseconds)10608334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__to_microseconds)
10708334c51SBrooks Davis {
10808334c51SBrooks Davis     ATF_REQUIRE_EQ(0, datetime::delta(0, 0).to_microseconds());
10908334c51SBrooks Davis     ATF_REQUIRE_EQ(999999, datetime::delta(0, 999999).to_microseconds());
11008334c51SBrooks Davis     ATF_REQUIRE_EQ(1000000, datetime::delta(1, 0).to_microseconds());
11108334c51SBrooks Davis     ATF_REQUIRE_EQ(10576293, datetime::delta(10, 576293).to_microseconds());
11208334c51SBrooks Davis     ATF_REQUIRE_EQ(11576293, datetime::delta(10, 1576293).to_microseconds());
11308334c51SBrooks Davis }
11408334c51SBrooks Davis 
11508334c51SBrooks Davis 
11608334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__equals);
ATF_TEST_CASE_BODY(delta__equals)11708334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__equals)
11808334c51SBrooks Davis {
11908334c51SBrooks Davis     ATF_REQUIRE(datetime::delta() == datetime::delta());
12008334c51SBrooks Davis     ATF_REQUIRE(datetime::delta() == datetime::delta(0, 0));
12108334c51SBrooks Davis     ATF_REQUIRE(datetime::delta(1, 2) == datetime::delta(1, 2));
12208334c51SBrooks Davis 
12308334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta() == datetime::delta(0, 1)));
12408334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta() == datetime::delta(1, 0)));
12508334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(1, 2) == datetime::delta(2, 1)));
12608334c51SBrooks Davis }
12708334c51SBrooks Davis 
12808334c51SBrooks Davis 
12908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__differs);
ATF_TEST_CASE_BODY(delta__differs)13008334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__differs)
13108334c51SBrooks Davis {
13208334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta() != datetime::delta()));
13308334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta() != datetime::delta(0, 0)));
13408334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(1, 2) != datetime::delta(1, 2)));
13508334c51SBrooks Davis 
13608334c51SBrooks Davis     ATF_REQUIRE(datetime::delta() != datetime::delta(0, 1));
13708334c51SBrooks Davis     ATF_REQUIRE(datetime::delta() != datetime::delta(1, 0));
13808334c51SBrooks Davis     ATF_REQUIRE(datetime::delta(1, 2) != datetime::delta(2, 1));
13908334c51SBrooks Davis }
14008334c51SBrooks Davis 
14108334c51SBrooks Davis 
14208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__sorting);
ATF_TEST_CASE_BODY(delta__sorting)14308334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__sorting)
14408334c51SBrooks Davis {
14508334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta() <  datetime::delta()));
14608334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta() <= datetime::delta());
14708334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta() >  datetime::delta()));
14808334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta() >= datetime::delta());
14908334c51SBrooks Davis 
15008334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(9, 8) <  datetime::delta(9, 8)));
15108334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(9, 8) <= datetime::delta(9, 8));
15208334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(9, 8) >  datetime::delta(9, 8)));
15308334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(9, 8) >= datetime::delta(9, 8));
15408334c51SBrooks Davis 
15508334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 5) <  datetime::delta(4, 8));
15608334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 5) <= datetime::delta(4, 8));
15708334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 5) >  datetime::delta(4, 8)));
15808334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 5) >= datetime::delta(4, 8)));
15908334c51SBrooks Davis 
16008334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 5) <  datetime::delta(2, 8));
16108334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 5) <= datetime::delta(2, 8));
16208334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 5) >  datetime::delta(2, 8)));
16308334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 5) >= datetime::delta(2, 8)));
16408334c51SBrooks Davis 
16508334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(4, 8) <  datetime::delta(2, 5)));
16608334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(4, 8) <= datetime::delta(2, 5)));
16708334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(4, 8) >  datetime::delta(2, 5));
16808334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(4, 8) >= datetime::delta(2, 5));
16908334c51SBrooks Davis 
17008334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 8) <  datetime::delta(2, 5)));
17108334c51SBrooks Davis     ATF_REQUIRE(!(datetime::delta(2, 8) <= datetime::delta(2, 5)));
17208334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 8) >  datetime::delta(2, 5));
17308334c51SBrooks Davis     ATF_REQUIRE(  datetime::delta(2, 8) >= datetime::delta(2, 5));
17408334c51SBrooks Davis }
17508334c51SBrooks Davis 
17608334c51SBrooks Davis 
17708334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__addition);
ATF_TEST_CASE_BODY(delta__addition)17808334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__addition)
17908334c51SBrooks Davis {
18008334c51SBrooks Davis     using datetime::delta;
18108334c51SBrooks Davis 
18208334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(), delta() + delta());
18308334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(0, 10), delta() + delta(0, 10));
18408334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(10, 0), delta(10, 0) + delta());
18508334c51SBrooks Davis 
18608334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(1, 234567), delta(0, 1234567) + delta());
18708334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(12, 34), delta(10, 20) + delta(2, 14));
18808334c51SBrooks Davis }
18908334c51SBrooks Davis 
19008334c51SBrooks Davis 
19108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__addition_and_set);
ATF_TEST_CASE_BODY(delta__addition_and_set)19208334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__addition_and_set)
19308334c51SBrooks Davis {
19408334c51SBrooks Davis     using datetime::delta;
19508334c51SBrooks Davis 
19608334c51SBrooks Davis     {
19708334c51SBrooks Davis         delta d;
19808334c51SBrooks Davis         d += delta(3, 5);
19908334c51SBrooks Davis         ATF_REQUIRE_EQ(delta(3, 5), d);
20008334c51SBrooks Davis     }
20108334c51SBrooks Davis     {
20208334c51SBrooks Davis         delta d(1, 2);
20308334c51SBrooks Davis         d += delta(3, 5);
20408334c51SBrooks Davis         ATF_REQUIRE_EQ(delta(4, 7), d);
20508334c51SBrooks Davis     }
20608334c51SBrooks Davis     {
20708334c51SBrooks Davis         delta d(1, 2);
20808334c51SBrooks Davis         ATF_REQUIRE_EQ(delta(4, 7), (d += delta(3, 5)));
20908334c51SBrooks Davis     }
21008334c51SBrooks Davis }
21108334c51SBrooks Davis 
21208334c51SBrooks Davis 
21308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__scale);
ATF_TEST_CASE_BODY(delta__scale)21408334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__scale)
21508334c51SBrooks Davis {
21608334c51SBrooks Davis     using datetime::delta;
21708334c51SBrooks Davis 
21808334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(), delta() * 0);
21908334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(), delta() * 5);
22008334c51SBrooks Davis 
22108334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(0, 30), delta(0, 10) * 3);
22208334c51SBrooks Davis     ATF_REQUIRE_EQ(delta(17, 500000), delta(3, 500000) * 5);
22308334c51SBrooks Davis }
22408334c51SBrooks Davis 
22508334c51SBrooks Davis 
22608334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__scale_and_set);
ATF_TEST_CASE_BODY(delta__scale_and_set)22708334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__scale_and_set)
22808334c51SBrooks Davis {
22908334c51SBrooks Davis     using datetime::delta;
23008334c51SBrooks Davis 
23108334c51SBrooks Davis     {
23208334c51SBrooks Davis         delta d(3, 5);
23308334c51SBrooks Davis         d *= 2;
23408334c51SBrooks Davis         ATF_REQUIRE_EQ(delta(6, 10), d);
23508334c51SBrooks Davis     }
23608334c51SBrooks Davis     {
23708334c51SBrooks Davis         delta d(8, 0);
23808334c51SBrooks Davis         d *= 8;
23908334c51SBrooks Davis         ATF_REQUIRE_EQ(delta(64, 0), d);
24008334c51SBrooks Davis     }
24108334c51SBrooks Davis     {
24208334c51SBrooks Davis         delta d(3, 5);
24308334c51SBrooks Davis         ATF_REQUIRE_EQ(delta(9, 15), (d *= 3));
24408334c51SBrooks Davis     }
24508334c51SBrooks Davis }
24608334c51SBrooks Davis 
24708334c51SBrooks Davis 
24808334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(delta__output);
ATF_TEST_CASE_BODY(delta__output)24908334c51SBrooks Davis ATF_TEST_CASE_BODY(delta__output)
25008334c51SBrooks Davis {
25108334c51SBrooks Davis     {
25208334c51SBrooks Davis         std::ostringstream str;
25308334c51SBrooks Davis         str << datetime::delta(15, 8791);
25408334c51SBrooks Davis         ATF_REQUIRE_EQ("15008791us", str.str());
25508334c51SBrooks Davis     }
25608334c51SBrooks Davis     {
25708334c51SBrooks Davis         std::ostringstream str;
25808334c51SBrooks Davis         str << datetime::delta(12345678, 0);
25908334c51SBrooks Davis         ATF_REQUIRE_EQ("12345678000000us", str.str());
26008334c51SBrooks Davis     }
26108334c51SBrooks Davis }
26208334c51SBrooks Davis 
26308334c51SBrooks Davis 
26408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__copy);
ATF_TEST_CASE_BODY(timestamp__copy)26508334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__copy)
26608334c51SBrooks Davis {
26708334c51SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
26808334c51SBrooks Davis         2011, 2, 16, 19, 15, 30, 0);
26908334c51SBrooks Davis     {
27008334c51SBrooks Davis         const datetime::timestamp ts2 = ts1;
27108334c51SBrooks Davis         const datetime::timestamp ts3 = datetime::timestamp::from_values(
27208334c51SBrooks Davis             2012, 2, 16, 19, 15, 30, 0);
27308334c51SBrooks Davis         ATF_REQUIRE_EQ("2011", ts1.strftime("%Y"));
27408334c51SBrooks Davis         ATF_REQUIRE_EQ("2011", ts2.strftime("%Y"));
27508334c51SBrooks Davis         ATF_REQUIRE_EQ("2012", ts3.strftime("%Y"));
27608334c51SBrooks Davis     }
27708334c51SBrooks Davis     ATF_REQUIRE_EQ("2011", ts1.strftime("%Y"));
27808334c51SBrooks Davis }
27908334c51SBrooks Davis 
28008334c51SBrooks Davis 
28108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__from_microseconds);
ATF_TEST_CASE_BODY(timestamp__from_microseconds)28208334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__from_microseconds)
28308334c51SBrooks Davis {
28408334c51SBrooks Davis     const datetime::timestamp ts = datetime::timestamp::from_microseconds(
28508334c51SBrooks Davis         1328829351987654LL);
28608334c51SBrooks Davis     ATF_REQUIRE_EQ("2012-02-09 23:15:51", ts.strftime("%Y-%m-%d %H:%M:%S"));
28708334c51SBrooks Davis     ATF_REQUIRE_EQ(1328829351987654LL, ts.to_microseconds());
28808334c51SBrooks Davis     ATF_REQUIRE_EQ(1328829351, ts.to_seconds());
28908334c51SBrooks Davis }
29008334c51SBrooks Davis 
29108334c51SBrooks Davis 
29208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__mock);
ATF_TEST_CASE_BODY(timestamp__now__mock)29308334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__now__mock)
29408334c51SBrooks Davis {
29508334c51SBrooks Davis     datetime::set_mock_now(2011, 2, 21, 18, 5, 10, 0);
29608334c51SBrooks Davis     ATF_REQUIRE_EQ("2011-02-21 18:05:10",
29708334c51SBrooks Davis                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
29808334c51SBrooks Davis 
29908334c51SBrooks Davis     datetime::set_mock_now(datetime::timestamp::from_values(
30008334c51SBrooks Davis                                2012, 3, 22, 19, 6, 11, 54321));
30108334c51SBrooks Davis     ATF_REQUIRE_EQ("2012-03-22 19:06:11",
30208334c51SBrooks Davis                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
30308334c51SBrooks Davis     ATF_REQUIRE_EQ("2012-03-22 19:06:11",
30408334c51SBrooks Davis                    datetime::timestamp::now().strftime("%Y-%m-%d %H:%M:%S"));
30508334c51SBrooks Davis }
30608334c51SBrooks Davis 
30708334c51SBrooks Davis 
30808334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__real);
ATF_TEST_CASE_BODY(timestamp__now__real)30908334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__now__real)
31008334c51SBrooks Davis {
31108334c51SBrooks Davis     // This test is might fail if we happen to run at the crossing of one
31208334c51SBrooks Davis     // day to the other and the two measures we pick of the current time
31308334c51SBrooks Davis     // differ.  This is so unlikely that I haven't bothered to do this in any
31408334c51SBrooks Davis     // other way.
31508334c51SBrooks Davis 
31608334c51SBrooks Davis     const time_t just_before = ::time(NULL);
31708334c51SBrooks Davis     const datetime::timestamp now = datetime::timestamp::now();
31808334c51SBrooks Davis 
31908334c51SBrooks Davis     ::tm data;
32008334c51SBrooks Davis     char buf[1024];
32108334c51SBrooks Davis     ATF_REQUIRE(::gmtime_r(&just_before, &data) != 0);
32208334c51SBrooks Davis     ATF_REQUIRE(::strftime(buf, sizeof(buf), "%Y-%m-%d", &data) != 0);
32308334c51SBrooks Davis     ATF_REQUIRE_EQ(buf, now.strftime("%Y-%m-%d"));
32408334c51SBrooks Davis 
32508334c51SBrooks Davis     ATF_REQUIRE(now.strftime("%Z") == "GMT" || now.strftime("%Z") == "UTC");
32608334c51SBrooks Davis }
32708334c51SBrooks Davis 
32808334c51SBrooks Davis 
32908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__now__granularity);
ATF_TEST_CASE_BODY(timestamp__now__granularity)33008334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__now__granularity)
33108334c51SBrooks Davis {
33208334c51SBrooks Davis     const datetime::timestamp first = datetime::timestamp::now();
33308334c51SBrooks Davis     ::usleep(1);
33408334c51SBrooks Davis     const datetime::timestamp second = datetime::timestamp::now();
33508334c51SBrooks Davis     ATF_REQUIRE(first.to_microseconds() != second.to_microseconds());
33608334c51SBrooks Davis }
33708334c51SBrooks Davis 
33808334c51SBrooks Davis 
33908334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__strftime);
ATF_TEST_CASE_BODY(timestamp__strftime)34008334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__strftime)
34108334c51SBrooks Davis {
34208334c51SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
34308334c51SBrooks Davis         2010, 12, 10, 8, 45, 50, 0);
34408334c51SBrooks Davis     ATF_REQUIRE_EQ("2010-12-10", ts1.strftime("%Y-%m-%d"));
34508334c51SBrooks Davis     ATF_REQUIRE_EQ("08:45:50", ts1.strftime("%H:%M:%S"));
34608334c51SBrooks Davis 
34708334c51SBrooks Davis     const datetime::timestamp ts2 = datetime::timestamp::from_values(
34808334c51SBrooks Davis         2011, 2, 16, 19, 15, 30, 0);
34908334c51SBrooks Davis     ATF_REQUIRE_EQ("2011-02-16T19:15:30", ts2.strftime("%Y-%m-%dT%H:%M:%S"));
35008334c51SBrooks Davis }
35108334c51SBrooks Davis 
35208334c51SBrooks Davis 
35308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__to_iso8601_in_utc);
ATF_TEST_CASE_BODY(timestamp__to_iso8601_in_utc)35408334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__to_iso8601_in_utc)
35508334c51SBrooks Davis {
35608334c51SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
35708334c51SBrooks Davis         2010, 12, 10, 8, 45, 50, 0);
35808334c51SBrooks Davis     ATF_REQUIRE_EQ("2010-12-10T08:45:50.000000Z", ts1.to_iso8601_in_utc());
35908334c51SBrooks Davis 
36008334c51SBrooks Davis     const datetime::timestamp ts2= datetime::timestamp::from_values(
36108334c51SBrooks Davis         2016, 7, 11, 17, 51, 28, 123456);
36208334c51SBrooks Davis     ATF_REQUIRE_EQ("2016-07-11T17:51:28.123456Z", ts2.to_iso8601_in_utc());
36308334c51SBrooks Davis }
36408334c51SBrooks Davis 
36508334c51SBrooks Davis 
36608334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__to_microseconds);
ATF_TEST_CASE_BODY(timestamp__to_microseconds)36708334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__to_microseconds)
36808334c51SBrooks Davis {
36908334c51SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
37008334c51SBrooks Davis         2010, 12, 10, 8, 45, 50, 123456);
37108334c51SBrooks Davis     ATF_REQUIRE_EQ(1291970750123456LL, ts1.to_microseconds());
37208334c51SBrooks Davis }
37308334c51SBrooks Davis 
37408334c51SBrooks Davis 
37508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__to_seconds);
ATF_TEST_CASE_BODY(timestamp__to_seconds)37608334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__to_seconds)
37708334c51SBrooks Davis {
37808334c51SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
37908334c51SBrooks Davis         2010, 12, 10, 8, 45, 50, 123456);
38008334c51SBrooks Davis     ATF_REQUIRE_EQ(1291970750, ts1.to_seconds());
38108334c51SBrooks Davis }
38208334c51SBrooks Davis 
38308334c51SBrooks Davis 
38408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__leap_second);
ATF_TEST_CASE_BODY(timestamp__leap_second)38508334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__leap_second)
38608334c51SBrooks Davis {
38708334c51SBrooks Davis     // This is actually a test for from_values(), which is the function that
38808334c51SBrooks Davis     // includes assertions to validate the input parameters.
38908334c51SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_values(
39008334c51SBrooks Davis         2012, 6, 30, 23, 59, 60, 543);
39108334c51SBrooks Davis     ATF_REQUIRE_EQ(1341100800, ts1.to_seconds());
39208334c51SBrooks Davis }
39308334c51SBrooks Davis 
39408334c51SBrooks Davis 
39508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__equals);
ATF_TEST_CASE_BODY(timestamp__equals)39608334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__equals)
39708334c51SBrooks Davis {
39808334c51SBrooks Davis     ATF_REQUIRE(datetime::timestamp::from_microseconds(1291970750123456LL) ==
39908334c51SBrooks Davis                 datetime::timestamp::from_microseconds(1291970750123456LL));
40008334c51SBrooks Davis }
40108334c51SBrooks Davis 
40208334c51SBrooks Davis 
40308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__differs);
ATF_TEST_CASE_BODY(timestamp__differs)40408334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__differs)
40508334c51SBrooks Davis {
40608334c51SBrooks Davis     ATF_REQUIRE(datetime::timestamp::from_microseconds(1291970750123456LL) !=
40708334c51SBrooks Davis                 datetime::timestamp::from_microseconds(1291970750123455LL));
40808334c51SBrooks Davis }
40908334c51SBrooks Davis 
41008334c51SBrooks Davis 
41108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__sorting);
ATF_TEST_CASE_BODY(timestamp__sorting)41208334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__sorting)
41308334c51SBrooks Davis {
41408334c51SBrooks Davis     {
41508334c51SBrooks Davis         const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
41608334c51SBrooks Davis             1291970750123455LL);
41708334c51SBrooks Davis         const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
41808334c51SBrooks Davis             1291970750123455LL);
41908334c51SBrooks Davis 
42008334c51SBrooks Davis         ATF_REQUIRE(!(ts1 < ts2));
42108334c51SBrooks Davis         ATF_REQUIRE(  ts1 <= ts2);
42208334c51SBrooks Davis         ATF_REQUIRE(!(ts1 > ts2));
42308334c51SBrooks Davis         ATF_REQUIRE(  ts1 >= ts2);
42408334c51SBrooks Davis     }
42508334c51SBrooks Davis     {
42608334c51SBrooks Davis         const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
42708334c51SBrooks Davis             1291970750123455LL);
42808334c51SBrooks Davis         const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
42908334c51SBrooks Davis             1291970759123455LL);
43008334c51SBrooks Davis 
43108334c51SBrooks Davis         ATF_REQUIRE( ts1 < ts2);
43208334c51SBrooks Davis         ATF_REQUIRE( ts1 <= ts2);
43308334c51SBrooks Davis         ATF_REQUIRE(!(ts1 > ts2));
43408334c51SBrooks Davis         ATF_REQUIRE(!(ts1 >= ts2));
43508334c51SBrooks Davis     }
43608334c51SBrooks Davis     {
43708334c51SBrooks Davis         const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
43808334c51SBrooks Davis             1291970759123455LL);
43908334c51SBrooks Davis         const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
44008334c51SBrooks Davis             1291970750123455LL);
44108334c51SBrooks Davis 
44208334c51SBrooks Davis         ATF_REQUIRE(!(ts1 < ts2));
44308334c51SBrooks Davis         ATF_REQUIRE(!(ts1 <= ts2));
44408334c51SBrooks Davis         ATF_REQUIRE(  ts1 > ts2);
44508334c51SBrooks Davis         ATF_REQUIRE(  ts1 >= ts2);
44608334c51SBrooks Davis     }
44708334c51SBrooks Davis }
44808334c51SBrooks Davis 
44908334c51SBrooks Davis 
45008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__add_delta);
ATF_TEST_CASE_BODY(timestamp__add_delta)45108334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__add_delta)
45208334c51SBrooks Davis {
45308334c51SBrooks Davis     using datetime::delta;
45408334c51SBrooks Davis     using datetime::timestamp;
45508334c51SBrooks Davis 
45608334c51SBrooks Davis     ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 21, 43, 30, 1234),
45708334c51SBrooks Davis                    timestamp::from_values(2014, 12, 11, 21, 43, 0, 0) +
45808334c51SBrooks Davis                    delta(30, 1234));
45908334c51SBrooks Davis     ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 22, 43, 7, 100),
46008334c51SBrooks Davis                    timestamp::from_values(2014, 12, 11, 21, 43, 0, 0) +
46108334c51SBrooks Davis                    delta(3602, 5000100));
46208334c51SBrooks Davis }
46308334c51SBrooks Davis 
46408334c51SBrooks Davis 
46508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__add_delta_and_set);
ATF_TEST_CASE_BODY(timestamp__add_delta_and_set)46608334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__add_delta_and_set)
46708334c51SBrooks Davis {
46808334c51SBrooks Davis     using datetime::delta;
46908334c51SBrooks Davis     using datetime::timestamp;
47008334c51SBrooks Davis 
47108334c51SBrooks Davis     {
47208334c51SBrooks Davis         timestamp ts = timestamp::from_values(2014, 12, 11, 21, 43, 0, 0);
47308334c51SBrooks Davis         ts += delta(30, 1234);
47408334c51SBrooks Davis         ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 21, 43, 30, 1234),
47508334c51SBrooks Davis                        ts);
47608334c51SBrooks Davis     }
47708334c51SBrooks Davis     {
47808334c51SBrooks Davis         timestamp ts = timestamp::from_values(2014, 12, 11, 21, 43, 0, 0);
47908334c51SBrooks Davis         ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 22, 43, 7, 100),
48008334c51SBrooks Davis                        ts += delta(3602, 5000100));
48108334c51SBrooks Davis     }
48208334c51SBrooks Davis }
48308334c51SBrooks Davis 
48408334c51SBrooks Davis 
48508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__subtract_delta);
ATF_TEST_CASE_BODY(timestamp__subtract_delta)48608334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__subtract_delta)
48708334c51SBrooks Davis {
48808334c51SBrooks Davis     using datetime::delta;
48908334c51SBrooks Davis     using datetime::timestamp;
49008334c51SBrooks Davis 
49108334c51SBrooks Davis     ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 21, 43, 10, 4321),
49208334c51SBrooks Davis                    timestamp::from_values(2014, 12, 11, 21, 43, 40, 5555) -
49308334c51SBrooks Davis                    delta(30, 1234));
49408334c51SBrooks Davis     ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 20, 43, 1, 300),
49508334c51SBrooks Davis                    timestamp::from_values(2014, 12, 11, 21, 43, 8, 400) -
49608334c51SBrooks Davis                    delta(3602, 5000100));
49708334c51SBrooks Davis }
49808334c51SBrooks Davis 
49908334c51SBrooks Davis 
50008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__subtract_delta_and_set);
ATF_TEST_CASE_BODY(timestamp__subtract_delta_and_set)50108334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__subtract_delta_and_set)
50208334c51SBrooks Davis {
50308334c51SBrooks Davis     using datetime::delta;
50408334c51SBrooks Davis     using datetime::timestamp;
50508334c51SBrooks Davis 
50608334c51SBrooks Davis     {
50708334c51SBrooks Davis         timestamp ts = timestamp::from_values(2014, 12, 11, 21, 43, 40, 5555);
50808334c51SBrooks Davis         ts -= delta(30, 1234);
50908334c51SBrooks Davis         ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 21, 43, 10, 4321),
51008334c51SBrooks Davis                        ts);
51108334c51SBrooks Davis     }
51208334c51SBrooks Davis     {
51308334c51SBrooks Davis         timestamp ts = timestamp::from_values(2014, 12, 11, 21, 43, 8, 400);
51408334c51SBrooks Davis         ATF_REQUIRE_EQ(timestamp::from_values(2014, 12, 11, 20, 43, 1, 300),
51508334c51SBrooks Davis                        ts -= delta(3602, 5000100));
51608334c51SBrooks Davis     }
51708334c51SBrooks Davis }
51808334c51SBrooks Davis 
51908334c51SBrooks Davis 
52008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__subtraction);
ATF_TEST_CASE_BODY(timestamp__subtraction)52108334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__subtraction)
52208334c51SBrooks Davis {
52308334c51SBrooks Davis     const datetime::timestamp ts1 = datetime::timestamp::from_microseconds(
52408334c51SBrooks Davis         1291970750123456LL);
52508334c51SBrooks Davis     const datetime::timestamp ts2 = datetime::timestamp::from_microseconds(
52608334c51SBrooks Davis         1291970750123468LL);
52708334c51SBrooks Davis     const datetime::timestamp ts3 = datetime::timestamp::from_microseconds(
52808334c51SBrooks Davis         1291970850123456LL);
52908334c51SBrooks Davis 
53008334c51SBrooks Davis     ATF_REQUIRE_EQ(datetime::delta(0, 0), ts1 - ts1);
53108334c51SBrooks Davis     ATF_REQUIRE_EQ(datetime::delta(0, 12), ts2 - ts1);
53208334c51SBrooks Davis     ATF_REQUIRE_EQ(datetime::delta(100, 0), ts3 - ts1);
53308334c51SBrooks Davis     ATF_REQUIRE_EQ(datetime::delta(99, 999988), ts3 - ts2);
53408334c51SBrooks Davis 
535d0738729SEnji Cooper     /*
536d0738729SEnji Cooper      * NOTE (ngie): behavior change for
537d0738729SEnji Cooper      * https://github.com/jmmv/kyua/issues/155 .
538d0738729SEnji Cooper      */
539d0738729SEnji Cooper     ATF_REQUIRE_EQ(datetime::delta::from_microseconds(1), ts2 - ts3);
54008334c51SBrooks Davis }
54108334c51SBrooks Davis 
54208334c51SBrooks Davis 
54308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(timestamp__output);
ATF_TEST_CASE_BODY(timestamp__output)54408334c51SBrooks Davis ATF_TEST_CASE_BODY(timestamp__output)
54508334c51SBrooks Davis {
54608334c51SBrooks Davis     {
54708334c51SBrooks Davis         std::ostringstream str;
54808334c51SBrooks Davis         str << datetime::timestamp::from_microseconds(1291970750123456LL);
54908334c51SBrooks Davis         ATF_REQUIRE_EQ("1291970750123456us", str.str());
55008334c51SBrooks Davis     }
55108334c51SBrooks Davis     {
55208334c51SBrooks Davis         std::ostringstream str;
55308334c51SBrooks Davis         str << datetime::timestamp::from_microseconds(1028309798759812LL);
55408334c51SBrooks Davis         ATF_REQUIRE_EQ("1028309798759812us", str.str());
55508334c51SBrooks Davis     }
55608334c51SBrooks Davis }
55708334c51SBrooks Davis 
55808334c51SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)55908334c51SBrooks Davis ATF_INIT_TEST_CASES(tcs)
56008334c51SBrooks Davis {
56108334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__defaults);
56208334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__overrides);
56308334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__from_microseconds);
56408334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__to_microseconds);
56508334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__equals);
56608334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__differs);
56708334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__sorting);
56808334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__addition);
56908334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__addition_and_set);
57008334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__scale);
57108334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__scale_and_set);
57208334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, delta__output);
57308334c51SBrooks Davis 
57408334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__copy);
57508334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__from_microseconds);
57608334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__now__mock);
57708334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__now__real);
57808334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__now__granularity);
57908334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__strftime);
58008334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__to_iso8601_in_utc);
58108334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__to_microseconds);
58208334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__to_seconds);
58308334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__leap_second);
58408334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__equals);
58508334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__differs);
58608334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__sorting);
58708334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__add_delta);
58808334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__add_delta_and_set);
58908334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__subtract_delta);
59008334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__subtract_delta_and_set);
59108334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__subtraction);
59208334c51SBrooks Davis     ATF_ADD_TEST_CASE(tcs, timestamp__output);
59308334c51SBrooks Davis }
594