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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +24 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +1156 -0
- data/.travis.yml +13 -0
- data/README.md +25 -4
- data/Rakefile +5 -0
- data/bin/rake +17 -0
- data/lib/woff.rb +8 -1
- data/lib/woff/builder.rb +66 -15
- data/lib/woff/file.rb +152 -0
- data/lib/woff/version.rb +1 -1
- data/requirements.txt +1 -0
- data/spec/builder_spec.rb +49 -0
- data/spec/data/font-with-no-metadata.woff +0 -0
- data/spec/spec_helper.rb +7 -0
- data/woff.gemspec +9 -2
- data/woffTools/Lib/woffTools/__init__.py +1176 -0
- data/woffTools/Lib/woffTools/test/__init__.py +0 -0
- data/woffTools/Lib/woffTools/test/test_validate.py +2657 -0
- data/woffTools/Lib/woffTools/tools/__init__.py +0 -0
- data/woffTools/Lib/woffTools/tools/css.py +292 -0
- data/woffTools/Lib/woffTools/tools/info.py +296 -0
- data/woffTools/Lib/woffTools/tools/proof.py +210 -0
- data/woffTools/Lib/woffTools/tools/support.py +417 -0
- data/woffTools/Lib/woffTools/tools/validate.py +2504 -0
- data/woffTools/License.txt +21 -0
- data/woffTools/README.txt +31 -0
- data/woffTools/setup.py +35 -0
- data/woffTools/woff-all +28 -0
- data/woffTools/woff-css +5 -0
- data/woffTools/woff-info +5 -0
- data/woffTools/woff-proof +5 -0
- data/woffTools/woff-validate +5 -0
- metadata +94 -9
- data/lib/woff/data.rb +0 -44
File without changes
|
@@ -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)
|