Cleanup: use dcp::LocalTime for certificate validity times.
[libdcp.git] / test / local_time_test.cc
1 /*
2     Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
18
19     In addition, as a special exception, the copyright holders give
20     permission to link the code of portions of this program with the
21     OpenSSL library under certain conditions as described in each
22     individual source file, and distribute linked combinations
23     including the two.
24
25     You must obey the GNU General Public License in all respects
26     for all of the code used other than OpenSSL.  If you modify
27     file(s) with this exception, you may extend this exception to your
28     version of the file(s), but you are not obligated to do so.  If you
29     do not wish to do so, delete this exception statement from your
30     version.  If you delete this exception statement from all source
31     files in the program, then also delete it here.
32 */
33
34
35 #include "exceptions.h"
36 #include "local_time.h"
37 #include <boost/test/unit_test.hpp>
38
39
40 /** Check that dcp::LocalTime works */
41 BOOST_AUTO_TEST_CASE (local_time_basic_test)
42 {
43         /* Badly-formatted times */
44         BOOST_CHECK_THROW (dcp::LocalTime (""), dcp::TimeFormatError);
45         BOOST_CHECK_THROW (dcp::LocalTime ("XXX"), dcp::TimeFormatError);
46         BOOST_CHECK_THROW (dcp::LocalTime ("2013-01-05T18:06:59+04:0"), dcp::TimeFormatError);
47         BOOST_CHECK_THROW (dcp::LocalTime ("2013-01-05T18:06:59X04:00"), dcp::TimeFormatError);
48         BOOST_CHECK_THROW (dcp::LocalTime ("2013-01-05T18-06:59+04:00"), dcp::TimeFormatError);
49         BOOST_CHECK_THROW (dcp::LocalTime ("2013!01-05T18:06:59+04:00"), dcp::TimeFormatError);
50
51         /* Correctly-formatted */
52
53         {
54                 dcp::LocalTime t ("2013-01-05T18:06:59+04:00");
55                 BOOST_CHECK_EQUAL (t._year, 2013);
56                 BOOST_CHECK_EQUAL (t._month, 1);
57                 BOOST_CHECK_EQUAL (t._day, 5);
58                 BOOST_CHECK_EQUAL (t._hour, 18);
59                 BOOST_CHECK_EQUAL (t._minute, 6);
60                 BOOST_CHECK_EQUAL (t._second, 59);
61                 BOOST_CHECK_EQUAL (t._tz_hour, 4);
62                 BOOST_CHECK_EQUAL (t._tz_minute, 0);
63                 BOOST_CHECK_EQUAL (t.as_string(), "2013-01-05T18:06:59+04:00");
64         }
65
66         {
67                 dcp::LocalTime t ("2011-11-20T01:06:59-09:30");
68                 BOOST_CHECK_EQUAL (t._year, 2011);
69                 BOOST_CHECK_EQUAL (t._month, 11);
70                 BOOST_CHECK_EQUAL (t._day, 20);
71                 BOOST_CHECK_EQUAL (t._hour, 1);
72                 BOOST_CHECK_EQUAL (t._minute, 6);
73                 BOOST_CHECK_EQUAL (t._second, 59);
74                 BOOST_CHECK_EQUAL (t._tz_hour, -9);
75                 BOOST_CHECK_EQUAL (t._tz_minute, -30);
76                 BOOST_CHECK_EQUAL (t.as_string(), "2011-11-20T01:06:59-09:30");
77         }
78
79         {
80                 dcp::LocalTime t ("2011-11-20T01:06:59.456-09:30");
81                 BOOST_CHECK_EQUAL (t._year, 2011);
82                 BOOST_CHECK_EQUAL (t._month, 11);
83                 BOOST_CHECK_EQUAL (t._day, 20);
84                 BOOST_CHECK_EQUAL (t._hour, 1);
85                 BOOST_CHECK_EQUAL (t._minute, 6);
86                 BOOST_CHECK_EQUAL (t._second, 59);
87                 BOOST_CHECK_EQUAL (t._millisecond, 456);
88                 BOOST_CHECK_EQUAL (t._tz_hour, -9);
89                 BOOST_CHECK_EQUAL (t._tz_minute, -30);
90                 BOOST_CHECK_EQUAL (t.as_string(true), "2011-11-20T01:06:59.456-09:30");
91         }
92
93         {
94                 /* Construction from boost::posix_time::ptime */
95                 dcp::LocalTime b (boost::posix_time::time_from_string ("2002-01-20 19:03:56"));
96                 BOOST_CHECK_EQUAL (b._year, 2002);
97                 BOOST_CHECK_EQUAL (b._month, 1);
98                 BOOST_CHECK_EQUAL (b._day, 20);
99                 BOOST_CHECK_EQUAL (b._hour, 19);
100                 BOOST_CHECK_EQUAL (b._minute, 3);
101                 BOOST_CHECK_EQUAL (b._second, 56);
102         }
103
104         {
105                 /* Construction from boost::posix_time::ptime with milliseconds */
106                 dcp::LocalTime b (boost::posix_time::time_from_string ("2002-01-20 19:03:56.491"));
107                 BOOST_CHECK_EQUAL (b._year, 2002);
108                 BOOST_CHECK_EQUAL (b._month, 1);
109                 BOOST_CHECK_EQUAL (b._day, 20);
110                 BOOST_CHECK_EQUAL (b._hour, 19);
111                 BOOST_CHECK_EQUAL (b._minute, 3);
112                 BOOST_CHECK_EQUAL (b._second, 56);
113                 BOOST_CHECK_EQUAL (b._millisecond, 491);
114         }
115
116         {
117                 dcp::LocalTime b ("2015-11-18T19:26:45");
118                 BOOST_CHECK_EQUAL (b._year, 2015);
119                 BOOST_CHECK_EQUAL (b._month, 11);
120                 BOOST_CHECK_EQUAL (b._day, 18);
121                 BOOST_CHECK_EQUAL (b._hour, 19);
122                 BOOST_CHECK_EQUAL (b._minute, 26);
123                 BOOST_CHECK_EQUAL (b._second, 45);
124                 BOOST_CHECK_EQUAL (b._millisecond, 0);
125                 BOOST_CHECK_EQUAL (b._tz_hour, 0);
126                 BOOST_CHECK_EQUAL (b._tz_minute, 0);
127         }
128
129         /* Check negative times with non-zero timezone offset minutes */
130         {
131                 dcp::LocalTime t ("2013-01-05T18:06:59-04:30");
132                 BOOST_CHECK_EQUAL (t._year, 2013);
133                 BOOST_CHECK_EQUAL (t._month, 1);
134                 BOOST_CHECK_EQUAL (t._day, 5);
135                 BOOST_CHECK_EQUAL (t._hour, 18);
136                 BOOST_CHECK_EQUAL (t._minute, 6);
137                 BOOST_CHECK_EQUAL (t._second, 59);
138                 BOOST_CHECK_EQUAL (t._tz_hour, -4);
139                 BOOST_CHECK_EQUAL (t._tz_minute, -30);
140                 BOOST_CHECK_EQUAL (t.as_string(), "2013-01-05T18:06:59-04:30");
141         }
142 }
143
144
145 BOOST_AUTO_TEST_CASE (local_time_add_minutes_test)
146 {
147         {
148                 dcp::LocalTime t("2018-01-01T10:00:00+01:00");
149                 t.add_minutes (3);
150                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-01T10:03:00+01:00");
151         }
152
153         {
154                 dcp::LocalTime t("2018-01-01T10:00:15+01:00");
155                 t.add_minutes (3);
156                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-01T10:03:15+01:00");
157         }
158
159         {
160                 dcp::LocalTime t("2018-01-01T10:40:20+01:00");
161                 t.add_minutes (23);
162                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-01T11:03:20+01:00");
163         }
164
165         {
166                 dcp::LocalTime t("2018-01-01T10:40:20+01:00");
167                 t.add_minutes (123);
168                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-01T12:43:20+01:00");
169         }
170
171         {
172                 dcp::LocalTime t("2018-01-01T23:55:00+01:00");
173                 t.add_minutes (7);
174                 BOOST_CHECK_EQUAL (t.as_string(), "2018-01-02T00:02:00+01:00");
175         }
176
177         {
178                 dcp::LocalTime t("2018-01-31T23:55:00+01:00");
179                 t.add_minutes (7);
180                 BOOST_CHECK_EQUAL (t.as_string(), "2018-02-01T00:02:00+01:00");
181         }
182
183         {
184                 dcp::LocalTime t("2018-01-31T23:55:00.123");
185                 t.add_minutes (7);
186                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2018-02-01T00:02:00.123"));
187         }
188 }
189
190
191 BOOST_AUTO_TEST_CASE (local_time_add_months_test)
192 {
193         {
194                 dcp::LocalTime t("2013-06-23T18:06:59.123");
195                 t.add_months(-1);
196                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-05-23T18:06:59.123"));
197                 t.add_months(1);
198                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-06-23T18:06:59.123"));
199                 t.add_months(1);
200                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-07-23T18:06:59.123"));
201                 t.add_months(4);
202                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-11-23T18:06:59.123"));
203                 t.add_months(2);
204                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
205                 t.add_months(-14);
206                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2012-11-23T18:06:59.123"));
207                 t.add_months(14);
208                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
209         }
210
211         {
212                 dcp::LocalTime t("2018-01-30T11:00:00+01:00");
213                 t.add_months (1);
214                 BOOST_CHECK_EQUAL (t.as_string(), "2018-02-28T11:00:00+01:00");
215         }
216 }
217
218
219 BOOST_AUTO_TEST_CASE (local_time_from_asn1_utctime_test)
220 {
221         BOOST_CHECK_EQUAL (dcp::LocalTime::from_asn1_utc_time("991231235952").as_string(), "1999-12-31T23:59:52+00:00");
222         BOOST_CHECK_EQUAL (dcp::LocalTime::from_asn1_utc_time("210215165952").as_string(), "2021-02-15T16:59:52+00:00");
223 }
224
225
226 BOOST_AUTO_TEST_CASE (local_time_from_asn1_generalized_time_test)
227 {
228         BOOST_CHECK_EQUAL (dcp::LocalTime::from_asn1_generalized_time("19991231235952").as_string(), "1999-12-31T23:59:52+00:00");
229         BOOST_CHECK_EQUAL (dcp::LocalTime::from_asn1_generalized_time("20210215165952").as_string(), "2021-02-15T16:59:52+00:00");
230 }
231