woff 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2657 @@
1
+ import struct
2
+ import zlib
3
+ from copy import deepcopy
4
+ from xml.etree import ElementTree
5
+ from woffTools.tools.validate import structPack, \
6
+ HTMLReporter,\
7
+ calcChecksum, calcHeadChecksum,\
8
+ calcPaddingLength, \
9
+ sfntHeaderFormat, sfntHeaderSize, sfntDirectoryEntryFormat, sfntDirectoryEntrySize, \
10
+ shouldSkipMetadataTest,\
11
+ testDirectoryBorders,\
12
+ testDirectoryChecksums,\
13
+ testDirectoryCompressedLength,\
14
+ testDirectoryDecompressedLength,\
15
+ testDirectoryTableOrder,\
16
+ testHeadCheckSumAdjustment,\
17
+ testHeaderFlavor,\
18
+ testHeaderLength,\
19
+ testHeaderMajorVersionAndMinorVersion,\
20
+ testHeaderNumTables,\
21
+ testHeaderReserved,\
22
+ testHeaderSignature,\
23
+ testHeaderSize,\
24
+ testHeaderStructure,\
25
+ testHeaderTotalSFNTSize,\
26
+ testMetadataAbstractElementEmptyValue,\
27
+ testMetadataAbstractElementIllegalChildElements,\
28
+ testMetadataAbstractElementIllegalText,\
29
+ testMetadataAbstractElementKnownChildElements,\
30
+ testMetadataAbstractElementOptionalAttributes,\
31
+ testMetadataAbstractElementOptionalChildElements,\
32
+ testMetadataAbstractElementRequiredAttributes,\
33
+ testMetadataAbstractElementRequiredText,\
34
+ testMetadataAbstractElementUnknownAttributes,\
35
+ testMetadataAbstractElementLanguages,\
36
+ testMetadataAbstractTextElements,\
37
+ testMetadataChildElements,\
38
+ testMetadataCopyright,\
39
+ testMetadataCredit,\
40
+ testMetadataCredits,\
41
+ testMetadataDecompressedLength,\
42
+ testMetadataDecompression,\
43
+ testMetadataDescription,\
44
+ testMetadataDuplicateElements,\
45
+ testMetadataElementExistence,\
46
+ testMetadataExtension,\
47
+ testMetadataIsCompressed,\
48
+ testMetadataLicense,\
49
+ testMetadataLicensee,\
50
+ testMetadataOffsetAndLength,\
51
+ testMetadataPadding,\
52
+ testMetadataParse,\
53
+ testMetadataStructureTopElement,\
54
+ testMetadataTrademark,\
55
+ testMetadataUniqueid,\
56
+ testMetadataVendor,\
57
+ testPrivateDataOffsetAndLength,\
58
+ testPrivateDataPadding,\
59
+ testTableDataStart,\
60
+ testTableDecompression,\
61
+ testTableGaps, \
62
+ testTablePadding,\
63
+ headerFormat, headerSize,\
64
+ directoryFormat, directorySize
65
+
66
+ # ---------------
67
+ # doctest Support
68
+ # ---------------
69
+
70
+ def doctestFunction1(func, data, resultIndex=-1):
71
+ reporter = HTMLReporter()
72
+ reporter.logTestTitle("doctest")
73
+ shouldStop = func(data, reporter)
74
+ r = reporter.testResults[-1]
75
+ r = r[resultIndex]
76
+ r = r["type"]
77
+ return shouldStop, r
78
+
79
+ def doctestFunction2(func, data):
80
+ reporter = HTMLReporter()
81
+ reporter.logTestTitle("doctest")
82
+ func(data, reporter)
83
+ r = [i["type"] for i in reporter.testResults[-1]]
84
+ return r
85
+
86
+ def doctestMetadataAbstractElementFunction(func, element, **kwargs):
87
+ reporter = HTMLReporter()
88
+ reporter.logTestTitle("doctest")
89
+ func(element, reporter, "test", **kwargs)
90
+ return [i["type"] for i in reporter.testResults[-1]]
91
+
92
+ testDataHeaderDict = dict(
93
+ signature="wOFF",
94
+ flavor="OTTO",
95
+ length=0,
96
+ reserved=0,
97
+ numTables=0,
98
+ totalSfntSize=0,
99
+ majorVersion=0,
100
+ minorVersion=0,
101
+ metaOffset=0,
102
+ metaLength=0,
103
+ metaOrigLength=0,
104
+ privOffset=0,
105
+ privLength=0
106
+ )
107
+
108
+ testDataDirectoryList = [
109
+ dict(
110
+ tag="cmap",
111
+ offset=0,
112
+ compLength=0,
113
+ origLength=0,
114
+ origChecksum=0
115
+ ),
116
+ dict(
117
+ tag="head",
118
+ offset=0,
119
+ compLength=0,
120
+ origLength=0,
121
+ origChecksum=0
122
+ ),
123
+ dict(
124
+ tag="hhea",
125
+ offset=0,
126
+ compLength=0,
127
+ origLength=0,
128
+ origChecksum=0
129
+ )
130
+ ]
131
+
132
+ def defaultTestData(header=False, directory=False, tableData=False, metadata=False, privateData=False):
133
+ parts = []
134
+ if header:
135
+ header = deepcopy(testDataHeaderDict)
136
+ header["length"] = headerSize
137
+ parts.append(header)
138
+ if directory:
139
+ directory = deepcopy(testDataDirectoryList)
140
+ if header:
141
+ # set header numTables
142
+ header["numTables"] = len(directory)
143
+ # set header totalSfntSize
144
+ neededSize = sfntHeaderSize
145
+ for table in directory:
146
+ neededSize += sfntDirectoryEntrySize
147
+ neededSize += table["origLength"]
148
+ header["totalSfntSize"] = neededSize
149
+ # set header length
150
+ header["length"] += header["numTables"] * directorySize
151
+ # store the offset for later
152
+ dataOffset = header["length"]
153
+ parts.append(directory)
154
+ if tableData:
155
+ tableData = {}
156
+ parts.append(tableData)
157
+ for entry in deepcopy(testDataDirectoryList):
158
+ tableData[entry["tag"]] = (testDataTableData, testDataTableData)
159
+ if header:
160
+ header["length"] += len(tableData) * len(testDataTableData)
161
+ if directory:
162
+ updateDirectoryEntries(directory=directory, tableData=tableData)
163
+ if metadata:
164
+ metadata = "\0" * 1000 # XXX use real xml!
165
+ compMetadata = zlib.compress(metadata)
166
+ if header:
167
+ header["metaOrigLength"] = len(metadata)
168
+ header["metaLength"] = len(compMetadata)
169
+ header["metaOffset"] = header["length"]
170
+ header["length"] = len(compMetadata) + calcPaddingLength(len(compMetadata))
171
+ compMetadata += "\0" * calcPaddingLength(len(compMetadata))
172
+ parts.append(compMetadata)
173
+ if len(parts) == 1:
174
+ return parts[0]
175
+ return parts
176
+
177
+ def updateDirectoryEntries(directory=None, tableData=None):
178
+ offset = headerSize + (len(directory) * directorySize)
179
+ for entry in directory:
180
+ origData, compData = tableData[entry["tag"]]
181
+ entry["offset"] = offset
182
+ entry["compLength"] = len(compData)
183
+ entry["origLength"] = len(origData)
184
+ entry["origChecksum"] = 0
185
+ offset += len(compData)
186
+
187
+ testDataTableData = "\0" * 1000
188
+
189
+ def packTestHeader(data):
190
+ return structPack(headerFormat, data)
191
+
192
+ def packTestDirectory(directory):
193
+ data = ""
194
+ for table in directory:
195
+ data += structPack(directoryFormat, table)
196
+ return data
197
+
198
+ def packTestTableData(directory, tableData):
199
+ if tableData is None:
200
+ tableData = {}
201
+ for entry in directory:
202
+ tableData[entry["tag"]] = (testDataTableData, testDataTableData)
203
+ orderedData = []
204
+ for entry in directory:
205
+ tag = entry["tag"]
206
+ origData, compData = tableData[tag]
207
+ orderedData.append(compData)
208
+ return "".join(orderedData)
209
+
210
+ # --------------
211
+ # test functions
212
+ # --------------
213
+
214
+ # calcPaddingLength
215
+
216
+ def testCalcPaddedLength():
217
+ """
218
+ >>> calcPaddingLength(0)
219
+ 0
220
+ >>> calcPaddingLength(1)
221
+ 3
222
+ >>> calcPaddingLength(2)
223
+ 2
224
+ >>> calcPaddingLength(3)
225
+ 1
226
+ >>> calcPaddingLength(4)
227
+ 0
228
+ >>> calcPaddingLength(13)
229
+ 3
230
+ >>> calcPaddingLength(14)
231
+ 2
232
+ >>> calcPaddingLength(15)
233
+ 1
234
+ >>> calcPaddingLength(16)
235
+ 0
236
+ """
237
+
238
+ # testHeaderSize
239
+
240
+ def headerSizeTest1():
241
+ """
242
+ File with proper length.
243
+
244
+ >>> doctestFunction1(testHeaderSize, headerSizeTest1())
245
+ (None, 'PASS')
246
+ """
247
+ header = defaultTestData(header=True)
248
+ return packTestHeader(header)
249
+
250
+ def headerSizeTest2():
251
+ """
252
+ File with improper length.
253
+
254
+ >>> doctestFunction1(testHeaderSize, headerSizeTest2())
255
+ (True, 'ERROR')
256
+ """
257
+ header = defaultTestData(header=True)
258
+ return packTestHeader(header)[-1]
259
+
260
+
261
+ # testHeaderStructure
262
+
263
+ def headerStructureTest1():
264
+ """
265
+ Valid structure.
266
+
267
+ >>> doctestFunction1(testHeaderStructure, headerStructureTest1())
268
+ (None, 'PASS')
269
+ """
270
+ header = defaultTestData(header=True)
271
+ return packTestHeader(header)
272
+
273
+
274
+ # testHeaderSignature
275
+
276
+ def headerSignatureTest1():
277
+ """
278
+ Valid signature.
279
+
280
+ >>> doctestFunction1(testHeaderSignature, headerSignatureTest1())
281
+ (None, 'PASS')
282
+ """
283
+ header = defaultTestData(header=True)
284
+ return packTestHeader(header)
285
+
286
+ def headerSignatureTest2():
287
+ """
288
+ Invalid signature.
289
+
290
+ >>> doctestFunction1(testHeaderSignature, headerSignatureTest2())
291
+ (True, 'ERROR')
292
+ """
293
+ header = defaultTestData(header=True)
294
+ header["signature"] = "XXXX"
295
+ return packTestHeader(header)
296
+
297
+ # testHeaderFlavor
298
+
299
+ def flavorTest1():
300
+ """
301
+ Unknown flavor.
302
+
303
+ >>> doctestFunction1(testHeaderFlavor, flavorTest1())
304
+ (None, 'WARNING')
305
+ """
306
+ header = defaultTestData(header=True)
307
+ header["flavor"] = "XXXX"
308
+ return packTestHeader(header)
309
+
310
+ def flavorTest2():
311
+ """
312
+ Flavor is OTTO, CFF is in tables.
313
+
314
+ >>> doctestFunction1(testHeaderFlavor, flavorTest2())
315
+ (None, 'PASS')
316
+ """
317
+ header, directory = defaultTestData(header=True, directory=True)
318
+ directory[-1]["tag"] = "CFF "
319
+ return packTestHeader(header) + packTestDirectory(directory)
320
+
321
+ def flavorTest3():
322
+ """
323
+ Flavor is 0x00010000, CFF is in tables.
324
+
325
+ >>> doctestFunction1(testHeaderFlavor, flavorTest3())
326
+ (None, 'ERROR')
327
+ """
328
+ header, directory = defaultTestData(header=True, directory=True)
329
+ header["flavor"] = "\000\001\000\000"
330
+ directory[-1]["tag"] = "CFF "
331
+ return packTestHeader(header) + packTestDirectory(directory)
332
+
333
+ def flavorTest4():
334
+ """
335
+ Flavor is 0x00010000, CFF is not in tables.
336
+
337
+ >>> doctestFunction1(testHeaderFlavor, flavorTest4())
338
+ (None, 'PASS')
339
+ """
340
+ header, directory = defaultTestData(header=True, directory=True)
341
+ header["flavor"] = "\000\001\000\000"
342
+ return packTestHeader(header) + packTestDirectory(directory)
343
+
344
+ def flavorTest5():
345
+ """
346
+ Flavor is OTTO, CFF is not in tables.
347
+
348
+ >>> doctestFunction1(testHeaderFlavor, flavorTest5())
349
+ (None, 'ERROR')
350
+ """
351
+ header, directory = defaultTestData(header=True, directory=True)
352
+ header["flavor"] = "OTTO"
353
+ return packTestHeader(header) + packTestDirectory(directory)
354
+
355
+
356
+ # testHeaderLength
357
+
358
+ def headerLengthTest1():
359
+ """
360
+ Data is long enough for defined length.
361
+
362
+ >>> doctestFunction1(testHeaderLength, headerLengthTest1())
363
+ (None, 'PASS')
364
+ """
365
+ header = defaultTestData(header=True)
366
+ header["length"] = headerSize + 3
367
+ return packTestHeader(header) + ("\0" * 3)
368
+
369
+ def headerLengthTest2():
370
+ """
371
+ Data is not long enough for defined length.
372
+
373
+ >>> doctestFunction1(testHeaderLength, headerLengthTest2())
374
+ (True, 'ERROR')
375
+ """
376
+ header = defaultTestData(header=True)
377
+ header["length"] = headerSize + 3
378
+ return packTestHeader(header) + "\0"
379
+
380
+ def headerLengthTest3():
381
+ """
382
+ Data is long enough for header and directory.
383
+
384
+ >>> doctestFunction1(testHeaderLength, headerLengthTest3())
385
+ (None, 'PASS')
386
+ """
387
+ header, directory = defaultTestData(header=True, directory=True)
388
+ for table in directory:
389
+ table["offset"] = 0
390
+ table["compLength"] = 0
391
+ return packTestHeader(header) + packTestDirectory(directory)
392
+
393
+ def headerLengthTest4():
394
+ """
395
+ Data is not long enough for header and directory.
396
+
397
+ >>> doctestFunction1(testHeaderLength, headerLengthTest4())
398
+ (True, 'ERROR')
399
+ """
400
+ header, directory = defaultTestData(header=True, directory=True)
401
+ header["length"] = 1
402
+ return packTestHeader(header) + packTestDirectory(directory)
403
+
404
+ def headerLengthTest5():
405
+ """
406
+ Data is long enough for header and meta data.
407
+
408
+ >>> doctestFunction1(testHeaderLength, headerLengthTest5())
409
+ (None, 'PASS')
410
+ """
411
+ header = defaultTestData(header=True)
412
+ header["length"] = headerSize + 10
413
+ header["metaLength"] = 10
414
+ return packTestHeader(header) + ("\0" * 10)
415
+
416
+ def headerLengthTest6():
417
+ """
418
+ Data is not long enough for header and meta data.
419
+
420
+ >>> doctestFunction1(testHeaderLength, headerLengthTest6())
421
+ (True, 'ERROR')
422
+ """
423
+ header = defaultTestData(header=True)
424
+ header["length"] = headerSize + 10
425
+ header["metaLength"] = 10
426
+ return packTestHeader(header) + ("\0" * 5)
427
+
428
+ def headerLengthTest7():
429
+ """
430
+ Data is long enough for header and private data.
431
+
432
+ >>> doctestFunction1(testHeaderLength, headerLengthTest7())
433
+ (None, 'PASS')
434
+ """
435
+ header = defaultTestData(header=True)
436
+ header["length"] = headerSize + 10
437
+ header["privLength"] = 10
438
+ return packTestHeader(header) + ("\0" * 10)
439
+
440
+ def headerLengthTest8():
441
+ """
442
+ Data is long enough for header and meta data.
443
+
444
+ >>> doctestFunction1(testHeaderLength, headerLengthTest8())
445
+ (True, 'ERROR')
446
+ """
447
+ header = defaultTestData(header=True)
448
+ header["length"] = headerSize + 10
449
+ header["privLength"] = 10
450
+ return packTestHeader(header) + ("\0" * 5)
451
+
452
+
453
+ # testHeaderReserved
454
+
455
+ def headerReservedTest1():
456
+ """
457
+ reserved is 0.
458
+
459
+ >>> doctestFunction1(testHeaderReserved, headerReservedTest1())
460
+ (None, 'PASS')
461
+ """
462
+ header = defaultTestData(header=True)
463
+ header["reserved"] = 0
464
+ return packTestHeader(header)
465
+
466
+ def headerReservedTest2():
467
+ """
468
+ reserved is 1.
469
+
470
+ >>> doctestFunction1(testHeaderReserved, headerReservedTest2())
471
+ (True, 'ERROR')
472
+ """
473
+ header = defaultTestData(header=True)
474
+ header["reserved"] = 1
475
+ return packTestHeader(header)
476
+
477
+
478
+ # testHeaderTotalSFNTSize
479
+
480
+ def totalSFNTSizeTest1():
481
+ """
482
+ Valid totalSfntSize.
483
+
484
+ >>> doctestFunction1(testHeaderTotalSFNTSize, totalSFNTSizeTest1())
485
+ (None, 'PASS')
486
+ """
487
+ header, directory = defaultTestData(header=True, directory=True)
488
+ return packTestHeader(header) + packTestDirectory(directory)
489
+
490
+ def totalSFNTSizeTest2():
491
+ """
492
+ Invalid totalSfntSize. is not a multiple of 4.
493
+
494
+ >>> doctestFunction1(testHeaderTotalSFNTSize, totalSFNTSizeTest2())
495
+ (None, 'ERROR')
496
+ """
497
+ header, directory = defaultTestData(header=True, directory=True)
498
+ header["totalSfntSize"] -= 1
499
+ return packTestHeader(header) + packTestDirectory(directory)
500
+
501
+ def totalSFNTSizeTest3():
502
+ """
503
+ Invalid totalSfntSize compared to the table sizes.
504
+
505
+ >>> doctestFunction1(testHeaderTotalSFNTSize, totalSFNTSizeTest3())
506
+ (None, 'ERROR')
507
+ """
508
+ header, directory = defaultTestData(header=True, directory=True)
509
+ header["totalSfntSize"] += 4
510
+ return packTestHeader(header) + packTestDirectory(directory)
511
+
512
+
513
+ # testHeaderMajorVersionAndMinorVersion
514
+
515
+ def headerVersionTest1():
516
+ """
517
+ 0.0
518
+
519
+ >>> doctestFunction1(testHeaderMajorVersionAndMinorVersion, headerVersionTest1())
520
+ (None, 'WARNING')
521
+ """
522
+ header = defaultTestData(header=True)
523
+ header["majorVersion"] = 0
524
+ header["minorVersion"] = 0
525
+ return packTestHeader(header)
526
+
527
+ def headerVersionTest2():
528
+ """
529
+ 1.0
530
+
531
+ >>> doctestFunction1(testHeaderMajorVersionAndMinorVersion, headerVersionTest2())
532
+ (None, 'PASS')
533
+ """
534
+ header = defaultTestData(header=True)
535
+ header["majorVersion"] = 1
536
+ return packTestHeader(header)
537
+
538
+
539
+ # testHeaderNumTables
540
+
541
+ def headerNumTablesTest1():
542
+ """
543
+ numTables is 0.
544
+
545
+ >>> doctestFunction1(testHeaderNumTables, headerNumTablesTest1())
546
+ (True, 'ERROR')
547
+ """
548
+ header = defaultTestData(header=True)
549
+ header["numTables"] = 0
550
+ return packTestHeader(header)
551
+
552
+ def headerNumTablesTest2():
553
+ """
554
+ numTables is 3 and 3 directory entries are packed.
555
+
556
+ >>> doctestFunction1(testHeaderNumTables, headerNumTablesTest2())
557
+ (None, 'PASS')
558
+ """
559
+ header, directory = defaultTestData(header=True, directory=True)
560
+ return packTestHeader(header) + packTestDirectory(directory)
561
+
562
+ def headerNumTablesTest3():
563
+ """
564
+ numTables is 4 and 3 directory entries are packed.
565
+
566
+ >>> doctestFunction1(testHeaderNumTables, headerNumTablesTest3())
567
+ (True, 'ERROR')
568
+ """
569
+ header, directory = defaultTestData(header=True, directory=True)
570
+ header["numTables"] += 1
571
+ return packTestHeader(header) + packTestDirectory(directory)
572
+
573
+
574
+ # testDirectoryTableOrder
575
+
576
+ def directoryOrderTest1():
577
+ """
578
+ Valid order.
579
+
580
+ >>> doctestFunction1(testDirectoryTableOrder, directoryOrderTest1())
581
+ (None, 'PASS')
582
+ """
583
+ header, directory = defaultTestData(header=True, directory=True)
584
+ return packTestHeader(header) + packTestDirectory(directory)
585
+
586
+ def directoryOrderTest2():
587
+ """
588
+ Reversed order.
589
+
590
+ >>> doctestFunction1(testDirectoryTableOrder, directoryOrderTest2())
591
+ (None, 'ERROR')
592
+ """
593
+ header, directory = defaultTestData(header=True, directory=True)
594
+ return packTestHeader(header) + packTestDirectory(reversed(directory))
595
+
596
+
597
+ # testDirectoryBorders
598
+
599
+ def directoryOffsetLengthTest1():
600
+ """
601
+ Valid offsets and lengths.
602
+
603
+ >>> doctestFunction1(testDirectoryBorders, directoryOffsetLengthTest1())
604
+ (None, 'PASS')
605
+ """
606
+ header, directory = defaultTestData(header=True, directory=True)
607
+ offset = header["length"]
608
+ for table in directory:
609
+ table["offset"] = offset
610
+ table["compLength"] = 1
611
+ offset += 1
612
+ header["length"] += len(directory)
613
+ return packTestHeader(header) + packTestDirectory(directory)
614
+
615
+ def directoryOffsetLengthTest2():
616
+ """
617
+ Offset within header/directory block.
618
+
619
+ >>> doctestFunction1(testDirectoryBorders, directoryOffsetLengthTest2())
620
+ (True, 'ERROR')
621
+ """
622
+ header, directory = defaultTestData(header=True, directory=True)
623
+ for table in directory:
624
+ table["offset"] = 0
625
+ table["compLength"] = 1
626
+ header["length"] += len(directory)
627
+ return packTestHeader(header) + packTestDirectory(directory)
628
+
629
+ def directoryOffsetLengthTest3():
630
+ """
631
+ Offset after end of file.
632
+
633
+ >>> doctestFunction1(testDirectoryBorders, directoryOffsetLengthTest3())
634
+ (True, 'ERROR')
635
+ """
636
+ header, directory = defaultTestData(header=True, directory=True)
637
+ for table in directory:
638
+ table["offset"] = 1000
639
+ return packTestHeader(header) + packTestDirectory(directory)
640
+
641
+ def directoryOffsetLengthTest4():
642
+ """
643
+ Offset + length after end of file.
644
+
645
+ >>> doctestFunction1(testDirectoryBorders, directoryOffsetLengthTest4())
646
+ (True, 'ERROR')
647
+ """
648
+ header, directory = defaultTestData(header=True, directory=True)
649
+ offset = header["length"]
650
+ for table in directory:
651
+ table["offset"] = 1000
652
+ table["compLength"] = 1
653
+ offset += 1
654
+ header["length"] += len(directory)
655
+ return packTestHeader(header) + packTestDirectory(directory)
656
+
657
+
658
+ # testDirectoryCompressedLength
659
+
660
+ def directoryCompressedLengthTest1():
661
+ """
662
+ compLength less than origLength.
663
+
664
+ >>> doctestFunction1(testDirectoryCompressedLength, directoryCompressedLengthTest1())
665
+ (None, 'PASS')
666
+ """
667
+ header, directory = defaultTestData(header=True, directory=True)
668
+ for table in directory:
669
+ table["compLength"] = 10
670
+ table["origLength"] = 11
671
+ return packTestHeader(header) + packTestDirectory(directory)
672
+
673
+ def directoryCompressedLengthTest2():
674
+ """
675
+ compLength greater than origLength.
676
+
677
+ >>> doctestFunction1(testDirectoryCompressedLength, directoryCompressedLengthTest2())
678
+ (None, 'ERROR')
679
+ """
680
+ header, directory = defaultTestData(header=True, directory=True)
681
+ for table in directory:
682
+ table["compLength"] = 11
683
+ table["origLength"] = 10
684
+ return packTestHeader(header) + packTestDirectory(directory)
685
+
686
+
687
+ # testDirectoryDecompressedLength
688
+
689
+ def decompressedLengthTest1():
690
+ """
691
+ Matching decompressed and origLengths.
692
+
693
+ >>> doctestFunction1(testDirectoryDecompressedLength, decompressedLengthTest1())
694
+ (None, 'PASS')
695
+ """
696
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
697
+ origData = testDataTableData
698
+ compData = zlib.compress(origData)
699
+ for tag, (origData, compData) in tableData.items():
700
+ tableData[tag] = (origData, zlib.compress(origData))
701
+ updateDirectoryEntries(directory, tableData)
702
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
703
+
704
+ def decompressedLengthTest2():
705
+ """
706
+ Non-matching decompressed and origLengths.
707
+
708
+ >>> doctestFunction1(testDirectoryDecompressedLength, decompressedLengthTest2())
709
+ (None, 'ERROR')
710
+ """
711
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
712
+ origData = testDataTableData
713
+ compData = zlib.compress(origData)
714
+ for tag, (origData, compData) in tableData.items():
715
+ tableData[tag] = (origData, zlib.compress(origData))
716
+ updateDirectoryEntries(directory, tableData)
717
+ for entry in directory:
718
+ entry["origLength"] += 1
719
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
720
+
721
+
722
+ # testDirectoryChecksums
723
+
724
+ def checksumTest1():
725
+ """
726
+ Correct checksums.
727
+
728
+ >>> doctestFunction1(testDirectoryChecksums, checksumTest1())
729
+ (None, 'PASS')
730
+ """
731
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
732
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
733
+
734
+ def checksumTest2():
735
+ """
736
+ Incorrect checksums.
737
+
738
+ >>> doctestFunction1(testDirectoryChecksums, checksumTest2())
739
+ (None, 'ERROR')
740
+ """
741
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
742
+ for entry in directory:
743
+ entry["origChecksum"] = 123
744
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
745
+
746
+
747
+ # testTableDataStart
748
+
749
+ def tableStartTest1():
750
+ """
751
+ Proper position.
752
+
753
+ >>> doctestFunction1(testTableDataStart, tableStartTest1())
754
+ (None, 'PASS')
755
+ """
756
+ header, directory = defaultTestData(header=True, directory=True)
757
+ offset = header["length"]
758
+ for entry in directory:
759
+ entry["offset"] = offset
760
+ offset += 1
761
+ return packTestHeader(header) + packTestDirectory(directory)
762
+
763
+ def tableStartTest2():
764
+ """
765
+ Improper position.
766
+
767
+ >>> doctestFunction1(testTableDataStart, tableStartTest2())
768
+ (None, 'ERROR')
769
+ """
770
+ header, directory = defaultTestData(header=True, directory=True)
771
+ offset = header["length"] + 1
772
+ for entry in directory:
773
+ entry["offset"] = offset
774
+ offset += 1
775
+ return packTestHeader(header) + packTestDirectory(directory)
776
+
777
+
778
+ # testTableGaps
779
+
780
+ def tableGapsTest1():
781
+ """
782
+ No gaps between tables.
783
+
784
+ >>> doctestFunction1(testTableGaps, tableGapsTest1())
785
+ (None, 'PASS')
786
+ """
787
+ header, directory = defaultTestData(header=True, directory=True)
788
+ offset = header["length"]
789
+ for entry in directory:
790
+ entry["offset"] = offset
791
+ entry["compLength"] = 100
792
+ offset += 100
793
+ return packTestHeader(header) + packTestDirectory(directory)
794
+
795
+ def tableGapsTest2():
796
+ """
797
+ Gaps between tables.
798
+
799
+ >>> doctestFunction1(testTableGaps, tableGapsTest2())
800
+ (None, 'ERROR')
801
+ """
802
+ header, directory = defaultTestData(header=True, directory=True)
803
+ offset = header["length"]
804
+ for entry in directory:
805
+ entry["offset"] = offset
806
+ entry["compLength"] = 100
807
+ offset += 104
808
+ return packTestHeader(header) + packTestDirectory(directory)
809
+
810
+
811
+ # testTablePadding
812
+
813
+ def paddingTest1():
814
+ """
815
+ Proper padding.
816
+
817
+ >>> doctestFunction1(testTablePadding, paddingTest1(), -2)
818
+ (None, 'PASS')
819
+ """
820
+ header, directory = defaultTestData(header=True, directory=True)
821
+ return packTestHeader(header) + packTestDirectory(directory)
822
+
823
+ def paddingTest2():
824
+ """
825
+ Offset not on a 4-bye boundary.
826
+
827
+ >>> doctestFunction1(testTablePadding, paddingTest2(), -2)
828
+ (None, 'ERROR')
829
+ """
830
+ header, directory = defaultTestData(header=True, directory=True)
831
+ for entry in directory:
832
+ entry["offset"] = 1
833
+ return packTestHeader(header) + packTestDirectory(directory)
834
+
835
+ def paddingTest3():
836
+ """
837
+ Proper end padding, no metadata or private data.
838
+
839
+ >>> doctestFunction1(testTablePadding, paddingTest3())
840
+ (None, 'PASS')
841
+ """
842
+ header = defaultTestData(header=True)
843
+ header["length"] += 4
844
+ return packTestHeader(header)
845
+
846
+ def paddingTest4():
847
+ """
848
+ Improper end padding, no metadata or private data.
849
+
850
+ >>> doctestFunction1(testTablePadding, paddingTest4())
851
+ (None, 'ERROR')
852
+ """
853
+ header = defaultTestData(header=True)
854
+ header["length"] += 3
855
+ return packTestHeader(header)
856
+
857
+ def paddingTest5():
858
+ """
859
+ Proper end padding, metadata, no private data.
860
+
861
+ >>> doctestFunction1(testTablePadding, paddingTest5())
862
+ (None, 'PASS')
863
+ """
864
+ header = defaultTestData(header=True)
865
+ header["length"] += 4
866
+ header["metaOffset"] = header["length"]
867
+ return packTestHeader(header)
868
+
869
+ def paddingTest6():
870
+ """
871
+ Improper end padding, metadata, no private data.
872
+
873
+ >>> doctestFunction1(testTablePadding, paddingTest6())
874
+ (None, 'ERROR')
875
+ """
876
+ header = defaultTestData(header=True)
877
+ header["length"] += 3
878
+ header["metaOffset"] = header["length"]
879
+ return packTestHeader(header)
880
+
881
+ def paddingTest7():
882
+ """
883
+ Proper end padding, no metadata, private data.
884
+
885
+ >>> doctestFunction1(testTablePadding, paddingTest7())
886
+ (None, 'PASS')
887
+ """
888
+ header = defaultTestData(header=True)
889
+ header["length"] += 4
890
+ header["privOffset"] = header["length"]
891
+ return packTestHeader(header)
892
+
893
+ def paddingTest8():
894
+ """
895
+ Improper end padding, no metadata, private data.
896
+
897
+ >>> doctestFunction1(testTablePadding, paddingTest8())
898
+ (None, 'ERROR')
899
+ """
900
+ header = defaultTestData(header=True)
901
+ header["length"] += 3
902
+ header["privOffset"] = header["length"]
903
+ return packTestHeader(header)
904
+
905
+ def paddingTest9():
906
+ """
907
+ Tables properly padded with null bytes.
908
+
909
+ >>> doctestFunction1(testTablePadding, paddingTest9())
910
+ (None, 'PASS')
911
+ """
912
+ header, directory = defaultTestData(header=True, directory=True)
913
+ offset = header["length"]
914
+ header["length"] += 12
915
+ data = ("\1" * 3) + "\0"
916
+ tableData = {}
917
+ for entry in directory:
918
+ tag = entry["tag"]
919
+ entry["offset"] = offset
920
+ entry["compLength"] = 3
921
+ offset += 4
922
+ tableData[tag] = (data, data)
923
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
924
+
925
+ def paddingTest10():
926
+ """
927
+ Tables not properly padded with null bytes.
928
+
929
+ >>> doctestFunction1(testTablePadding, paddingTest10())
930
+ (None, 'ERROR')
931
+ """
932
+ header, directory = defaultTestData(header=True, directory=True)
933
+ offset = header["length"]
934
+ header["length"] += 12
935
+ data = "\1" * 4
936
+ tableData = {}
937
+ for entry in directory:
938
+ tag = entry["tag"]
939
+ entry["offset"] = offset
940
+ entry["compLength"] = 3
941
+ offset += 4
942
+ tableData[tag] = (data, data)
943
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
944
+
945
+ # testTableDecompression
946
+
947
+ def decompressionTest1():
948
+ """
949
+ Properly compressed data.
950
+
951
+ >>> doctestFunction1(testTableDecompression, decompressionTest1())
952
+ (False, 'PASS')
953
+ """
954
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
955
+ for tag, (origData, compData) in tableData.items():
956
+ tableData[tag] = (origData, zlib.compress(compData))
957
+ updateDirectoryEntries(directory, tableData)
958
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
959
+
960
+ def decompressionTest2():
961
+ """
962
+ Improperly compressed data.
963
+
964
+ >>> doctestFunction1(testTableDecompression, decompressionTest2())
965
+ (True, 'ERROR')
966
+ """
967
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
968
+ for tag, (origData, compData) in tableData.items():
969
+ compData = "".join(reversed(zlib.compress(compData)))
970
+ tableData[tag] = (origData, compData)
971
+ updateDirectoryEntries(directory, tableData)
972
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
973
+
974
+
975
+ # testHeadCheckSumAdjustment
976
+
977
+ def headCheckSumAdjustmentTest1():
978
+ """
979
+ Valid checksum.
980
+
981
+ >>> doctestFunction1(testHeadCheckSumAdjustment, headCheckSumAdjustmentTest1())
982
+ (None, 'PASS')
983
+ """
984
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
985
+ woffData = packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
986
+ for entry in directory:
987
+ if entry["tag"] == "head":
988
+ headOffset = entry["offset"]
989
+ checkSumAdjustment = calcHeadChecksum(woffData)
990
+ checkSumAdjustment = struct.pack(">L", checkSumAdjustment)
991
+ woffData = woffData[:headOffset+8] + checkSumAdjustment + woffData[headOffset+12:]
992
+ return woffData
993
+
994
+ def headCheckSumAdjustmentTest2():
995
+ """
996
+ Invalid checksum.
997
+
998
+ >>> doctestFunction1(testHeadCheckSumAdjustment, headCheckSumAdjustmentTest2())
999
+ (None, 'ERROR')
1000
+ """
1001
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
1002
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
1003
+
1004
+
1005
+ # testMetadataOffsetAndLength
1006
+
1007
+ def metadataOffsetLengthTest1():
1008
+ """
1009
+ Valid empty offset and length.
1010
+
1011
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest1())
1012
+ (None, 'PASS')
1013
+ """
1014
+ header = defaultTestData(header=True)
1015
+ header["metaOffset"] = 0
1016
+ header["metaLength"] = 0
1017
+ return packTestHeader(header)
1018
+
1019
+ def metadataOffsetLengthTest2():
1020
+ """
1021
+ metaOffset = 0, metaLength = 1.
1022
+
1023
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest2())
1024
+ (None, 'ERROR')
1025
+ """
1026
+ header = defaultTestData(header=True)
1027
+ header["metaOffset"] = 0
1028
+ header["metaLength"] = 1
1029
+ return packTestHeader(header)
1030
+
1031
+ def metadataOffsetLengthTest3():
1032
+ """
1033
+ metaOffset = 1, metaLength = 3.
1034
+
1035
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest3())
1036
+ (None, 'ERROR')
1037
+ """
1038
+ header = defaultTestData(header=True)
1039
+ header["metaOffset"] = 1
1040
+ header["metaLength"] = 0
1041
+ return packTestHeader(header)
1042
+
1043
+ def metadataOffsetLengthTest4():
1044
+ """
1045
+ Valid offset and length.
1046
+
1047
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest4())
1048
+ (None, 'PASS')
1049
+ """
1050
+ header = defaultTestData(header=True)
1051
+ header["metaOffset"] = header["length"]
1052
+ header["metaLength"] = 1
1053
+ header["length"] += 1
1054
+ return packTestHeader(header)
1055
+
1056
+ def metadataOffsetLengthTest5():
1057
+ """
1058
+ Offset before end of the directory.
1059
+
1060
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest5())
1061
+ (None, 'ERROR')
1062
+ """
1063
+ header = defaultTestData(header=True)
1064
+ header["metaOffset"] = header["length"] - 4
1065
+ header["metaLength"] = 1
1066
+ header["length"] += 1
1067
+ return packTestHeader(header)
1068
+
1069
+ def metadataOffsetLengthTest6():
1070
+ """
1071
+ Offset after end of file.
1072
+
1073
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest6())
1074
+ (None, 'ERROR')
1075
+ """
1076
+ header = defaultTestData(header=True)
1077
+ header["metaOffset"] = header["length"] + 4
1078
+ header["metaLength"] = 1
1079
+ header["length"] += 1
1080
+ return packTestHeader(header)
1081
+
1082
+ def metadataOffsetLengthTest7():
1083
+ """
1084
+ Offset + length greater than length of file.
1085
+
1086
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest7())
1087
+ (None, 'ERROR')
1088
+ """
1089
+ header = defaultTestData(header=True)
1090
+ header["metaOffset"] = header["length"]
1091
+ header["metaLength"] = 2
1092
+ header["length"] += 1
1093
+ return packTestHeader(header)
1094
+
1095
+ def metadataOffsetLengthTest8():
1096
+ """
1097
+ Length longer than available length.
1098
+
1099
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest8())
1100
+ (None, 'ERROR')
1101
+ """
1102
+ header = defaultTestData(header=True)
1103
+ header["metaOffset"] = header["length"]
1104
+ header["metaLength"] = 2
1105
+ header["length"] += 1
1106
+ return packTestHeader(header)
1107
+
1108
+ def metadataOffsetLengthTest9():
1109
+ """
1110
+ Offset doesn't begin immediately after last table.
1111
+
1112
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest9())
1113
+ (None, 'ERROR')
1114
+ """
1115
+ header = defaultTestData(header=True)
1116
+ header["metaOffset"] = header["length"] + 4
1117
+ header["metaLength"] = 1
1118
+ header["length"] += 2
1119
+ return packTestHeader(header)
1120
+
1121
+ def metadataOffsetLengthTest10():
1122
+ """
1123
+ Offset doesn't begin on a four-byte boundary.
1124
+
1125
+ >>> doctestFunction1(testMetadataOffsetAndLength, metadataOffsetLengthTest10())
1126
+ (None, 'ERROR')
1127
+ """
1128
+ header = defaultTestData(header=True)
1129
+ header["metaOffset"] = header["length"] + 2
1130
+ header["metaLength"] = 1
1131
+ header["length"] += 2
1132
+ return packTestHeader(header)
1133
+
1134
+
1135
+ # testMetadataPadding
1136
+
1137
+ def metadataPaddingTest1():
1138
+ """
1139
+ Valid padding: No padding needed. No private data.
1140
+
1141
+ >>> doctestFunction1(testMetadataPadding, metadataPaddingTest1())
1142
+ (None, 'PASS')
1143
+ """
1144
+ header = defaultTestData(header=True)
1145
+ header["metaOffset"] = header["length"]
1146
+ header["metaLength"] = 8
1147
+ header["length"] += 8
1148
+ return packTestHeader(header)
1149
+
1150
+ def metadataPaddingTest2():
1151
+ """
1152
+ Valid padding: Padded with null. No private data.
1153
+
1154
+ >>> doctestFunction1(testMetadataPadding, metadataPaddingTest2())
1155
+ (None, 'PASS')
1156
+ """
1157
+ header = defaultTestData(header=True)
1158
+ metadata = "\0" * 8
1159
+ header["metaOffset"] = header["length"]
1160
+ header["metaLength"] = 7
1161
+ header["length"] += 8
1162
+ return packTestHeader(header) + metadata
1163
+
1164
+ def metadataPaddingTest3():
1165
+ """
1166
+ Invalid padding: Padded with something other than null. No private data.
1167
+
1168
+ >>> doctestFunction1(testMetadataPadding, metadataPaddingTest3())
1169
+ (None, 'ERROR')
1170
+ """
1171
+ header = defaultTestData(header=True)
1172
+ metadata = "A" * 8
1173
+ header["metaOffset"] = header["length"]
1174
+ header["metaLength"] = 7
1175
+ header["length"] += 8
1176
+ return packTestHeader(header) + metadata
1177
+
1178
+ def metadataPaddingTest4():
1179
+ """
1180
+ Valid padding: No padding needed. Have private data.
1181
+
1182
+ >>> doctestFunction1(testMetadataPadding, metadataPaddingTest4())
1183
+ (None, 'PASS')
1184
+ """
1185
+ header = defaultTestData(header=True)
1186
+ header["metaOffset"] = header["length"]
1187
+ header["metaLength"] = 8
1188
+ header["privOffset"] = header["metaOffset"] + 8
1189
+ return packTestHeader(header)
1190
+
1191
+ def metadataPaddingTest5():
1192
+ """
1193
+ Valid padding: Padded with null. Have private data.
1194
+
1195
+ >>> doctestFunction1(testMetadataPadding, metadataPaddingTest5())
1196
+ (None, 'PASS')
1197
+ """
1198
+ header = defaultTestData(header=True)
1199
+ metadata = "\0" * 8
1200
+ header["metaOffset"] = header["length"]
1201
+ header["metaLength"] = 7
1202
+ header["privOffset"] = header["metaOffset"] + 8
1203
+ header["length"] += 8
1204
+ return packTestHeader(header) + metadata
1205
+
1206
+ def metadataPaddingTest6():
1207
+ """
1208
+ Invalid padding: Padded with something other than null. Have private data.
1209
+
1210
+ >>> doctestFunction1(testMetadataPadding, metadataPaddingTest6())
1211
+ (None, 'ERROR')
1212
+ """
1213
+ header = defaultTestData(header=True)
1214
+ metadata = "\A" * 8
1215
+ header["metaOffset"] = header["length"]
1216
+ header["metaLength"] = 7
1217
+ header["privOffset"] = header["metaOffset"] + 8
1218
+ header["length"] += 8
1219
+ return packTestHeader(header) + metadata
1220
+
1221
+
1222
+ # testMetadataIsCompressed
1223
+
1224
+ def metadataIsCompressedTest1():
1225
+ """
1226
+ Valid metaLength and metaOrigLength.
1227
+
1228
+ >>> doctestFunction1(testMetadataIsCompressed, metadataIsCompressedTest1())
1229
+ (None, 'PASS')
1230
+ """
1231
+ header = defaultTestData(header=True)
1232
+ header["metaOffset"] = header["length"]
1233
+ header["metaLength"] = 8
1234
+ header["metaOrigLength"] = 10
1235
+ header["length"] += 8
1236
+ return packTestHeader(header)
1237
+
1238
+ def metadataIsCompressedTest2():
1239
+ """
1240
+ metaLength longer than metaOrigLength.
1241
+
1242
+ >>> doctestFunction1(testMetadataIsCompressed, metadataIsCompressedTest2())
1243
+ (True, 'ERROR')
1244
+ """
1245
+ header = defaultTestData(header=True)
1246
+ header["metaOffset"] = header["length"]
1247
+ header["metaLength"] = 10
1248
+ header["metaOrigLength"] = 8
1249
+ header["length"] += 10
1250
+ return packTestHeader(header)
1251
+
1252
+ # shouldSkipMetadataTest
1253
+
1254
+ def metadataSkipTest1():
1255
+ """
1256
+ Have metadata.
1257
+
1258
+ >>> reporter = HTMLReporter()
1259
+ >>> shouldSkipMetadataTest(metadataSkipTest1(), reporter)
1260
+ >>> reporter.testResults
1261
+ []
1262
+ """
1263
+ header, directory, tableData, metadata = defaultTestData(header=True, directory=True, tableData=True, metadata=True)
1264
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData) + metadata
1265
+
1266
+ def metadataSkipTest2():
1267
+ """
1268
+ Do not have metadata.
1269
+
1270
+ >>> reporter = HTMLReporter()
1271
+ >>> reporter.logTestTitle("Test")
1272
+ >>> shouldSkipMetadataTest(metadataSkipTest2(), reporter)
1273
+ True
1274
+ >>> len(reporter.testResults[0])
1275
+ 1
1276
+ >>> reporter.testResults[0][0]["type"]
1277
+ 'NOTE'
1278
+ """
1279
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
1280
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData)
1281
+
1282
+
1283
+ # testMetadataDecompression
1284
+
1285
+ def metadataDecompressionTest1():
1286
+ """
1287
+ Properly compressed.
1288
+
1289
+ >>> doctestFunction1(testMetadataDecompression, metadataDecompressionTest1())
1290
+ (None, 'PASS')
1291
+ """
1292
+ header, directory, tableData, metadata = defaultTestData(header=True, directory=True, tableData=True, metadata=True)
1293
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData) + metadata
1294
+
1295
+ def metadataDecompressionTest2():
1296
+ """
1297
+ Improperly compressed.
1298
+
1299
+ >>> doctestFunction1(testMetadataDecompression, metadataDecompressionTest2())
1300
+ (True, 'ERROR')
1301
+ """
1302
+ header, directory, tableData, metadata = defaultTestData(header=True, directory=True, tableData=True, metadata=True)
1303
+ metadata = "".join(reversed(metadata))
1304
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData) + metadata
1305
+
1306
+
1307
+ # testMetadataDecompressedLength
1308
+
1309
+ def metadataDecompressedLengthTest1():
1310
+ """
1311
+ Correct length..
1312
+
1313
+ >>> doctestFunction1(testMetadataDecompressedLength, metadataDecompressedLengthTest1())
1314
+ (None, 'PASS')
1315
+ """
1316
+ header, directory, tableData, metadata = defaultTestData(header=True, directory=True, tableData=True, metadata=True)
1317
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData) + metadata
1318
+
1319
+ def metadataDecompressedLengthTest2():
1320
+ """
1321
+ Incorrect length.
1322
+
1323
+ >>> doctestFunction1(testMetadataDecompressedLength, metadataDecompressedLengthTest2())
1324
+ (None, 'ERROR')
1325
+ """
1326
+ header, directory, tableData, metadata = defaultTestData(header=True, directory=True, tableData=True, metadata=True)
1327
+ header["metaOrigLength"] -= 1
1328
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData) + metadata
1329
+
1330
+
1331
+ # testMetadataParse
1332
+
1333
+ def metadataParseTest1():
1334
+ """
1335
+ Valid XML.
1336
+
1337
+ >>> doctestFunction1(testMetadataParse, metadataParseTest1())
1338
+ (None, 'PASS')
1339
+ """
1340
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1341
+ <foo>
1342
+ <bar>
1343
+ Test.
1344
+ </bar>
1345
+ </foo>
1346
+ """
1347
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
1348
+ compMetadata = zlib.compress(metadata)
1349
+ header["metaOffset"] = header["length"]
1350
+ header["metaOrigLength"] = len(metadata)
1351
+ header["metaLength"] = len(compMetadata)
1352
+ compMetadata += "\0" * calcPaddingLength(len(compMetadata))
1353
+ header["length"] += len(compMetadata)
1354
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData) + compMetadata
1355
+
1356
+ def metadataParseTest2():
1357
+ """
1358
+ Invalid XML.
1359
+
1360
+ >>> doctestFunction1(testMetadataParse, metadataParseTest2())
1361
+ (True, 'ERROR')
1362
+ """
1363
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1364
+ <foo>
1365
+ <bar>
1366
+ <blah>
1367
+ Test.
1368
+ <blah>
1369
+ </bar>
1370
+ </foo>
1371
+ """
1372
+ header, directory, tableData = defaultTestData(header=True, directory=True, tableData=True)
1373
+ compMetadata = zlib.compress(metadata)
1374
+ header["metaOffset"] = header["length"]
1375
+ header["metaOrigLength"] = len(metadata)
1376
+ header["metaLength"] = len(compMetadata)
1377
+ compMetadata += "\0" * calcPaddingLength(len(compMetadata))
1378
+ header["length"] += len(compMetadata)
1379
+ return packTestHeader(header) + packTestDirectory(directory) + packTestTableData(directory, tableData) + compMetadata
1380
+
1381
+
1382
+ # testMetadataAbstractElementRequiredAttributes
1383
+
1384
+ def metadataAbstractElementRequiredAttributesTest1():
1385
+ """
1386
+ Required attributes present.
1387
+
1388
+ >>> doctestMetadataAbstractElementFunction(
1389
+ ... testMetadataAbstractElementRequiredAttributes,
1390
+ ... metadataAbstractElementRequiredAttributesTest1(),
1391
+ ... requiredAttributes=["required1", "required2"])
1392
+ []
1393
+ """
1394
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1395
+ <test required1="foo" required2="foo" />
1396
+ """
1397
+ return ElementTree.fromstring(metadata)
1398
+
1399
+ def metadataAbstractElementRequiredAttributesTest2():
1400
+ """
1401
+ Required attribute not present.
1402
+
1403
+ >>> doctestMetadataAbstractElementFunction(
1404
+ ... testMetadataAbstractElementRequiredAttributes,
1405
+ ... metadataAbstractElementRequiredAttributesTest2(),
1406
+ ... requiredAttributes=["required1", "required2"])
1407
+ ['ERROR']
1408
+ """
1409
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1410
+ <test required1="foo" />
1411
+ """
1412
+ return ElementTree.fromstring(metadata)
1413
+
1414
+ def metadataAbstractElementRequiredAttributesTest3():
1415
+ """
1416
+ Unknown attribute present.
1417
+
1418
+ >>> doctestMetadataAbstractElementFunction(
1419
+ ... testMetadataAbstractElementRequiredAttributes,
1420
+ ... metadataAbstractElementRequiredAttributesTest3(),
1421
+ ... requiredAttributes=["required1", "required2"])
1422
+ []
1423
+ """
1424
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1425
+ <test required1="foo" required2="foo" unknown1="foo" />
1426
+ """
1427
+ return ElementTree.fromstring(metadata)
1428
+
1429
+
1430
+ # testMetadataAbstractElementOptionalAttributes
1431
+
1432
+ def metadataAbstractElementOptionalAttributesTest1():
1433
+ """
1434
+ Optional attributes present.
1435
+
1436
+ >>> doctestMetadataAbstractElementFunction(
1437
+ ... testMetadataAbstractElementOptionalAttributes,
1438
+ ... metadataAbstractElementOptionalAttributesTest1(),
1439
+ ... optionalAttributes=["optional1", "optional2"])
1440
+ []
1441
+ """
1442
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1443
+ <test optional1="foo" optional2="foo" />
1444
+ """
1445
+ return ElementTree.fromstring(metadata)
1446
+
1447
+ def metadataAbstractElementOptionalAttributesTest2():
1448
+ """
1449
+ Optional attribute not present, issue note.
1450
+
1451
+ >>> doctestMetadataAbstractElementFunction(
1452
+ ... testMetadataAbstractElementOptionalAttributes,
1453
+ ... metadataAbstractElementOptionalAttributesTest2(),
1454
+ ... optionalAttributes=["optional1", "optional2"])
1455
+ ['NOTE']
1456
+ """
1457
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1458
+ <test optional1="foo" />
1459
+ """
1460
+ return ElementTree.fromstring(metadata)
1461
+
1462
+ def metadataAbstractElementOptionalAttributesTest3():
1463
+ """
1464
+ Optional attribute not present, don't issue note.
1465
+
1466
+ >>> doctestMetadataAbstractElementFunction(
1467
+ ... testMetadataAbstractElementOptionalAttributes,
1468
+ ... metadataAbstractElementOptionalAttributesTest3(),
1469
+ ... optionalAttributes=["optional1", "optional2"],
1470
+ ... noteMissingOptionalAttributes=False)
1471
+ []
1472
+ """
1473
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1474
+ <test optional1="foo" />
1475
+ """
1476
+ return ElementTree.fromstring(metadata)
1477
+
1478
+ def metadataAbstractElementOptionalAttributesTest4():
1479
+ """
1480
+ Unknown attribute present.
1481
+
1482
+ >>> doctestMetadataAbstractElementFunction(
1483
+ ... testMetadataAbstractElementOptionalAttributes,
1484
+ ... metadataAbstractElementOptionalAttributesTest4(),
1485
+ ... optionalAttributes=["optional1", "optional2"])
1486
+ []
1487
+ """
1488
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1489
+ <test optional1="foo" optional2="foo" unknown1="foo" />
1490
+ """
1491
+ return ElementTree.fromstring(metadata)
1492
+
1493
+
1494
+ # testMetadataAbstractElementUnknownAttributes
1495
+
1496
+ def metadataAbstractElementUnknownAttributesTest1():
1497
+ """
1498
+ No unknown attributes.
1499
+
1500
+ >>> doctestMetadataAbstractElementFunction(
1501
+ ... testMetadataAbstractElementUnknownAttributes,
1502
+ ... metadataAbstractElementUnknownAttributesTest1(),
1503
+ ... requiredAttributes=["required1", "required2"],
1504
+ ... optionalAttributes=["optional1", "optional2"])
1505
+ []
1506
+ """
1507
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1508
+ <test required1="foo" required2="foo" optional1="foo" optional2="foo" />
1509
+ """
1510
+ return ElementTree.fromstring(metadata)
1511
+
1512
+ def metadataAbstractElementUnknownAttributesTest2():
1513
+ """
1514
+ No unknown attributes.
1515
+
1516
+ >>> doctestMetadataAbstractElementFunction(
1517
+ ... testMetadataAbstractElementUnknownAttributes,
1518
+ ... metadataAbstractElementUnknownAttributesTest2(),
1519
+ ... requiredAttributes=["required1", "required2"],
1520
+ ... optionalAttributes=["optional1", "optional2"])
1521
+ ['WARNING']
1522
+ """
1523
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1524
+ <test required1="foo" required2="foo" optional1="foo" optional2="foo" unknown1="foo" />
1525
+ """
1526
+ return ElementTree.fromstring(metadata)
1527
+
1528
+ # testMetadataAbstractElementEmptyValue
1529
+
1530
+ def metadataAbstractElementEmptyValuesTest1():
1531
+ """
1532
+ No empty values.
1533
+
1534
+ >>> doctestMetadataAbstractElementFunction(
1535
+ ... testMetadataAbstractElementEmptyValue,
1536
+ ... metadataAbstractElementEmptyValuesTest1(),
1537
+ ... requiredAttributes=["required1"],
1538
+ ... optionalAttributes=["optional1"])
1539
+ []
1540
+ """
1541
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1542
+ <test required1="foo" optional1="foo" />
1543
+ """
1544
+ return ElementTree.fromstring(metadata)
1545
+
1546
+ def metadataAbstractElementEmptyValuesTest2():
1547
+ """
1548
+ Empty values.
1549
+
1550
+ >>> doctestMetadataAbstractElementFunction(
1551
+ ... testMetadataAbstractElementEmptyValue,
1552
+ ... metadataAbstractElementEmptyValuesTest2(),
1553
+ ... requiredAttributes=["required1"],
1554
+ ... optionalAttributes=["optional1"])
1555
+ ['ERROR', 'ERROR']
1556
+ """
1557
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1558
+ <test required1="" optional1="" />
1559
+ """
1560
+ return ElementTree.fromstring(metadata)
1561
+
1562
+ def metadataAbstractElementEmptyValuesTest3():
1563
+ """
1564
+ Empty value for unknown attribute.
1565
+
1566
+ >>> doctestMetadataAbstractElementFunction(
1567
+ ... testMetadataAbstractElementEmptyValue,
1568
+ ... metadataAbstractElementEmptyValuesTest3(),
1569
+ ... requiredAttributes=["required1"],
1570
+ ... optionalAttributes=["optional1"])
1571
+ []
1572
+ """
1573
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1574
+ <test required1="foo" optional1="foo" unknown1="" />
1575
+ """
1576
+ return ElementTree.fromstring(metadata)
1577
+
1578
+ # testMetadataAbstractElementIllegalText
1579
+
1580
+ def metadataAbstractElementIllegalTextTest1():
1581
+ """
1582
+ No text, text not required.
1583
+
1584
+ >>> doctestMetadataAbstractElementFunction(
1585
+ ... testMetadataAbstractElementIllegalText,
1586
+ ... metadataAbstractElementIllegalTextTest1())
1587
+ []
1588
+ """
1589
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1590
+ <test>
1591
+ </test>
1592
+ """
1593
+ return ElementTree.fromstring(metadata)
1594
+
1595
+ def metadataAbstractElementIllegalTextTest2():
1596
+ """
1597
+ Text, text not required.
1598
+
1599
+ >>> doctestMetadataAbstractElementFunction(
1600
+ ... testMetadataAbstractElementIllegalText,
1601
+ ... metadataAbstractElementIllegalTextTest2())
1602
+ ['ERROR']
1603
+ """
1604
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1605
+ <test>
1606
+ Foo.
1607
+ </test>
1608
+ """
1609
+ return ElementTree.fromstring(metadata)
1610
+
1611
+ # testMetadataAbstractElementRequiredText
1612
+
1613
+ def metadataAbstractElementRequireTextTest1():
1614
+ """
1615
+ No text, text required.
1616
+
1617
+ >>> doctestMetadataAbstractElementFunction(
1618
+ ... testMetadataAbstractElementRequiredText,
1619
+ ... metadataAbstractElementRequireTextTest1())
1620
+ ['ERROR']
1621
+ """
1622
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1623
+ <test>
1624
+ </test>
1625
+ """
1626
+ return ElementTree.fromstring(metadata)
1627
+
1628
+ def metadataAbstractElementRequireTextTest2():
1629
+ """
1630
+ Text, text required.
1631
+
1632
+ >>> doctestMetadataAbstractElementFunction(
1633
+ ... testMetadataAbstractElementRequiredText,
1634
+ ... metadataAbstractElementRequireTextTest2())
1635
+ []
1636
+ """
1637
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1638
+ <test>
1639
+ Foo.
1640
+ </test>
1641
+ """
1642
+ return ElementTree.fromstring(metadata)
1643
+
1644
+ # testMetadataAbstractElementIllegalChildElements
1645
+
1646
+ def metadataAbstractElementIllegalChildElementTest1():
1647
+ """
1648
+ No child elements, child elements not allowed.
1649
+
1650
+ >>> doctestMetadataAbstractElementFunction(
1651
+ ... testMetadataAbstractElementIllegalChildElements,
1652
+ ... metadataAbstractElementIllegalChildElementTest1())
1653
+ []
1654
+ """
1655
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1656
+ <test>
1657
+ </test>
1658
+ """
1659
+ return ElementTree.fromstring(metadata)
1660
+
1661
+ def metadataAbstractElementIllegalChildElementTest2():
1662
+ """
1663
+ Child elements, child elements not allowed.
1664
+
1665
+ >>> doctestMetadataAbstractElementFunction(
1666
+ ... testMetadataAbstractElementIllegalChildElements,
1667
+ ... metadataAbstractElementIllegalChildElementTest2())
1668
+ ['ERROR']
1669
+ """
1670
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1671
+ <test>
1672
+ <foo />
1673
+ <bar />
1674
+ </test>
1675
+ """
1676
+ return ElementTree.fromstring(metadata)
1677
+
1678
+ def metadataAbstractElementIllegalChildElementTest2():
1679
+ """
1680
+ Child elements, child elements are optional.
1681
+
1682
+ >>> doctestMetadataAbstractElementFunction(
1683
+ ... testMetadataAbstractElementIllegalChildElements,
1684
+ ... metadataAbstractElementIllegalChildElementTest2(),
1685
+ ... optionalChildElements=["foo", "bar"])
1686
+ []
1687
+ """
1688
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1689
+ <test>
1690
+ <foo />
1691
+ <bar />
1692
+ </test>
1693
+ """
1694
+ return ElementTree.fromstring(metadata)
1695
+
1696
+ # testMetadataAbstractElementKnownChildElements
1697
+
1698
+ def metadataAbstractElementRequiredChildElementTest1():
1699
+ """
1700
+ No child elements, child elements required. Report error.
1701
+
1702
+ >>> doctestMetadataAbstractElementFunction(
1703
+ ... testMetadataAbstractElementKnownChildElements,
1704
+ ... metadataAbstractElementRequiredChildElementTest1(),
1705
+ ... requiredChildElements=["foo"])
1706
+ ['ERROR']
1707
+ """
1708
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1709
+ <test>
1710
+ </test>
1711
+ """
1712
+ return ElementTree.fromstring(metadata)
1713
+
1714
+ def metadataAbstractElementRequiredChildElementTest2():
1715
+ """
1716
+ No child elements, child elements required. Report warning.
1717
+
1718
+ >>> doctestMetadataAbstractElementFunction(
1719
+ ... testMetadataAbstractElementKnownChildElements,
1720
+ ... metadataAbstractElementRequiredChildElementTest2(),
1721
+ ... requiredChildElements=["foo"], missingChildElementsAlertLevel="warning")
1722
+ ['WARNING']
1723
+ """
1724
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1725
+ <test>
1726
+ </test>
1727
+ """
1728
+ return ElementTree.fromstring(metadata)
1729
+
1730
+ def metadataAbstractElementRequiredChildElementTest3():
1731
+ """
1732
+ Child elements, child elements required.
1733
+
1734
+ >>> doctestMetadataAbstractElementFunction(
1735
+ ... testMetadataAbstractElementKnownChildElements,
1736
+ ... metadataAbstractElementRequiredChildElementTest3(),
1737
+ ... requiredChildElements=["foo"])
1738
+ []
1739
+ """
1740
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1741
+ <test>
1742
+ <foo />
1743
+ </test>
1744
+ """
1745
+ return ElementTree.fromstring(metadata)
1746
+
1747
+ def metadataAbstractElementRequiredChildElementTest4():
1748
+ """
1749
+ Child elements, unknown child elements, child elements required.
1750
+
1751
+ >>> doctestMetadataAbstractElementFunction(
1752
+ ... testMetadataAbstractElementKnownChildElements,
1753
+ ... metadataAbstractElementRequiredChildElementTest4(),
1754
+ ... requiredChildElements=["foo"])
1755
+ ['WARNING']
1756
+ """
1757
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1758
+ <test>
1759
+ <foo />
1760
+ <bar />
1761
+ </test>
1762
+ """
1763
+ return ElementTree.fromstring(metadata)
1764
+
1765
+ def metadataAbstractElementRequiredChildElementTest5():
1766
+ """
1767
+ Unknown child elements, child elements required.
1768
+
1769
+ >>> doctestMetadataAbstractElementFunction(
1770
+ ... testMetadataAbstractElementKnownChildElements,
1771
+ ... metadataAbstractElementRequiredChildElementTest5(),
1772
+ ... requiredChildElements=["foo"])
1773
+ ['WARNING', 'ERROR']
1774
+ """
1775
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1776
+ <test>
1777
+ <bar />
1778
+ </test>
1779
+ """
1780
+ return ElementTree.fromstring(metadata)
1781
+
1782
+ def metadataAbstractElementRequiredChildElementTest6():
1783
+ """
1784
+ Optional child elements, child elements required.
1785
+
1786
+ >>> doctestMetadataAbstractElementFunction(
1787
+ ... testMetadataAbstractElementKnownChildElements,
1788
+ ... metadataAbstractElementRequiredChildElementTest6(),
1789
+ ... requiredChildElements=["foo"],
1790
+ ... optionalChildElements=["bar"])
1791
+ []
1792
+ """
1793
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1794
+ <test>
1795
+ <foo />
1796
+ <bar />
1797
+ </test>
1798
+ """
1799
+ return ElementTree.fromstring(metadata)
1800
+
1801
+ # testMetadataAbstractElementOptionalChildElements
1802
+
1803
+ def metadataAbstractElementOptionalChildElementTest1():
1804
+ """
1805
+ No child elements. No optional child elements.
1806
+
1807
+ >>> doctestMetadataAbstractElementFunction(
1808
+ ... testMetadataAbstractElementOptionalChildElements,
1809
+ ... metadataAbstractElementOptionalChildElementTest1(),
1810
+ ... optionalChildElements=[])
1811
+ []
1812
+ """
1813
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1814
+ <test>
1815
+ </test>
1816
+ """
1817
+ return ElementTree.fromstring(metadata)
1818
+
1819
+ def metadataAbstractElementOptionalChildElementTest2():
1820
+ """
1821
+ No child elements. Optional child elements. Don't note.
1822
+
1823
+ >>> doctestMetadataAbstractElementFunction(
1824
+ ... testMetadataAbstractElementOptionalChildElements,
1825
+ ... metadataAbstractElementOptionalChildElementTest2(),
1826
+ ... optionalChildElements=["foo"],
1827
+ ... noteMissingChildElements=False)
1828
+ []
1829
+ """
1830
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1831
+ <test>
1832
+ </test>
1833
+ """
1834
+ return ElementTree.fromstring(metadata)
1835
+
1836
+ def metadataAbstractElementOptionalChildElementTest3():
1837
+ """
1838
+ No child elements. Optional child elements. Do note.
1839
+
1840
+ >>> doctestMetadataAbstractElementFunction(
1841
+ ... testMetadataAbstractElementOptionalChildElements,
1842
+ ... metadataAbstractElementOptionalChildElementTest3(),
1843
+ ... optionalChildElements=["foo"],
1844
+ ... noteMissingChildElements=True)
1845
+ ['NOTE']
1846
+ """
1847
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1848
+ <test>
1849
+ </test>
1850
+ """
1851
+ return ElementTree.fromstring(metadata)
1852
+
1853
+ def metadataAbstractElementOptionalChildElementTest4():
1854
+ """
1855
+ Child elements. Optional child elements.
1856
+
1857
+ >>> doctestMetadataAbstractElementFunction(
1858
+ ... testMetadataAbstractElementOptionalChildElements,
1859
+ ... metadataAbstractElementOptionalChildElementTest4(),
1860
+ ... optionalChildElements=["foo"])
1861
+ []
1862
+ """
1863
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1864
+ <test>
1865
+ <foo />
1866
+ </test>
1867
+ """
1868
+ return ElementTree.fromstring(metadata)
1869
+
1870
+
1871
+
1872
+ # testMetadataAbstractTextElements
1873
+
1874
+ def metadataAbstractElementTextTest1():
1875
+ """
1876
+ Valid.
1877
+
1878
+ >>> doctestMetadataAbstractElementFunction(
1879
+ ... testMetadataAbstractTextElements,
1880
+ ... metadataAbstractElementTextTest1())
1881
+ []
1882
+ """
1883
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1884
+ <test>
1885
+ <text>Foo.</text>
1886
+ <text lang="en">Foo.</text>
1887
+ <text lang="ko">Foo.</text>
1888
+ </test>
1889
+ """
1890
+ return ElementTree.fromstring(metadata)
1891
+
1892
+
1893
+ # testMetadataAbstractElementLanguages
1894
+
1895
+ def metadataAbstractElementTextLanguagesTest1():
1896
+ """
1897
+ Valid.
1898
+
1899
+ >>> doctestMetadataAbstractElementFunction(
1900
+ ... testMetadataAbstractElementLanguages,
1901
+ ... metadataAbstractElementTextLanguagesTest1())
1902
+ []
1903
+ """
1904
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1905
+ <test>
1906
+ <text>Foo.</text>
1907
+ <text lang="en">Foo.</text>
1908
+ <text lang="ko">Foo.</text>
1909
+ </test>
1910
+ """
1911
+ return ElementTree.fromstring(metadata)
1912
+
1913
+ def metadataAbstractElementTextLanguagesTest2():
1914
+ """
1915
+ Duplicate undefined.
1916
+
1917
+ >>> doctestMetadataAbstractElementFunction(
1918
+ ... testMetadataAbstractElementLanguages,
1919
+ ... metadataAbstractElementTextLanguagesTest2())
1920
+ ['ERROR']
1921
+ """
1922
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1923
+ <test>
1924
+ <text>Foo.</text>
1925
+ <text>Foo.</text>
1926
+ </test>
1927
+ """
1928
+ return ElementTree.fromstring(metadata)
1929
+
1930
+ def metadataAbstractElementTextLanguagesTest3():
1931
+ """
1932
+ Duplicate defined.
1933
+
1934
+ >>> doctestMetadataAbstractElementFunction(
1935
+ ... testMetadataAbstractElementLanguages,
1936
+ ... metadataAbstractElementTextLanguagesTest3())
1937
+ ['ERROR']
1938
+ """
1939
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1940
+ <test>
1941
+ <text lang="en">Foo.</text>
1942
+ <text lang="en">Foo.</text>
1943
+ </test>
1944
+ """
1945
+ return ElementTree.fromstring(metadata)
1946
+
1947
+
1948
+ # testMetadataStructureTopElement
1949
+
1950
+ def metadataTopElementTest1():
1951
+ """
1952
+ Valid metadata and version.
1953
+
1954
+ >>> doctestFunction1(testMetadataStructureTopElement, metadataTopElementTest1())
1955
+ (None, 'PASS')
1956
+ """
1957
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1958
+ <metadata version="1.0">
1959
+ </metadata>
1960
+ """
1961
+ return ElementTree.fromstring(metadata)
1962
+
1963
+ def metadataTopElementTest2():
1964
+ """
1965
+ Metadata not top element.
1966
+
1967
+ >>> doctestFunction1(testMetadataStructureTopElement, metadataTopElementTest2())
1968
+ (None, 'ERROR')
1969
+ """
1970
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1971
+ <notmetadata version="1.0">
1972
+ </notmetadata>
1973
+ """
1974
+ return ElementTree.fromstring(metadata)
1975
+
1976
+ def metadataTopElementTest3():
1977
+ """
1978
+ Unknown attribute.
1979
+
1980
+ >>> doctestFunction1(testMetadataStructureTopElement, metadataTopElementTest3())
1981
+ (None, 'ERROR')
1982
+ """
1983
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1984
+ <metadata version="1.0" something="ABC">
1985
+ </metadata>
1986
+ """
1987
+ return ElementTree.fromstring(metadata)
1988
+
1989
+ def metadataTopElementTest4():
1990
+ """
1991
+ Version is not 1.0
1992
+
1993
+ >>> doctestFunction1(testMetadataStructureTopElement, metadataTopElementTest4())
1994
+ (None, 'ERROR')
1995
+ """
1996
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
1997
+ <metadata version="2.0">
1998
+ </metadata>
1999
+ """
2000
+ return ElementTree.fromstring(metadata)
2001
+
2002
+ def metadataTopElementTest5():
2003
+ """
2004
+ Text in top element.
2005
+
2006
+ >>> doctestFunction1(testMetadataStructureTopElement, metadataTopElementTest5())
2007
+ (None, 'ERROR')
2008
+ """
2009
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2010
+ <metadata version="1.0">
2011
+ ABC
2012
+ </metadata>
2013
+ """
2014
+ return ElementTree.fromstring(metadata)
2015
+
2016
+
2017
+ # testMetadataChildElements
2018
+
2019
+ def metadataChildElementTest1():
2020
+ """
2021
+ Unknown element.
2022
+
2023
+ >>> doctestFunction1(testMetadataChildElements, metadataChildElementTest1())
2024
+ (None, 'WARNING')
2025
+ """
2026
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2027
+ <metadata version="1.0">
2028
+ <foo>bar</foo>
2029
+ </metadata>
2030
+ """
2031
+ return ElementTree.fromstring(metadata)
2032
+
2033
+
2034
+ # testMetadataElementExistence
2035
+
2036
+ def metadataMissingElementExistenceTest1():
2037
+ """
2038
+ All elements present.
2039
+
2040
+ >>> doctestFunction2(testMetadataElementExistence, metadataMissingElementExistenceTest1())
2041
+ []
2042
+ """
2043
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2044
+ <metadata version="1.0">
2045
+ <uniqueid />
2046
+ <vendor />
2047
+ <credits />
2048
+ <description />
2049
+ <license />
2050
+ <copyright />
2051
+ <trademark />
2052
+ <licensee />
2053
+ </metadata>
2054
+ """
2055
+ return ElementTree.fromstring(metadata)
2056
+
2057
+ def metadataMissingElementExistenceTest2():
2058
+ """
2059
+ Missing uniqueid.
2060
+
2061
+ >>> doctestFunction2(testMetadataElementExistence, metadataMissingElementExistenceTest2())
2062
+ ['WARNING']
2063
+ """
2064
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2065
+ <metadata version="1.0">
2066
+ <vendor />
2067
+ <credits />
2068
+ <description />
2069
+ <license />
2070
+ <copyright />
2071
+ <trademark />
2072
+ <licensee />
2073
+ </metadata>
2074
+ """
2075
+ return ElementTree.fromstring(metadata)
2076
+
2077
+ def metadataMissingElementExistenceTest3():
2078
+ """
2079
+ No elements present.
2080
+
2081
+ >>> doctestFunction2(testMetadataElementExistence, metadataMissingElementExistenceTest3())
2082
+ ['WARNING', 'NOTE', 'NOTE', 'NOTE', 'NOTE', 'NOTE', 'NOTE', 'NOTE']
2083
+ """
2084
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2085
+ <metadata version="1.0">
2086
+ </metadata>
2087
+ """
2088
+ return ElementTree.fromstring(metadata)
2089
+
2090
+
2091
+ # testMetadataDuplicateElements
2092
+
2093
+ def metadataMissingDuplicateElementsTest1():
2094
+ """
2095
+ No duplicates.
2096
+
2097
+ >>> doctestFunction2(testMetadataDuplicateElements, metadataMissingDuplicateElementsTest1())
2098
+ []
2099
+ """
2100
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2101
+ <metadata version="1.0">
2102
+ <uniqueid />
2103
+ <vendor />
2104
+ <credits />
2105
+ <description />
2106
+ <license />
2107
+ <copyright />
2108
+ <trademark />
2109
+ <licensee />
2110
+ </metadata>
2111
+ """
2112
+ return ElementTree.fromstring(metadata)
2113
+
2114
+ def metadataMissingDuplicateElementsTest2():
2115
+ """
2116
+ Two duplicates.
2117
+
2118
+ >>> doctestFunction2(testMetadataDuplicateElements, metadataMissingDuplicateElementsTest2())
2119
+ ['WARNING', 'WARNING']
2120
+ """
2121
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2122
+ <metadata version="1.0">
2123
+ <uniqueid />
2124
+ <uniqueid />
2125
+ <vendor />
2126
+ <credits />
2127
+ <description />
2128
+ <license />
2129
+ <copyright />
2130
+ <trademark />
2131
+ <licensee />
2132
+ <licensee />
2133
+ </metadata>
2134
+ """
2135
+ return ElementTree.fromstring(metadata)
2136
+
2137
+ # testMetadataUniqueid
2138
+
2139
+ def metadataUniqueidTest1():
2140
+ """
2141
+ Valid element.
2142
+
2143
+ >>> doctestFunction1(testMetadataUniqueid, metadataUniqueidTest1())
2144
+ (None, 'PASS')
2145
+ """
2146
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2147
+ <uniqueid id="com.example.foo.1234" />
2148
+ """
2149
+ return ElementTree.fromstring(metadata)
2150
+
2151
+
2152
+ # testMetadataVendor
2153
+
2154
+ def metadataVendorTest1():
2155
+ """
2156
+ Valid element.
2157
+
2158
+ >>> doctestFunction1(testMetadataVendor, metadataVendorTest1())
2159
+ (None, 'PASS')
2160
+ """
2161
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2162
+ <vendor name="Example" url="http://example.com" />
2163
+ """
2164
+ return ElementTree.fromstring(metadata)
2165
+
2166
+
2167
+ # testMetadataCredits
2168
+
2169
+ def metadataCreditsTest1():
2170
+ """
2171
+ Valid.
2172
+
2173
+ >>> doctestFunction1(testMetadataCredits, metadataCreditsTest1(), resultIndex=0)
2174
+ (None, 'PASS')
2175
+ """
2176
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2177
+ <credits>
2178
+ <credit name="Example" url="http://example.com" role="example.com"/>
2179
+ </credits>
2180
+ """
2181
+ return ElementTree.fromstring(metadata)
2182
+
2183
+ def metadataCreditsTest2():
2184
+ """
2185
+ No credit element.
2186
+
2187
+ >>> doctestFunction1(testMetadataCredits, metadataCreditsTest2(), resultIndex=0)
2188
+ (None, 'ERROR')
2189
+ """
2190
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2191
+ <credits>
2192
+ </credits>
2193
+ """
2194
+ return ElementTree.fromstring(metadata)
2195
+
2196
+
2197
+ # testMetadataCredit
2198
+
2199
+ def metadataCreditTest1():
2200
+ """
2201
+ Valid.
2202
+
2203
+ >>> doctestFunction1(testMetadataCredit, metadataCreditTest1())
2204
+ (None, 'PASS')
2205
+ """
2206
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2207
+ <credit name="Example" url="http://example.com" role="Test"/>
2208
+ """
2209
+ return ElementTree.fromstring(metadata)
2210
+
2211
+
2212
+ # testMetadataDescription
2213
+
2214
+ def metadataDescriptionTest1():
2215
+ """
2216
+ Valid.
2217
+
2218
+ >>> doctestFunction1(testMetadataDescription, metadataDescriptionTest1())
2219
+ (None, 'PASS')
2220
+ """
2221
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2222
+ <description>
2223
+ <text>Foo.</text>
2224
+ <text lang="en">Foo.</text>
2225
+ <text lang="ko">Foo.</text>
2226
+ </description>
2227
+ """
2228
+ return ElementTree.fromstring(metadata)
2229
+
2230
+
2231
+ # testMetadataLicense
2232
+
2233
+ def metadataLicenseTest1():
2234
+ """
2235
+ Valid.
2236
+
2237
+ >>> doctestFunction1(testMetadataLicense, metadataLicenseTest1())
2238
+ (None, 'PASS')
2239
+ """
2240
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2241
+ <license>
2242
+ <text>Foo.</text>
2243
+ <text lang="en">Foo.</text>
2244
+ <text lang="ko">Foo.</text>
2245
+ </license>
2246
+ """
2247
+ return ElementTree.fromstring(metadata)
2248
+
2249
+
2250
+ # testMetadataCopyright
2251
+
2252
+ def metadataCopyrightTest1():
2253
+ """
2254
+ Valid.
2255
+
2256
+ >>> doctestFunction1(testMetadataCopyright, metadataCopyrightTest1())
2257
+ (None, 'PASS')
2258
+ """
2259
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2260
+ <copyright>
2261
+ <text>Foo.</text>
2262
+ <text lang="en">Foo.</text>
2263
+ <text lang="ko">Foo.</text>
2264
+ </copyright>
2265
+ """
2266
+ return ElementTree.fromstring(metadata)
2267
+
2268
+
2269
+ # testMetadataTrademark
2270
+
2271
+ def metadataTrademarkTest1():
2272
+ """
2273
+ Valid.
2274
+
2275
+ >>> doctestFunction1(testMetadataTrademark, metadataTrademarkTest1())
2276
+ (None, 'PASS')
2277
+ """
2278
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2279
+ <trademark>
2280
+ <text>Foo.</text>
2281
+ <text lang="en">Foo.</text>
2282
+ <text lang="ko">Foo.</text>
2283
+ </trademark>
2284
+ """
2285
+ return ElementTree.fromstring(metadata)
2286
+
2287
+ # testMetadataLicensee
2288
+
2289
+ def metadataLicenseeTest1():
2290
+ """
2291
+ Valid element.
2292
+
2293
+ >>> doctestFunction1(testMetadataLicensee, metadataLicenseeTest1())
2294
+ (None, 'PASS')
2295
+ """
2296
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2297
+ <licensee name="Example" />
2298
+ """
2299
+ return ElementTree.fromstring(metadata)
2300
+
2301
+ # testMetadataExtension
2302
+
2303
+ def metadataExtensionTest1():
2304
+ """
2305
+ Valid.
2306
+
2307
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest1())
2308
+ (None, 'PASS')
2309
+ """
2310
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2311
+ <extension>
2312
+ <name>Extension Name</name>
2313
+ <item>
2314
+ <name>Foo Item Name</name>
2315
+ <value>Foo Item Value</value>
2316
+ </item>
2317
+ </extension>
2318
+ """
2319
+ return ElementTree.fromstring(metadata)
2320
+
2321
+ def metadataExtensionTest2():
2322
+ """
2323
+ Valid. No name.
2324
+
2325
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest2())
2326
+ (None, 'PASS')
2327
+ """
2328
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2329
+ <extension>
2330
+ <item>
2331
+ <name>Foo Item Name</name>
2332
+ <value>Foo Item Value</value>
2333
+ </item>
2334
+ </extension>
2335
+ """
2336
+ return ElementTree.fromstring(metadata)
2337
+
2338
+ def metadataExtensionTest3():
2339
+ """
2340
+ Invalid. No item.
2341
+
2342
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest3())
2343
+ (None, 'ERROR')
2344
+ """
2345
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2346
+ <extension>
2347
+ <name>Extension Name</name>
2348
+ </extension>
2349
+ """
2350
+ return ElementTree.fromstring(metadata)
2351
+
2352
+ def metadataExtensionTest4():
2353
+ """
2354
+ Invalid. No name in item.
2355
+
2356
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest4())
2357
+ (None, 'ERROR')
2358
+ """
2359
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2360
+ <extension>
2361
+ <name>Extension Name</name>
2362
+ <item>
2363
+ <value>Foo Item Value</value>
2364
+ </item>
2365
+ </extension>
2366
+ """
2367
+ return ElementTree.fromstring(metadata)
2368
+
2369
+ def metadataExtensionTest5():
2370
+ """
2371
+ Invalid. No value in item.
2372
+
2373
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest5())
2374
+ (None, 'ERROR')
2375
+ """
2376
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2377
+ <extension>
2378
+ <name>Extension Name</name>
2379
+ <item>
2380
+ <value>Foo Item Value</value>
2381
+ </item>
2382
+ </extension>
2383
+ """
2384
+ return ElementTree.fromstring(metadata)
2385
+
2386
+ def metadataExtensionTest6():
2387
+ """
2388
+ Valid. More than one name.
2389
+
2390
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest6())
2391
+ (None, 'PASS')
2392
+ """
2393
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2394
+ <extension>
2395
+ <name>Extension Name</name>
2396
+ <name lang="en">Extension Name</name>
2397
+ <name lang="ko">Extension Name</name>
2398
+ <item>
2399
+ <name>Foo Item Name</name>
2400
+ <value>Foo Item Value</value>
2401
+ </item>
2402
+ </extension>
2403
+ """
2404
+ return ElementTree.fromstring(metadata)
2405
+
2406
+ def metadataExtensionTest7():
2407
+ """
2408
+ Valid. More than one item.
2409
+
2410
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest7())
2411
+ (None, 'PASS')
2412
+ """
2413
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2414
+ <extension>
2415
+ <name>Extension Name</name>
2416
+ <item>
2417
+ <name>Foo Item Name</name>
2418
+ <value>Foo Item Value</value>
2419
+ </item>
2420
+ <item>
2421
+ <name>Bar Item Name</name>
2422
+ <value>Bar Item Value</value>
2423
+ </item>
2424
+ </extension>
2425
+ """
2426
+ return ElementTree.fromstring(metadata)
2427
+
2428
+ def metadataExtensionTest8():
2429
+ """
2430
+ Valid. More than one name in item.
2431
+
2432
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest8())
2433
+ (None, 'PASS')
2434
+ """
2435
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2436
+ <extension>
2437
+ <name>Extension Name</name>
2438
+ <item>
2439
+ <name>Foo Item Name</name>
2440
+ <name lang="en">Foo Item Name</name>
2441
+ <name lang="ko">Foo Item Name</name>
2442
+ <value>Foo Item Value</value>
2443
+ </item>
2444
+ </extension>
2445
+ """
2446
+ return ElementTree.fromstring(metadata)
2447
+
2448
+ def metadataExtensionTest9():
2449
+ """
2450
+ Valid. More than one value in item.
2451
+
2452
+ >>> doctestFunction1(testMetadataExtension, metadataExtensionTest9())
2453
+ (None, 'PASS')
2454
+ """
2455
+ metadata = """<?xml version="1.0" encoding="UTF-8"?>
2456
+ <extension>
2457
+ <name>Extension Name</name>
2458
+ <item>
2459
+ <name>Foo Item Name</name>
2460
+ <value>Foo Item Value</value>
2461
+ <value lang="en">Foo Item Value</value>
2462
+ <value lang="ko">Foo Item Value</value>
2463
+ </item>
2464
+ </extension>
2465
+ """
2466
+ return ElementTree.fromstring(metadata)
2467
+
2468
+ # testPrivateDataOffsetAndLength
2469
+
2470
+ def privateDataOffsetLengthTest1():
2471
+ """
2472
+ Valid empty offset and length.
2473
+
2474
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest1())
2475
+ (None, 'PASS')
2476
+ """
2477
+ header = defaultTestData(header=True)
2478
+ header["privOffset"] = 0
2479
+ header["privLength"] = 0
2480
+ return packTestHeader(header)
2481
+
2482
+ def privateDataOffsetLengthTest2():
2483
+ """
2484
+ privOffset = 0, privLength = 1.
2485
+
2486
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest2())
2487
+ (None, 'ERROR')
2488
+ """
2489
+ header = defaultTestData(header=True)
2490
+ header["privOffset"] = 0
2491
+ header["privLength"] = 1
2492
+ return packTestHeader(header)
2493
+
2494
+ def privateDataOffsetLengthTest3():
2495
+ """
2496
+ privOffset = 1, privLength = 3.
2497
+
2498
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest3())
2499
+ (None, 'ERROR')
2500
+ """
2501
+ header = defaultTestData(header=True)
2502
+ header["privOffset"] = 1
2503
+ header["privLength"] = 0
2504
+ return packTestHeader(header)
2505
+
2506
+ def privateDataOffsetLengthTest4():
2507
+ """
2508
+ Valid offset and length.
2509
+
2510
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest4())
2511
+ (None, 'PASS')
2512
+ """
2513
+ header = defaultTestData(header=True)
2514
+ header["privOffset"] = header["length"]
2515
+ header["privLength"] = 1
2516
+ header["length"] += 1
2517
+ return packTestHeader(header)
2518
+
2519
+ def privateDataOffsetLengthTest5():
2520
+ """
2521
+ Offset before end of the directory.
2522
+
2523
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest5())
2524
+ (None, 'ERROR')
2525
+ """
2526
+ header = defaultTestData(header=True)
2527
+ header["privOffset"] = header["length"] - 4
2528
+ header["privLength"] = 1
2529
+ header["length"] += 1
2530
+ return packTestHeader(header)
2531
+
2532
+ def privateDataOffsetLengthTest6():
2533
+ """
2534
+ Offset before end of the metadata.
2535
+
2536
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest6())
2537
+ (None, 'ERROR')
2538
+ """
2539
+ header = defaultTestData(header=True)
2540
+ header["metaOffset"] = header["length"]
2541
+ header["metaLength"] = 4
2542
+ header["privOffset"] = header["length"] + 2
2543
+ header["privLength"] = 4
2544
+ header["length"] += 8
2545
+ return packTestHeader(header)
2546
+
2547
+ def privateDataOffsetLengthTest7():
2548
+ """
2549
+ Offset after end of file.
2550
+
2551
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest7())
2552
+ (None, 'ERROR')
2553
+ """
2554
+ header = defaultTestData(header=True)
2555
+ header["privOffset"] = header["length"] + 2
2556
+ header["privLength"] = 1
2557
+ header["length"] += 1
2558
+ return packTestHeader(header)
2559
+
2560
+ def privateDataOffsetLengthTest8():
2561
+ """
2562
+ Offset + length greater than length of file.
2563
+
2564
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest8())
2565
+ (None, 'ERROR')
2566
+ """
2567
+ header = defaultTestData(header=True)
2568
+ header["privOffset"] = header["length"]
2569
+ header["privLength"] = 2
2570
+ header["length"] += 1
2571
+ return packTestHeader(header)
2572
+
2573
+ def privateDataOffsetLengthTest9():
2574
+ """
2575
+ Length longer than available length.
2576
+
2577
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest9())
2578
+ (None, 'ERROR')
2579
+ """
2580
+ header = defaultTestData(header=True)
2581
+ header["privOffset"] = header["length"]
2582
+ header["privLength"] = 2
2583
+ header["length"] += 1
2584
+ return packTestHeader(header)
2585
+
2586
+ def privateDataOffsetLengthTest10():
2587
+ """
2588
+ Offset doesn't begin immediately after last table.
2589
+
2590
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest10())
2591
+ (None, 'ERROR')
2592
+ """
2593
+ header = defaultTestData(header=True)
2594
+ header["privOffset"] = header["length"] + 4
2595
+ header["privLength"] = 1
2596
+ header["length"] += 2
2597
+ return packTestHeader(header)
2598
+
2599
+ def privateDataOffsetLengthTest11():
2600
+ """
2601
+ Offset doesn't begin on a four-byte boundary.
2602
+
2603
+ >>> doctestFunction1(testPrivateDataOffsetAndLength, privateDataOffsetLengthTest11())
2604
+ (None, 'ERROR')
2605
+ """
2606
+ header = defaultTestData(header=True)
2607
+ header["privOffset"] = header["length"] + 3
2608
+ header["privLength"] = 1
2609
+ header["length"] += 2
2610
+ return packTestHeader(header)
2611
+
2612
+ # testPrivateDataPadding
2613
+
2614
+ def privateDataPaddingTest1():
2615
+ """
2616
+ Valid padding: No padding needed.
2617
+
2618
+ >>> doctestFunction1(testPrivateDataPadding, privateDataPaddingTest1())
2619
+ (None, 'PASS')
2620
+ """
2621
+ header = defaultTestData(header=True)
2622
+ header["priveOffset"] = header["length"]
2623
+ header["privLength"] = 8
2624
+ header["length"] += 8
2625
+ return packTestHeader(header)
2626
+
2627
+ def privateDataPaddingTest2():
2628
+ """
2629
+ Valid padding: Padded with null.
2630
+
2631
+ >>> doctestFunction1(testPrivateDataPadding, privateDataPaddingTest2())
2632
+ (None, 'PASS')
2633
+ """
2634
+ header = defaultTestData(header=True)
2635
+ privateData = "\0" * 8
2636
+ header["privOffset"] = header["length"]
2637
+ header["privLength"] = 7
2638
+ header["length"] += 8
2639
+ return packTestHeader(header) + privateData
2640
+
2641
+ def privateDataPaddingTest3():
2642
+ """
2643
+ Invalid padding: Padded with something other than null.
2644
+
2645
+ >>> doctestFunction1(testPrivateDataPadding, privateDataPaddingTest3())
2646
+ (None, 'ERROR')
2647
+ """
2648
+ header = defaultTestData(header=True)
2649
+ privateData = "A" * 8
2650
+ header["privOffset"] = header["length"]
2651
+ header["privLength"] = 7
2652
+ header["length"] += 8
2653
+ return packTestHeader(header) + privateData
2654
+
2655
+ if __name__ == "__main__":
2656
+ import doctest
2657
+ doctest.testmod(verbose=False)