woff 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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)