1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.imaging.formats.jpeg.exif;
19
20 import static org.junit.jupiter.api.Assertions.assertTrue;
21
22 import java.io.File;
23 import java.util.stream.Stream;
24
25 import org.apache.commons.imaging.common.bytesource.ByteSourceFile;
26 import org.apache.commons.imaging.examples.WriteExifMetadataExample;
27 import org.apache.commons.imaging.formats.jpeg.JpegImageParser;
28 import org.apache.commons.imaging.formats.tiff.TiffField;
29 import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
30 import org.apache.commons.imaging.internal.Debug;
31 import org.junit.jupiter.params.ParameterizedTest;
32 import org.junit.jupiter.params.provider.MethodSource;
33
34 public class WriteExifMetadataExampleTest extends ExifBaseTest {
35
36 public static Stream<File> data() throws Exception {
37 return getJpegImages().stream();
38 }
39
40
41
42
43
44 @ParameterizedTest
45 @MethodSource("data")
46 public void testOddOffsets(final File imageFile) throws Exception {
47 Debug.debug("imageFile", imageFile.getAbsoluteFile());
48
49 final File tempFile = File.createTempFile("test", ".jpg");
50 Debug.debug("tempFile", tempFile.getAbsoluteFile());
51
52 try {
53 final boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
54 if (ignoreImageData) {
55 return;
56 }
57 new WriteExifMetadataExample().changeExifMetadata(imageFile, tempFile);
58 final JpegImageParser parser = new JpegImageParser();
59 final ByteSourceFile byteSource = new ByteSourceFile(tempFile);
60 final TiffImageMetadata tiff = parser.getExifMetadata(byteSource, null);
61 for (final TiffField tiffField : tiff.getAllFields()) {
62 if (!tiffField.isLocalValue()) {
63 final boolean isOdd = (tiffField.getOffset() & 1L) == 0;
64 assertTrue(isOdd);
65 }
66 }
67 } catch (final ExifRewriter.ExifOverflowException e) {
68 Debug.debug("Ignoring unavoidable ExifOverflowException: " + e.getMessage());
69 Debug.debug("Error image: " + imageFile.getAbsoluteFile());
70 }
71 }
72
73 }