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