diff --git a/tests/bugfixes/redmine/issue_922_exiv2_pX_bug922_jpg_output b/tests/bugfixes/redmine/issue_922_exiv2_pX_bug922_jpg_output new file mode 100644 index 00000000..2d8b9e2f --- /dev/null +++ b/tests/bugfixes/redmine/issue_922_exiv2_pX_bug922_jpg_output @@ -0,0 +1,9 @@ + + + + + diff --git a/tests/bugfixes/redmine/test_issue_831.py b/tests/bugfixes/redmine/test_issue_831.py new file mode 100644 index 00000000..3369869b --- /dev/null +++ b/tests/bugfixes/redmine/test_issue_831.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, CopyFiles, path + + +@CopyFiles("$data_path/mini9.tif") +class UseNonIntrusiveWriting(metaclass=CaseMeta): + + url = "http://dev.exiv2.org/issues/831" + + filename = path("$data_path/mini9_copy.tif") + + commands = [ + """$exiv2 -v -Qd -M"set Exif.Image.ImageDescription Just GIMP" $filename""", + "$exiv2 -v -pa $filename" + ] + + stdout = [ + """File 1/1: $filename +Set Exif.Image.ImageDescription "Just GIMP" (Ascii) +""", + """File 1/1: $filename +Exif.Image.NewSubfileType Long 1 Primary image +Exif.Image.ImageWidth Short 1 9 +Exif.Image.ImageLength Short 1 9 +Exif.Image.BitsPerSample Short 3 8 8 8 +Exif.Image.Compression Short 1 Uncompressed +Exif.Image.PhotometricInterpretation Short 1 RGB +Exif.Image.DocumentName Ascii 24 /home/ahuggel/mini9.tif +Exif.Image.ImageDescription Ascii 10 Just GIMP +Exif.Image.StripOffsets Long 1 8 +Exif.Image.Orientation Short 1 top, left +Exif.Image.SamplesPerPixel Short 1 3 +Exif.Image.RowsPerStrip Short 1 64 +Exif.Image.StripByteCounts Long 1 243 +Exif.Image.XResolution Rational 1 72 +Exif.Image.YResolution Rational 1 72 +Exif.Image.PlanarConfiguration Short 1 1 +Exif.Image.ResolutionUnit Short 1 inch +""" + ] + stderr = [ + """Info: Write strategy: Non-intrusive +""", + """$filename: No IPTC data found in the file +$filename: No XMP data found in the file +""" + ] + retval = [0] * 2 diff --git a/tests/bugfixes/redmine/test_issue_836.py b/tests/bugfixes/redmine/test_issue_836.py new file mode 100644 index 00000000..dd4d6488 --- /dev/null +++ b/tests/bugfixes/redmine/test_issue_836.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +import unittest +import os.path +import shutil + +import system_tests + + +RESOURCE_FORK_EXISTS = os.path.exists( + os.path.join(system_tests.data_path, "exiv2-bug836.eps/..namedfork/rsrc") +) + + +@unittest.skipUnless(RESOURCE_FORK_EXISTS, + "File system does not support resource forks") +@system_tests.CopyFiles("$data_path/exiv2-bug836.eps") +class WriteMetadataDestroysResourceForkOnMacOSXForBigFiles( + metaclass=system_tests.CaseMeta): + + url = "http://dev.exiv2.org/issues/836" + + filename = "$data_path/exiv2-bug836_copy.eps" + filename_orig = "$data_path/exiv2-bug836.eps" + + commands = [ + "$exiv2 -M'set Exif.Photo.UserComment Test' $filename", + ] + + def setUp(self): + """ Copy the rsrc file into the the resource fork """ + shutil.copyfile( + self.filename_orig + ".rsrc", self.filename + "/..namedfork/rsrc" + ) + + def post_tests_hook(self): + """ Check that the resource fork didn't change """ + with open(self.filename_orig + ".rsrc", "rb") as rsrc_orig: + expected_resource_fork = rsrc_orig.read(-1) + + with open(self.filename + "/..namedfork/rsrc", "rb") as rsrc_f: + got_resource_fork = rsrc_f.read(-1) + + self.assertEqual(expected_resource_fork, got_resource_fork) + + stdout = [""] + stderr = [""] + retval = [0] diff --git a/tests/bugfixes/redmine/test_issue_841.py b/tests/bugfixes/redmine/test_issue_841.py new file mode 100644 index 00000000..492098d7 --- /dev/null +++ b/tests/bugfixes/redmine/test_issue_841.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, path + + +class ThrowOnInput(metaclass=CaseMeta): + + url = "http://dev.exiv2.org/issues/841" + + filename = path("$data_path/exiv2-bug841.png") + + commands = ["$exiv2 $filename"] + + stdout = [""] + stderr = [ + """$exiv2_exception_message $filename: +$kerFailedToReadImageData +""" + ] + retval = [1] diff --git a/tests/bugfixes/redmine/test_issue_855.py b/tests/bugfixes/redmine/test_issue_855.py new file mode 100644 index 00000000..7e399122 --- /dev/null +++ b/tests/bugfixes/redmine/test_issue_855.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, path + + +class DontSegfaultWhenAccessingFocalLength(metaclass=CaseMeta): + + url = "http://dev.exiv2.org/issues/855" + + filename = path("$data_path/exiv2-bug855.jpg") + + commands = ["$exiv2 -pa $filename"] + + stdout = ["""Exif.Image.NewSubfileType Long 1 Thumbnail/Preview image +Exif.Image.Make Ascii 20 PENTAX +Exif.Image.Model Ascii 20 PENTAX K-x +Exif.Image.Orientation Short 1 top, left +Exif.Image.Software Ascii 16 darktable 0.9.3 +Exif.Image.DateTime Ascii 20 2012:01:22 01:54:26 +Exif.Image.Artist Ascii 17 SEBASTIAN WAGNER +Exif.Image.Rating SLong 1 1 +Exif.Image.RatingPercent SLong 1 20 +Exif.Image.Copyright Ascii 33 CREATIVECOMMONS ATTRIBUTION CCBY +Exif.Image.ExifTag Long 1 666 +Exif.Photo.ExposureTime Rational 1 1/20 s +Exif.Photo.FNumber Rational 1 F5.6 +Exif.Photo.ExposureProgram Short 1 Landscape mode +Exif.Photo.ISOSpeedRatings Short 1 2500 +Exif.Photo.DateTimeOriginal Ascii 20 2012:01:22 01:54:26 +Exif.Photo.DateTimeDigitized Ascii 20 2012:01:22 01:54:26 +Exif.Photo.ExposureBiasValue SRational 1 0 EV +Exif.Photo.MeteringMode Short 1 Multi-segment +Exif.Photo.Flash Short 1 No, compulsory +Exif.Photo.FocalLength Rational 0 +Exif.Photo.ColorSpace Short 1 sRGB +Exif.Photo.SensingMethod Short 1 One-chip color area +Exif.Photo.CustomRendered Short 1 Normal process +Exif.Photo.ExposureMode Short 1 Auto +Exif.Photo.WhiteBalance Short 1 Auto +Exif.Photo.FocalLengthIn35mmFilm Short 1 82.0 mm +Exif.Photo.SceneCaptureType Short 1 Landscape +Exif.Photo.Contrast Short 1 Hard +Exif.Photo.Saturation Short 1 Normal +Exif.Photo.Sharpness Short 1 Hard +Exif.Photo.SubjectDistanceRange Short 1 Macro +Exif.Image.DNGVersion Byte 4 1 1 0 0 +Exif.Image.DNGBackwardVersion Byte 4 1 1 0 0 +Exif.Image.UniqueCameraModel Ascii 11 PENTAX K-x +Exif.Image.ColorMatrix1 SRational 9 71147/65536 -36788/65536 223/65536 -28867/65536 69463/65536 28977/65536 -1276/65536 2064/65536 45215/65536 +Exif.Image.ColorMatrix2 SRational 9 68429/65536 -21793/65536 -7522/65536 -36512/65536 89125/65536 14083/65536 -7905/65536 11496/65536 48817/65536 +Exif.Image.AnalogBalance Rational 3 1/1 1/1 1/1 +Exif.Image.AsShotNeutral Rational 3 256/352 256/264 256/762 +Exif.Image.BaselineExposure SRational 1 -31775/65536 +Exif.Image.BaselineNoise Rational 1 1/1 +Exif.Image.BaselineSharpness Rational 1 1/1 +Exif.Image.LinearResponseLimit Rational 1 1/1 +Exif.Image.CalibrationIlluminant1 Short 1 17 +Exif.Image.CalibrationIlluminant2 Short 1 21 +""" + ] + stderr = [ + """Error: Upper boundary of data for directory Photo, entry 0x920a is out of bounds: Offset = 0x000003dc, size = 8, exceeds buffer size by 6 Bytes; truncating the entry +""" + ] + retval = [0] diff --git a/tests/bugfixes/redmine/test_issue_876.py b/tests/bugfixes/redmine/test_issue_876.py new file mode 100644 index 00000000..e48d63a5 --- /dev/null +++ b/tests/bugfixes/redmine/test_issue_876.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, path + + +class Canon_EF_35mm_f_slash_2_IS_USM_Lens(metaclass=CaseMeta): + + url = "http://dev.exiv2.org/issues/876" + + filename = path("$data_path/exiv2-bug876.jpg") + + commands = ["$exiv2 -pt --grep Model $filename"] + + stdout = ["""Exif.Image.Model Ascii 13 Canon EOS 6D +Exif.Canon.ModelID Long 1 EOS 6D +Exif.Canon.LensModel Ascii 74 EF35mm f/2 IS USM +"""] + stderr = [""] + retval = [0] diff --git a/tests/bugfixes/redmine/test_issue_884.py b/tests/bugfixes/redmine/test_issue_884.py new file mode 100644 index 00000000..9c6c4350 --- /dev/null +++ b/tests/bugfixes/redmine/test_issue_884.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, path + + +class NewTamronAndPentaxLenses(metaclass=CaseMeta): + + url = "http://dev.exiv2.org/issues/884" + + filenames = [ + path("$data_path/exiv2-bug884{:s}.jpg".format(char)) + for char in ["a", "b", "c"] + ] + + commands = [ + "$exiv2 -pt --grep LensType " + fname for fname in filenames + ] + + stdout = [ + """Exif.Pentax.LensType Byte 2 Tamron SP AF 17-50mm F2.8 XR Di II +""", + """Exif.Pentax.LensType Byte 2 smc PENTAX-F 35-70mm F3.5-4.5 +""", + """Exif.Pentax.LensType Byte 2 PENTAX-F 28-80mm F3.5-4.5 +""" + ] + stderr = [""] * len(commands) + retval = [0] * len(commands) diff --git a/tests/bugfixes/redmine/test_issue_922.py b/tests/bugfixes/redmine/test_issue_922.py new file mode 100644 index 00000000..ac4799c0 --- /dev/null +++ b/tests/bugfixes/redmine/test_issue_922.py @@ -0,0 +1,228 @@ +# -*- coding: utf-8 -*- + +import itertools +import os.path + +from system_tests import CaseMeta, path + + +def read_file(filename): + with open(filename, 'r') as f: + return f.read() + + +class AddMinusPSOption(metaclass=CaseMeta): + + cls_location = os.path.dirname(__file__) + + url = "http://dev.exiv2.org/issues/922" + + bug_jpg_file = path("$data_path/exiv2-bug922.jpg") + IPTC_file = path("$data_path/iptc-psAPP13-wIPTCempty-psAPP13-wIPTC.jpg") + files = [ + path("$data_path/{!s}".format(img)) + for img in "exiv2-bug922.png exiv2-bug922.tif exiv2-bug922a.jpg".split() + ] + + png_bug_file = files[0] + tif_bug_file = files[1] + jpg_bug_file = files[2] + + commands = [ + "$exiv2 -pX $bug_jpg_file", + "$exiv2 -pX $IPTC_file", + ] + list( + itertools.chain.from_iterable([ + "$exiv2 -pX " + fname, + "$exiv2 -pS " + fname + ] for fname in files) + ) + + stdout = [ + read_file( + os.path.join(cls_location, "issue_922_exiv2_pX_bug922_jpg_output") + ), + """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +""", + """ + + + + + + this is the title + + + + + + + + + + + + + + + + + + + + + + + + + + +""", + """STRUCTURE OF PNG FILE: $png_bug_file + address | chunk | length | data | checksum + 8 | IHDR | 13 | ...@........ | 0x7f775da4 + 33 | zTXt | 8769 | Raw profile type exif..x...[r. | 0x4a89d860 + 8814 | zTXt | 270 | Raw profile type iptc..x.=QKn. | 0x29f9e2d3 + 9096 | iTXt | 2524 | XML:com.adobe.xmp.......]....UKqD2s.(.q....=x.l.\ | 0xc177fe83 + 54182 | IDAT | 8192 | .i.{!!B0...C!4.p..`D g`....... | 0x0e276268 + 62386 | IDAT | 8192 | .*.].4..Q..}(9...S0&.......T.9 | 0x297bb2db + 70590 | IDAT | 8192 | ..k...6....g.1..}.].&.H....... | 0x05f6f4ef + 78794 | IDAT | 8192 | .j..S.........z..!U.G0*.m%..09 | 0xe0946eb5 + 86998 | IDAT | 8192 | .....t.>!.....6^.<..;..?.$I..M | 0x843ecce0 + 95202 | IDAT | 8192 | W.&5.5J........FW`....3.N.9Pk; | 0x3a3dfeee + 103406 | IDAT | 8192 | .....d.z".`...v=g-..-.c8...Z.5 | 0x65d6df49 + 111610 | IDAT | 8192 | .."...o<&."....1M....1&. ..5.. | 0x700b8cde + 119814 | IDAT | 8192 | k........!..B*.....\*.(!..0.s. | 0x9b33b5b7 + 128018 | IDAT | 3346 | .Y.L@I$M.Z[.0A ...K#.t.0+.G(.j | 0x18044b20 + 131376 | IEND | 0 | | 0xae426082 +""", + """ + + + + + + this is a title + + + + + + + + + + + + + + + + + + + + + + + + + + +""", + """STRUCTURE OF TIFF FILE (MM): $tif_bug_file + address | tag | type | count | offset | value + 10 | 0x0100 ImageWidth | SHORT | 1 | | 40 + 22 | 0x0101 ImageLength | SHORT | 1 | | 470 + 34 | 0x0102 BitsPerSample | SHORT | 3 | 182 | 8 8 8 + 46 | 0x0103 Compression | SHORT | 1 | | 5 + 58 | 0x0106 PhotometricInterpretation | SHORT | 1 | | 2 + 70 | 0x0111 StripOffsets | LONG | 1 | | 2694 + 82 | 0x0112 Orientation | SHORT | 1 | | 6 + 94 | 0x0115 SamplesPerPixel | SHORT | 1 | | 3 + 106 | 0x0116 RowsPerStrip | SHORT | 1 | | 1092 + 118 | 0x0117 StripByteCounts | LONG | 1 | | 5086 + 130 | 0x011c PlanarConfiguration | SHORT | 1 | | 1 + 142 | 0x013d Predictor | SHORT | 1 | | 2 + 154 | 0x0153 SampleFormat | SHORT | 3 | 188 | 1 1 1 + 166 | 0x02bc XMLPacket | BYTE | 2500 | 194 | the rest drink soda the Brits are in the bar the Germans like beer """, + """STRUCTURE OF JPEG FILE: $jpg_bug_file + address | marker | length | data + 0 | 0xffd8 SOI + 2 | 0xffe1 APP1 | 14862 | Exif..II*...................... + 14866 | 0xffe1 APP1 | 2720 | http://ns.adobe.com/xap/1.0/.>> M.setUp() - calling MockCase.setUp() setUp_file_action with one_file setUp_file_action with two_file setUp_file_action with three_file + calling MockCase.setUp() The tearDown() function works accordingly: >>> M.tearDown() + calling MockCase.tearDown() tearDown_file_action with One_file tearDown_file_action with Two_file tearDown_file_action with Three_file - calling MockCase.tearDown() Please note the capitalized "file" names (this is due to setUp_file_action returning f.capitalized()) and that the old @@ -321,7 +321,6 @@ class FileDecoratorBase(object): """ def setUp(other): - old_setUp(other) if hasattr(other, self.FILE_LIST_NAME): raise TypeError( "{!s} already has an attribute with the name {!s} which " @@ -334,6 +333,7 @@ class FileDecoratorBase(object): getattr(other, self.FILE_LIST_NAME).append( self.setUp_file_action(expanded_fname) ) + old_setUp(other) return setUp def setUp_file_action(self, expanded_file_name): @@ -368,9 +368,9 @@ class FileDecoratorBase(object): """ def tearDown(other): + old_tearDown(other) for f in getattr(other, self.FILE_LIST_NAME): self.tearDown_file_action(f) - old_tearDown(other) return tearDown @@ -436,7 +436,7 @@ class CopyFiles(FileDecoratorBase): self._files and then calls the original tearDown method. This function will also complain if it is called without arguments or - without paranthesis, which is valid decorator syntax but is obviously a bug + without parenthesis, which is valid decorator syntax but is obviously a bug in this case as it can result in tests not being run without a warning. """