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