047f7fa19ca0c9b03d0ee78d7b13042cd028933f
[libdcp.git] / test / util_test.cc
1 /*
2     Copyright (C) 2013-2019 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 #include "util.h"
35 #include "local_time.h"
36 #include <boost/test/unit_test.hpp>
37 #include <fstream>
38
39 using std::ifstream;
40 using std::string;
41 using std::list;
42
43 /** Test dcp::base64_decode */
44 BOOST_AUTO_TEST_CASE (base64_decode_test)
45 {
46         int const N = 256;
47
48         ifstream f ("test/data/base64_test");
49         BOOST_CHECK (f.good ());
50         string s;
51         while (f.good ()) {
52                 string l;
53                 getline (f, l);
54                 s += l;
55         }
56
57         ifstream g ("test/ref/base64_test_decoded", std::ios::binary);
58         BOOST_CHECK (g.good ());
59         unsigned char ref_decoded[N];
60         for (int i = 0; i < N; ++i) {
61                 char c;
62                 g.get (c);
63                 ref_decoded[i] = static_cast<unsigned char> (c);
64         }
65
66         unsigned char decoded[N];
67         int const r = dcp::base64_decode (s, decoded, N);
68         BOOST_CHECK_EQUAL (r, N);
69
70         for (int i = 0; i < N; ++i) {
71                 BOOST_CHECK_EQUAL (decoded[i], ref_decoded[i]);
72         }
73 }
74
75 /** Test dcp::content_kind_from_string */
76 BOOST_AUTO_TEST_CASE (content_kind_test)
77 {
78         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("feature"), dcp::FEATURE);
79         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("Feature"), dcp::FEATURE);
80         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("FeaturE"), dcp::FEATURE);
81         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("Short"), dcp::SHORT);
82         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("trailer"), dcp::TRAILER);
83         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("test"), dcp::TEST);
84         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("transitional"), dcp::TRANSITIONAL);
85         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("rating"), dcp::RATING);
86         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("teaser"), dcp::TEASER);
87         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("policy"), dcp::POLICY);
88         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("psa"), dcp::PUBLIC_SERVICE_ANNOUNCEMENT);
89         BOOST_CHECK_EQUAL (dcp::content_kind_from_string ("advertisement"), dcp::ADVERTISEMENT);
90 }
91
92 /** Test dcp::relative_to_root */
93 BOOST_AUTO_TEST_CASE (relative_to_root_test)
94 {
95         {
96                 boost::filesystem::path root = "a";
97                 root /= "b";
98
99                 boost::filesystem::path file = "a";
100                 file /= "b";
101                 file /= "c";
102
103                 boost::optional<boost::filesystem::path> rel = dcp::relative_to_root (root, file);
104                 BOOST_CHECK (rel);
105                 BOOST_CHECK_EQUAL (rel.get(), boost::filesystem::path ("c"));
106         }
107
108         {
109                 boost::filesystem::path root = "a";
110                 root /= "b";
111                 root /= "c";
112
113                 boost::filesystem::path file = "a";
114                 file /= "b";
115
116                 boost::optional<boost::filesystem::path> rel = dcp::relative_to_root (root, file);
117                 BOOST_CHECK (!rel);
118         }
119
120         {
121                 boost::filesystem::path root = "a";
122
123                 boost::filesystem::path file = "a";
124                 file /= "b";
125                 file /= "c";
126
127                 boost::optional<boost::filesystem::path> rel = dcp::relative_to_root (root, file);
128                 BOOST_CHECK (rel);
129
130                 boost::filesystem::path check = "b";
131                 check /= "c";
132                 BOOST_CHECK_EQUAL (rel.get(), check);
133         }
134 }
135
136 /** Test private_key_fingerprint() */
137 BOOST_AUTO_TEST_CASE (private_key_fingerprint_test)
138 {
139         BOOST_CHECK_EQUAL (dcp::private_key_fingerprint (dcp::file_to_string ("test/data/private.key")), "Jdz1bFpCcKI7R16Ccx9JHYytag0=");
140 }
141
142 BOOST_AUTO_TEST_CASE (day_less_than_or_equal_test)
143 {
144         {
145                 /* equal */
146                 dcp::LocalTime a ("1978-04-05T00:00:00");
147                 dcp::LocalTime b ("1978-04-05T00:00:00");
148                 BOOST_CHECK (day_less_than_or_equal(a, b));
149         }
150
151         {
152                 /* every part of a less than b */
153                 dcp::LocalTime a ("1981-02-04T00:00:00");
154                 dcp::LocalTime b ("1985-05-23T00:00:00");
155                 BOOST_CHECK (day_less_than_or_equal(a, b));
156         }
157
158         {
159                 /* years equal, other parts less */
160                 dcp::LocalTime a ("1981-03-02T00:00:00");
161                 dcp::LocalTime b ("1981-05-10T00:00:00");
162                 BOOST_CHECK (day_less_than_or_equal(a, b));
163         }
164
165         {
166                 /* year and month equal, day less */
167                 dcp::LocalTime a ("1981-03-09T00:00:00");
168                 dcp::LocalTime b ("1981-03-12T00:00:00");
169                 BOOST_CHECK (day_less_than_or_equal(a, b));
170         }
171
172         {
173                 /* a one day later than b */
174                 dcp::LocalTime a ("1981-03-05T00:00:00");
175                 dcp::LocalTime b ("1981-03-04T00:00:00");
176                 BOOST_CHECK (!day_less_than_or_equal(a, b));
177         }
178
179         {
180                 /* year and month same, day much later */
181                 dcp::LocalTime a ("1981-03-22T00:00:00");
182                 dcp::LocalTime b ("1981-03-04T00:00:00");
183                 BOOST_CHECK (!day_less_than_or_equal(a, b));
184         }
185
186         {
187                 /* year same, month and day later */
188                 dcp::LocalTime a ("1981-06-22T00:00:00");
189                 dcp::LocalTime b ("1981-02-04T00:00:00");
190                 BOOST_CHECK (!day_less_than_or_equal(a, b));
191         }
192
193         {
194                 /* all later */
195                 dcp::LocalTime a ("1999-06-22T00:00:00");
196                 dcp::LocalTime b ("1981-02-04T00:00:00");
197                 BOOST_CHECK (!day_less_than_or_equal(a, b));
198         }
199 }
200
201 BOOST_AUTO_TEST_CASE (day_greater_than_or_equal_test)
202 {
203         {
204                 /* equal */
205                 dcp::LocalTime a ("1978-04-05T00:00:00");
206                 dcp::LocalTime b ("1978-04-05T00:00:00");
207                 BOOST_CHECK (day_greater_than_or_equal(a, b));
208         }
209
210         {
211                 /* every part of a less than b */
212                 dcp::LocalTime a ("1981-03-04T00:00:00");
213                 dcp::LocalTime b ("1985-05-23T00:00:00");
214                 BOOST_CHECK (!day_greater_than_or_equal(a, b));
215         }
216
217         {
218                 /* years equal, other parts less */
219                 dcp::LocalTime a ("1981-02-05T00:00:00");
220                 dcp::LocalTime b ("1981-05-10T00:00:00");
221                 BOOST_CHECK (!day_greater_than_or_equal(a, b));
222         }
223
224         {
225                 /* year and month equal, day less */
226                 dcp::LocalTime a ("1981-03-04T00:00:00");
227                 dcp::LocalTime b ("1981-03-12T00:00:00");
228                 BOOST_CHECK (!day_greater_than_or_equal(a, b));
229         }
230
231         {
232                 /* year and month equal, day less */
233                 dcp::LocalTime a ("1981-03-01T00:00:00");
234                 dcp::LocalTime b ("1981-03-04T00:00:00");
235                 BOOST_CHECK (!day_greater_than_or_equal(a, b));
236         }
237
238         {
239                 /* a one day later than b */
240                 dcp::LocalTime a ("1981-03-05T00:00:00");
241                 dcp::LocalTime b ("1981-03-04T00:00:00");
242                 BOOST_CHECK (day_greater_than_or_equal(a, b));
243         }
244
245         {
246                 /* year and month same, day much later */
247                 dcp::LocalTime a ("1981-03-22T00:00:00");
248                 dcp::LocalTime b ("1981-03-04T00:00:00");
249                 BOOST_CHECK (day_greater_than_or_equal(a, b));
250         }
251
252         {
253                 /* year same, month and day later */
254                 dcp::LocalTime a ("1981-05-22T00:00:00");
255                 dcp::LocalTime b ("1981-02-04T00:00:00");
256                 BOOST_CHECK (day_greater_than_or_equal(a, b));
257         }
258
259         {
260                 /* all later */
261                 dcp::LocalTime a ("1999-06-22T00:00:00");
262                 dcp::LocalTime b ("1981-02-04T00:00:00");
263                 BOOST_CHECK (day_greater_than_or_equal(a, b));
264         }
265 }
266
267 BOOST_AUTO_TEST_CASE (unique_string_test)
268 {
269         list<string> existing;
270         for (int i = 0; i < 16; i++) {
271                 string s;
272                 BOOST_CHECK_NO_THROW (s = dcp::unique_string(existing, "foo"));
273                 BOOST_CHECK (find(existing.begin(), existing.end(), s) == existing.end());
274                 existing.push_back (s);
275         }
276 }
277
278 BOOST_AUTO_TEST_CASE (local_time_add_months_test)
279 {
280         {
281                 dcp::LocalTime t("2013-06-23T18:06:59.123");
282                 t.add_months(-1);
283                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-05-23T18:06:59.123"));
284                 t.add_months(1);
285                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-06-23T18:06:59.123"));
286                 t.add_months(1);
287                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-07-23T18:06:59.123"));
288                 t.add_months(4);
289                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2013-11-23T18:06:59.123"));
290                 t.add_months(2);
291                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
292                 t.add_months(-14);
293                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2012-11-23T18:06:59.123"));
294                 t.add_months(14);
295                 BOOST_CHECK_EQUAL (t, dcp::LocalTime("2014-01-23T18:06:59.123"));
296         }
297
298         {
299                 dcp::LocalTime t("2018-01-30T11:00:00+01:00");
300                 t.add_months (1);
301                 BOOST_CHECK_EQUAL (t.as_string(), "2018-02-28T11:00:00+01:00");
302         }
303 }