18
18
19
19
import static androidx .test .core .app .ApplicationProvider .getApplicationContext ;
20
20
21
+ import static com .google .common .truth .Truth .assertThat ;
22
+
21
23
import static org .junit .Assert .assertEquals ;
22
24
import static org .junit .Assert .assertFalse ;
23
25
import static org .junit .Assert .assertNotNull ;
24
26
import static org .junit .Assert .assertNull ;
27
+ import static org .junit .Assert .assertThrows ;
25
28
import static org .junit .Assert .assertTrue ;
26
29
import static org .junit .Assert .fail ;
27
30
64
67
import java .io .OutputStream ;
65
68
import java .nio .ByteBuffer ;
66
69
import java .nio .charset .Charset ;
70
+ import java .util .Arrays ;
67
71
import java .util .HashMap ;
68
72
import java .util .Objects ;
69
73
import java .util .Random ;
@@ -88,6 +92,8 @@ public class ExifInterfaceTest {
88
92
private static final String JPEG_WITH_EXIF_BYTE_ORDER_II = "jpeg_with_exif_byte_order_ii.jpg" ;
89
93
private static final String JPEG_WITH_EXIF_BYTE_ORDER_MM = "jpeg_with_exif_byte_order_mm.jpg" ;
90
94
private static final String JPEG_WITH_EXIF_INVALID_OFFSET = "jpeg_with_exif_invalid_offset.jpg" ;
95
+ private static final String JPEG_WITH_EXIF_FULL_APP1_SEGMENT =
96
+ "jpeg_with_exif_full_app1_segment.jpg" ;
91
97
92
98
private static final String DNG_WITH_EXIF_WITH_XMP = "dng_with_exif_with_xmp.dng" ;
93
99
private static final String JPEG_WITH_EXIF_WITH_XMP = "jpeg_with_exif_with_xmp.jpg" ;
@@ -110,6 +116,7 @@ public class ExifInterfaceTest {
110
116
R .raw .jpeg_with_exif_byte_order_ii ,
111
117
R .raw .jpeg_with_exif_byte_order_mm ,
112
118
R .raw .jpeg_with_exif_invalid_offset ,
119
+ R .raw .jpeg_with_exif_full_app1_segment ,
113
120
R .raw .dng_with_exif_with_xmp ,
114
121
R .raw .jpeg_with_exif_with_xmp ,
115
122
R .raw .png_with_exif_byte_order_ii ,
@@ -126,6 +133,7 @@ public class ExifInterfaceTest {
126
133
JPEG_WITH_EXIF_BYTE_ORDER_II ,
127
134
JPEG_WITH_EXIF_BYTE_ORDER_MM ,
128
135
JPEG_WITH_EXIF_INVALID_OFFSET ,
136
+ JPEG_WITH_EXIF_FULL_APP1_SEGMENT ,
129
137
DNG_WITH_EXIF_WITH_XMP ,
130
138
JPEG_WITH_EXIF_WITH_XMP ,
131
139
PNG_WITH_EXIF_BYTE_ORDER_II ,
@@ -466,6 +474,28 @@ public void testJpegWithInvalidOffset() throws Throwable {
466
474
writeToFilesWithExif (JPEG_WITH_EXIF_INVALID_OFFSET , R .array .jpeg_with_exif_invalid_offset );
467
475
}
468
476
477
+ // https://issuetracker.google.com/263747161
478
+ @ Test
479
+ @ LargeTest
480
+ public void testJpegWithFullApp1Segment () throws Throwable {
481
+ File srcFile = getFileFromExternalDir (JPEG_WITH_EXIF_FULL_APP1_SEGMENT );
482
+ File imageFile = clone (srcFile );
483
+ ExifInterface exifInterface = new ExifInterface (imageFile .getAbsolutePath ());
484
+ // Add a really long string that makes the Exif data too large for the JPEG APP1 segment.
485
+ char [] longStringChars = new char [500 ];
486
+ Arrays .fill (longStringChars , 'a' );
487
+ String longString = new String (longStringChars );
488
+ exifInterface .setAttribute (ExifInterface .TAG_MAKE , longString );
489
+
490
+ IOException expected = assertThrows (IOException .class ,
491
+ exifInterface ::saveAttributes );
492
+ assertThat (expected )
493
+ .hasCauseThat ()
494
+ .hasMessageThat ()
495
+ .contains ("exceeds the max size of a JPEG APP1 segment" );
496
+ assertBitmapsEquivalent (srcFile , imageFile );
497
+ }
498
+
469
499
@ Test
470
500
@ LargeTest
471
501
public void testDngWithExifAndXmp () throws Throwable {
0 commit comments