Tweaks to management of crypto information.
[libdcp.git] / test / tests.cc
1 /*
2     Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <cmath>
21 #include <boost/filesystem.hpp>
22 #include <libxml++/libxml++.h>
23 #include "KM_prng.h"
24 #include "dcp.h"
25 #include "util.h"
26 #include "metadata.h"
27 #include "types.h"
28 #include "exceptions.h"
29 #include "subtitle_asset.h"
30 #include "picture_asset.h"
31 #include "sound_asset.h"
32 #include "reel.h"
33 #include "certificates.h"
34 #include "crypt_chain.h"
35
36 #define BOOST_TEST_DYN_LINK
37 #define BOOST_TEST_MODULE libdcp_test
38 #include <boost/test/unit_test.hpp>
39
40 using std::string;
41 using std::cout;
42 using std::vector;
43 using std::list;
44 using boost::shared_ptr;
45
46 string
47 j2c (int)
48 {
49         return "test/data/32x32_red_square.j2c";
50 }
51
52 string
53 wav (libdcp::Channel)
54 {
55         return "test/data/1s_24-bit_48k_silence.wav";
56 }
57                 
58
59 BOOST_AUTO_TEST_CASE (dcp_test)
60 {
61         libdcp::init ();
62         
63         Kumu::libdcp_test = true;
64         
65         libdcp::Metadata* t = libdcp::Metadata::instance ();
66         t->issuer = "OpenDCP 0.0.25";
67         t->creator = "OpenDCP 0.0.25";
68         t->company_name = "OpenDCP";
69         t->product_name = "OpenDCP";
70         t->product_version = "0.0.25";
71         t->issue_date = "2012-07-17T04:45:18+00:00";
72         boost::filesystem::remove_all ("build/test/foo");
73         boost::filesystem::create_directories ("build/test/foo");
74         libdcp::DCP d ("build/test/foo");
75         shared_ptr<libdcp::CPL> cpl (new libdcp::CPL ("build/test/foo", "A Test DCP", libdcp::FEATURE, 24, 24));
76
77         shared_ptr<libdcp::MonoPictureAsset> mp (new libdcp::MonoPictureAsset (
78                                                          j2c,
79                                                          "build/test/foo",
80                                                          "video.mxf",
81                                                          &d.Progress,
82                                                          24,
83                                                          24,
84                                                          32,
85                                                          32,
86                                                          false
87                                                          ));
88
89         shared_ptr<libdcp::SoundAsset> ms (new libdcp::SoundAsset (
90                                                    wav,
91                                                    "build/test/foo",
92                                                    "audio.mxf",
93                                                    &(d.Progress),
94                                                    24,
95                                                    24,
96                                                    2,
97                                                    false
98                                                    ));
99         
100         cpl->add_reel (shared_ptr<libdcp::Reel> (new libdcp::Reel (mp, ms, shared_ptr<libdcp::SubtitleAsset> ())));
101         d.add_cpl (cpl);
102
103         d.write_xml ();
104 }
105
106 BOOST_AUTO_TEST_CASE (error_test)
107 {
108         libdcp::DCP d ("build/test/fred");
109         vector<string> p;
110         p.push_back ("frobozz");
111
112         BOOST_CHECK_THROW (new libdcp::MonoPictureAsset (p, "build/test/fred", "video.mxf", &d.Progress, 24, 24, 32, 32, false), libdcp::FileError);
113         BOOST_CHECK_THROW (new libdcp::SoundAsset (p, "build/test/fred", "audio.mxf", &d.Progress, 24, 24, false), libdcp::FileError);
114 }
115
116 BOOST_AUTO_TEST_CASE (read_dcp)
117 {
118         libdcp::DCP d ("test/ref/DCP/foo");
119         d.read ();
120
121         list<shared_ptr<const libdcp::CPL> > cpls = d.cpls ();
122         BOOST_CHECK_EQUAL (cpls.size(), 1);
123
124         BOOST_CHECK_EQUAL (cpls.front()->name(), "A Test DCP");
125         BOOST_CHECK_EQUAL (cpls.front()->content_kind(), libdcp::FEATURE);
126         BOOST_CHECK_EQUAL (cpls.front()->frames_per_second(), 24);
127         BOOST_CHECK_EQUAL (cpls.front()->length(), 24);
128 }
129         
130 BOOST_AUTO_TEST_CASE (subtitles1)
131 {
132         libdcp::SubtitleAsset subs ("test/data", "subs1.xml");
133
134         BOOST_CHECK_EQUAL (subs.language(), "French");
135
136         list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_at (libdcp::Time (0, 0, 6, 1));
137         BOOST_CHECK_EQUAL (s.size(), 1);
138         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
139                                    "Arial",
140                                    false,
141                                    libdcp::Color (255, 255, 255),
142                                    39,
143                                    libdcp::Time (0, 0, 5, 198),
144                                    libdcp::Time (0, 0, 7, 115),
145                                    15,
146                                    libdcp::BOTTOM,
147                                    "My jacket was Idi Amin's",
148                                    libdcp::BORDER,
149                                    libdcp::Color (0, 0, 0),
150                                    libdcp::Time (0, 0, 0, 1),
151                                    libdcp::Time (0, 0, 0, 1)
152                                    ));
153                                                          
154         s = subs.subtitles_at (libdcp::Time (0, 0, 7, 190));
155         BOOST_CHECK_EQUAL (s.size(), 2);
156         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
157                                    "Arial",
158                                    true,
159                                    libdcp::Color (255, 255, 255),
160                                    39,
161                                    libdcp::Time (0, 0, 7, 177),
162                                    libdcp::Time (0, 0, 11, 31),
163                                    21,
164                                    libdcp::BOTTOM,
165                                    "My corset was H.M. The Queen's",
166                                    libdcp::BORDER,
167                                    libdcp::Color (0, 0, 0),
168                                    libdcp::Time (0, 0, 0, 1),
169                                    libdcp::Time (0, 0, 0, 1)
170                                    ));
171         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
172                                    "Arial",
173                                    false,
174                                    libdcp::Color (255, 255, 255),
175                                    39,
176                                    libdcp::Time (0, 0, 7, 177),
177                                    libdcp::Time (0, 0, 11, 31),
178                                    15,
179                                    libdcp::BOTTOM,
180                                    "My large wonderbra",
181                                    libdcp::BORDER,
182                                    libdcp::Color (0, 0, 0),
183                                    libdcp::Time (0, 0, 0, 1),
184                                    libdcp::Time (0, 0, 0, 1)
185                                    ));
186
187         s = subs.subtitles_at (libdcp::Time (0, 0, 11, 95));
188         BOOST_CHECK_EQUAL (s.size(), 1);
189         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
190                                    "Arial",
191                                    false,
192                                    libdcp::Color (255, 255, 255),
193                                    39,
194                                    libdcp::Time (0, 0, 11, 94),
195                                    libdcp::Time (0, 0, 13, 63),
196                                    15,
197                                    libdcp::BOTTOM,
198                                    "Once belonged to the Shah",
199                                    libdcp::BORDER,
200                                    libdcp::Color (0, 0, 0),
201                                    libdcp::Time (0, 0, 0, 1),
202                                    libdcp::Time (0, 0, 0, 1)
203                                    ));
204
205         s = subs.subtitles_at (libdcp::Time (0, 0, 14, 42));
206         BOOST_CHECK_EQUAL (s.size(), 1);
207         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
208                                    "Arial",
209                                    false,
210                                    libdcp::Color (255, 255, 255),
211                                    39,
212                                    libdcp::Time (0, 0, 13, 104),
213                                    libdcp::Time (0, 0, 15, 177),
214                                    15,
215                                    libdcp::BOTTOM,
216                                    "And these are Roy Hattersley's jeans",
217                                    libdcp::BORDER,
218                                    libdcp::Color (0, 0, 0),
219                                    libdcp::Time (0, 0, 0, 1),
220                                    libdcp::Time (0, 0, 0, 1)
221                                    ));
222 }
223
224 BOOST_AUTO_TEST_CASE (subtitles2)
225 {
226         libdcp::SubtitleAsset subs ("test/data", "subs2.xml");
227
228         list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_at (libdcp::Time (0, 0, 42, 100));
229         BOOST_CHECK_EQUAL (s.size(), 2);
230         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
231                                    "Arial",
232                                    true,
233                                    libdcp::Color (255, 255, 255),
234                                    42,
235                                    libdcp::Time (0, 0, 41, 62),
236                                    libdcp::Time (0, 0, 43, 52),
237                                    89,
238                                    libdcp::TOP,
239                                    "At afternoon tea with John Peel",
240                                    libdcp::BORDER,
241                                    libdcp::Color (0, 0, 0),
242                                    libdcp::Time (0, 0, 0, 0),
243                                    libdcp::Time (0, 0, 0, 0)
244                                    ));
245         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
246                                    "Arial",
247                                    true,
248                                    libdcp::Color (255, 255, 255),
249                                    42,
250                                    libdcp::Time (0, 0, 41, 62),
251                                    libdcp::Time (0, 0, 43, 52),
252                                    95,
253                                    libdcp::TOP,
254                                    "I enquired if his accent was real",
255                                    libdcp::BORDER,
256                                    libdcp::Color (0, 0, 0),
257                                    libdcp::Time (0, 0, 0, 0),
258                                    libdcp::Time (0, 0, 0, 0)
259                                    ));
260
261         s = subs.subtitles_at (libdcp::Time (0, 0, 50, 50));
262         BOOST_CHECK_EQUAL (s.size(), 2);
263         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
264                                    "Arial",
265                                    true,
266                                    libdcp::Color (255, 255, 255),
267                                    42,
268                                    libdcp::Time (0, 0, 50, 42),
269                                    libdcp::Time (0, 0, 52, 21),
270                                    89,
271                                    libdcp::TOP,
272                                    "He said \"out of the house",
273                                    libdcp::BORDER,
274                                    libdcp::Color (0, 0, 0),
275                                    libdcp::Time (0, 0, 0, 0),
276                                    libdcp::Time (0, 0, 0, 0)
277                                    ));
278         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
279                                    "Arial",
280                                    true,
281                                    libdcp::Color (255, 255, 255),
282                                    42,
283                                    libdcp::Time (0, 0, 50, 42),
284                                    libdcp::Time (0, 0, 52, 21),
285                                    95,
286                                    libdcp::TOP,
287                                    "I'm incredibly scouse",
288                                    libdcp::BORDER,
289                                    libdcp::Color (0, 0, 0),
290                                    libdcp::Time (0, 0, 0, 0),
291                                    libdcp::Time (0, 0, 0, 0)
292                                    ));
293
294         s = subs.subtitles_at (libdcp::Time (0, 1, 2, 300));
295         BOOST_CHECK_EQUAL (s.size(), 2);
296         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
297                                    "Arial",
298                                    true,
299                                    libdcp::Color (255, 255, 255),
300                                    42,
301                                    libdcp::Time (0, 1, 2, 208),
302                                    libdcp::Time (0, 1, 4, 10),
303                                    89,
304                                    libdcp::TOP,
305                                    "At home it depends how I feel.\"",
306                                    libdcp::BORDER,
307                                    libdcp::Color (0, 0, 0),
308                                    libdcp::Time (0, 0, 0, 0),
309                                    libdcp::Time (0, 0, 0, 0)
310                                    ));
311         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
312                                    "Arial",
313                                    true,
314                                    libdcp::Color (255, 255, 255),
315                                    42,
316                                    libdcp::Time (0, 1, 2, 208),
317                                    libdcp::Time (0, 1, 4, 10),
318                                    95,
319                                    libdcp::TOP,
320                                    "I spent a long weekend in Brighton",
321                                    libdcp::BORDER,
322                                    libdcp::Color (0, 0, 0),
323                                    libdcp::Time (0, 0, 0, 0),
324                                    libdcp::Time (0, 0, 0, 0)
325                                    ));
326
327         s = subs.subtitles_at (libdcp::Time (0, 1, 15, 50));
328         BOOST_CHECK_EQUAL (s.size(), 2);
329         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
330                                    "Arial",
331                                    true,
332                                    libdcp::Color (255, 255, 255),
333                                    42,
334                                    libdcp::Time (0, 1, 15, 42),
335                                    libdcp::Time (0, 1, 16, 42),
336                                    89,
337                                    libdcp::TOP,
338                                    "With the legendary Miss Enid Blyton",
339                                    libdcp::BORDER,
340                                    libdcp::Color (0, 0, 0),
341                                    libdcp::Time (0, 0, 0, 0),
342                                    libdcp::Time (0, 0, 0, 0)
343                                    ));
344         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
345                                    "Arial",
346                                    true,
347                                    libdcp::Color (255, 255, 255),
348                                    42,
349                                    libdcp::Time (0, 1, 15, 42),
350                                    libdcp::Time (0, 1, 16, 42),
351                                    95,
352                                    libdcp::TOP,
353                                    "She said \"you be Noddy",
354                                    libdcp::BORDER,
355                                    libdcp::Color (0, 0, 0),
356                                    libdcp::Time (0, 0, 0, 0),
357                                    libdcp::Time (0, 0, 0, 0)
358                                    ));
359
360         s = subs.subtitles_at (libdcp::Time (0, 1, 27, 200));
361         BOOST_CHECK_EQUAL (s.size(), 2);
362         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
363                                    "Arial",
364                                    true,
365                                    libdcp::Color (255, 255, 255),
366                                    42,
367                                    libdcp::Time (0, 1, 27, 115),
368                                    libdcp::Time (0, 1, 28, 208),
369                                    89,
370                                    libdcp::TOP,
371                                    "That curious creature the Sphinx",
372                                    libdcp::BORDER,
373                                    libdcp::Color (0, 0, 0),
374                                    libdcp::Time (0, 0, 0, 0),
375                                    libdcp::Time (0, 0, 0, 0)
376                                    ));
377         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
378                                    "Arial",
379                                    true,
380                                    libdcp::Color (255, 255, 255),
381                                    42,
382                                    libdcp::Time (0, 1, 27, 115),
383                                    libdcp::Time (0, 1, 28, 208),
384                                    95,
385                                    libdcp::TOP,
386                                    "Is smarter than anyone thinks",
387                                    libdcp::BORDER,
388                                    libdcp::Color (0, 0, 0),
389                                    libdcp::Time (0, 0, 0, 0),
390                                    libdcp::Time (0, 0, 0, 0)
391                                    ));
392
393         s = subs.subtitles_at (libdcp::Time (0, 1, 42, 300));
394         BOOST_CHECK_EQUAL (s.size(), 2);
395         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
396                                    "Arial",
397                                    false,
398                                    libdcp::Color (255, 255, 255),
399                                    42,
400                                    libdcp::Time (0, 1, 42, 229),
401                                    libdcp::Time (0, 1, 45, 62),
402                                    89,
403                                    libdcp::TOP,
404                                    "It sits there and smirks",
405                                    libdcp::BORDER,
406                                    libdcp::Color (0, 0, 0),
407                                    libdcp::Time (0, 0, 0, 0),
408                                    libdcp::Time (0, 0, 0, 0)
409                                    ));
410         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
411                                    "Arial",
412                                    false,
413                                    libdcp::Color (255, 255, 255),
414                                    42,
415                                    libdcp::Time (0, 1, 42, 229),
416                                    libdcp::Time (0, 1, 45, 62),
417                                    95,
418                                    libdcp::TOP,
419                                    "And you don't think it works",
420                                    libdcp::BORDER,
421                                    libdcp::Color (0, 0, 0),
422                                    libdcp::Time (0, 0, 0, 0),
423                                    libdcp::Time (0, 0, 0, 0)
424                                    ));
425
426         s = subs.subtitles_at (libdcp::Time (0, 1, 45, 200));
427         BOOST_CHECK_EQUAL (s.size(), 2);
428         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
429                                    "Arial",
430                                    false,
431                                    libdcp::Color (255, 255, 255),
432                                    42,
433                                    libdcp::Time (0, 1, 45, 146),
434                                    libdcp::Time (0, 1, 47, 94),
435                                    89,
436                                    libdcp::TOP,
437                                    "Then when you're not looking, it winks.",
438                                    libdcp::BORDER,
439                                    libdcp::Color (0, 0, 0),
440                                    libdcp::Time (0, 0, 0, 0),
441                                    libdcp::Time (0, 0, 0, 0)
442                                    ));
443         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
444                                    "Arial",
445                                    false,
446                                    libdcp::Color (255, 255, 255),
447                                    42,
448                                    libdcp::Time (0, 1, 45, 146),
449                                    libdcp::Time (0, 1, 47, 94),
450                                    95,
451                                    libdcp::TOP,
452                                    "When it snows you will find Sister Sledge",
453                                    libdcp::BORDER,
454                                    libdcp::Color (0, 0, 0),
455                                    libdcp::Time (0, 0, 0, 0),
456                                    libdcp::Time (0, 0, 0, 0)
457                                    ));
458
459         s = subs.subtitles_at (libdcp::Time (0, 1, 47, 249));
460         BOOST_CHECK_EQUAL (s.size(), 2);
461         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
462                                    "Arial",
463                                    false,
464                                    libdcp::Color (255, 255, 255),
465                                    42,
466                                    libdcp::Time (0, 1, 47, 146),
467                                    libdcp::Time (0, 1, 48, 167),
468                                    89,
469                                    libdcp::TOP,
470                                    "Out mooning, at night, on the ledge",
471                                    libdcp::BORDER,
472                                    libdcp::Color (0, 0, 0),
473                                    libdcp::Time (0, 0, 0, 0),
474                                    libdcp::Time (0, 0, 0, 0)
475                                    ));
476         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
477                                    "Arial",
478                                    false,
479                                    libdcp::Color (255, 255, 255),
480                                    42,
481                                    libdcp::Time (0, 1, 47, 146),
482                                    libdcp::Time (0, 1, 48, 167),
483                                    95,
484                                    libdcp::TOP,
485                                    "One storey down",
486                                    libdcp::BORDER,
487                                    libdcp::Color (0, 0, 0),
488                                    libdcp::Time (0, 0, 0, 0),
489                                    libdcp::Time (0, 0, 0, 0)
490                                    ));
491
492         s = subs.subtitles_at (libdcp::Time (0, 2, 6, 210));
493         BOOST_CHECK_EQUAL (s.size(), 2);
494         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
495                                    "Arial",
496                                    true,
497                                    libdcp::Color (255, 255, 255),
498                                    42,
499                                    libdcp::Time (0, 2, 5, 208),
500                                    libdcp::Time (0, 2, 7, 31),
501                                    89,
502                                    libdcp::TOP,
503                                    "HELLO",
504                                    libdcp::BORDER,
505                                    libdcp::Color (0, 0, 0),
506                                    libdcp::Time (0, 0, 0, 0),
507                                    libdcp::Time (0, 0, 0, 0)
508                                    ));
509         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
510                                    "Arial",
511                                    true,
512                                    libdcp::Color (255, 255, 255),
513                                    42,
514                                    libdcp::Time (0, 2, 5, 208),
515                                    libdcp::Time (0, 2, 7, 31),
516                                    95,
517                                    libdcp::TOP,
518                                    "WORLD",
519                                    libdcp::BORDER,
520                                    libdcp::Color (0, 0, 0),
521                                    libdcp::Time (0, 0, 0, 0),
522                                    libdcp::Time (0, 0, 0, 0)
523                                    ));
524
525         
526         
527 }
528
529 BOOST_AUTO_TEST_CASE (dcp_time)
530 {
531         libdcp::Time t (977143, 24);
532
533         BOOST_CHECK_EQUAL (t.t, 73);
534         BOOST_CHECK_EQUAL (t.s, 34);
535         BOOST_CHECK_EQUAL (t.m, 18);
536         BOOST_CHECK_EQUAL (t.h, 11);
537         BOOST_CHECK_EQUAL (t.to_string(), "11:18:34:73");
538         BOOST_CHECK_EQUAL (t.to_ticks(), 1017923);
539
540         libdcp::Time a (3, 2, 3, 4);
541         libdcp::Time b (2, 3, 4, 5);
542
543         libdcp::Time r = a - b;
544         BOOST_CHECK_EQUAL (r.h, 0);
545         BOOST_CHECK_EQUAL (r.m, 58);
546         BOOST_CHECK_EQUAL (r.s, 58);
547         BOOST_CHECK_EQUAL (r.t, 249);
548         BOOST_CHECK_EQUAL (r.to_string(), "0:58:58:249");
549         BOOST_CHECK_EQUAL (r.to_ticks(), 88699);
550
551         a = libdcp::Time (1, 58, 56, 240);
552         b = libdcp::Time (1, 7, 12, 120);
553         r = a + b;
554         BOOST_CHECK_EQUAL (r.h, 3);
555         BOOST_CHECK_EQUAL (r.m, 6);
556         BOOST_CHECK_EQUAL (r.s, 9);
557         BOOST_CHECK_EQUAL (r.t, 110);
558         BOOST_CHECK_EQUAL (r.to_string(), "3:6:9:110");
559         BOOST_CHECK_EQUAL (r.to_ticks(), 279335);
560
561         a = libdcp::Time (24, 12, 6, 3);
562         b = libdcp::Time (16, 8, 4, 2);
563         BOOST_CHECK_CLOSE (a / b, 1.5, 1e-5);
564 }
565
566 BOOST_AUTO_TEST_CASE (color)
567 {
568         libdcp::Color c ("FFFF0000");
569
570         BOOST_CHECK_EQUAL (c.r, 255);
571         BOOST_CHECK_EQUAL (c.g, 0);
572         BOOST_CHECK_EQUAL (c.b, 0);
573         BOOST_CHECK_EQUAL (c.to_argb_string(), "FFFF0000");
574
575         c = libdcp::Color ("FF00FF00");
576
577         BOOST_CHECK_EQUAL (c.r, 0);
578         BOOST_CHECK_EQUAL (c.g, 255);
579         BOOST_CHECK_EQUAL (c.b, 0);
580         BOOST_CHECK_EQUAL (c.to_argb_string(), "FF00FF00");
581
582         c = libdcp::Color ("FF0000FF");
583
584         BOOST_CHECK_EQUAL (c.r, 0);
585         BOOST_CHECK_EQUAL (c.g, 0);
586         BOOST_CHECK_EQUAL (c.b, 255);
587         BOOST_CHECK_EQUAL (c.to_argb_string(), "FF0000FF");
588         
589 }
590
591 BOOST_AUTO_TEST_CASE (encryption)
592 {
593         Kumu::libdcp_test = true;
594         
595         libdcp::Metadata* t = libdcp::Metadata::instance ();
596         t->issuer = "OpenDCP 0.0.25";
597         t->creator = "OpenDCP 0.0.25";
598         t->company_name = "OpenDCP";
599         t->product_name = "OpenDCP";
600         t->product_version = "0.0.25";
601         t->issue_date = "2012-07-17T04:45:18+00:00";
602         boost::filesystem::remove_all ("build/test/bar");
603         boost::filesystem::create_directories ("build/test/bar");
604         libdcp::DCP d ("build/test/bar");
605
606         libdcp::CertificateChain chain;
607         chain.add (shared_ptr<libdcp::Certificate> (new libdcp::Certificate ("test/data/ca.self-signed.pem")));
608         chain.add (shared_ptr<libdcp::Certificate> (new libdcp::Certificate ("test/data/intermediate.signed.pem")));
609         chain.add (shared_ptr<libdcp::Certificate> (new libdcp::Certificate ("test/data/leaf.signed.pem")));
610
611         shared_ptr<libdcp::Encryption> crypt (
612                 new libdcp::Encryption (
613                         chain,
614                         "test/data/signer.key"
615                         )
616                 );
617
618         shared_ptr<libdcp::CPL> cpl (new libdcp::CPL ("build/test/bar", "A Test DCP", libdcp::FEATURE, 24, 24));
619         
620         shared_ptr<libdcp::MonoPictureAsset> mp (new libdcp::MonoPictureAsset (
621                                                          j2c,
622                                                          "build/test/bar",
623                                                          "video.mxf",
624                                                          &d.Progress,
625                                                          24,
626                                                          24,
627                                                          32,
628                                                          32,
629                                                          true
630                                                          ));
631
632         shared_ptr<libdcp::SoundAsset> ms (new libdcp::SoundAsset (
633                                                    wav,
634                                                    "build/test/bar",
635                                                    "audio.mxf",
636                                                    &(d.Progress),
637                                                    24,
638                                                    24,
639                                                    2,
640                                                    true
641                                                    ));
642         
643         cpl->add_reel (shared_ptr<libdcp::Reel> (new libdcp::Reel (mp, ms, shared_ptr<libdcp::SubtitleAsset> ())));
644         d.add_cpl (cpl);
645
646         d.write_xml (crypt);
647
648         shared_ptr<xmlpp::Document> kdm = cpl->make_kdm (
649                 crypt->certificates,
650                 crypt->signer_key,
651                 crypt->certificates.leaf(),
652                 boost::posix_time::time_from_string ("2013-01-01 00:00:00"),
653                 boost::posix_time::time_from_string ("2013-01-08 00:00:00")
654                 );
655
656         kdm->write_to_file_formatted ("build/test/bar.kdm.xml", "UTF-8");
657 }
658
659 BOOST_AUTO_TEST_CASE (certificates)
660 {
661         libdcp::CertificateChain c;
662
663         c.add (shared_ptr<libdcp::Certificate> (new libdcp::Certificate ("test/data/ca.self-signed.pem")));
664         c.add (shared_ptr<libdcp::Certificate> (new libdcp::Certificate ("test/data/intermediate.signed.pem")));
665         c.add (shared_ptr<libdcp::Certificate> (new libdcp::Certificate ("test/data/leaf.signed.pem")));
666         
667         BOOST_CHECK_EQUAL (
668                 c.root()->issuer(),
669                 "/O=example.org/OU=example.org/CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION/dnQualifier=rTeK7x+nopFkyphflooz6p2ZM7A="
670                 );
671         
672         BOOST_CHECK_EQUAL (
673                 libdcp::Certificate::name_for_xml (c.root()->issuer()),
674                 "dnQualifier=rTeK7x\\+nopFkyphflooz6p2ZM7A=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org"
675                 );
676
677         BOOST_CHECK_EQUAL (c.root()->serial(), "5");
678
679         BOOST_CHECK_EQUAL (
680                 libdcp::Certificate::name_for_xml (c.root()->subject()),
681                 "dnQualifier=rTeK7x\\+nopFkyphflooz6p2ZM7A=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org"
682                 );
683 }
684
685 BOOST_AUTO_TEST_CASE (crypt_chain)
686 {
687         boost::filesystem::remove_all ("build/test/crypt");
688         boost::filesystem::create_directory ("build/test/crypt");
689         libdcp::make_crypt_chain ("build/test/crypt");
690 }