1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.client5.http.entity;
29
30 import java.io.ByteArrayInputStream;
31 import java.io.ByteArrayOutputStream;
32 import java.io.IOException;
33 import java.io.OutputStream;
34 import java.nio.charset.StandardCharsets;
35
36 import org.apache.hc.core5.http.ContentType;
37 import org.apache.hc.core5.http.HttpEntity;
38 import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
39 import org.apache.hc.core5.http.io.entity.EntityUtils;
40 import org.apache.hc.core5.http.io.entity.InputStreamEntity;
41 import org.apache.hc.core5.http.io.entity.StringEntity;
42 import org.junit.Assert;
43 import org.junit.Test;
44 import org.mockito.ArgumentMatchers;
45 import org.mockito.Mockito;
46
47 public class TestGZip {
48
49 @Test
50 public void testBasic() throws Exception {
51 final String s = "some kind of text";
52 final StringEntity e = new StringEntity(s, ContentType.TEXT_PLAIN, false);
53 final GzipCompressingEntity gzipe = new GzipCompressingEntity(e);
54 Assert.assertTrue(gzipe.isChunked());
55 Assert.assertEquals(-1, gzipe.getContentLength());
56 Assert.assertNotNull(gzipe.getContentEncoding());
57 Assert.assertEquals("gzip", gzipe.getContentEncoding());
58 }
59
60 @Test
61 public void testCompressionDecompression() throws Exception {
62 final StringEntity in = new StringEntity("some kind of text", ContentType.TEXT_PLAIN);
63 final GzipCompressingEntity gzipe = new GzipCompressingEntity(in);
64 final ByteArrayOutputStream buf = new ByteArrayOutputStream();
65 gzipe.writeTo(buf);
66 final ByteArrayEntity out = new ByteArrayEntity(buf.toByteArray(), ContentType.APPLICATION_OCTET_STREAM);
67 final GzipDecompressingEntity gunzipe = new GzipDecompressingEntity(out);
68 Assert.assertEquals("some kind of text", EntityUtils.toString(gunzipe, StandardCharsets.US_ASCII));
69 }
70
71 @Test
72 public void testCompressionIOExceptionLeavesOutputStreamOpen() throws Exception {
73 final HttpEntity in = Mockito.mock(HttpEntity.class);
74 Mockito.doThrow(new IOException("Ooopsie")).when(in).writeTo(ArgumentMatchers.<OutputStream>any());
75 final GzipCompressingEntity gzipe = new GzipCompressingEntity(in);
76 final OutputStream out = Mockito.mock(OutputStream.class);
77 try {
78 gzipe.writeTo(out);
79 } catch (final IOException ex) {
80 Mockito.verify(out, Mockito.never()).close();
81 }
82 }
83
84 @Test
85 public void testDecompressionWithMultipleGZipStream() throws Exception {
86 final int[] data = new int[] {
87 0x1f, 0x8b, 0x08, 0x08, 0x03, 0xf1, 0x55, 0x5a, 0x00, 0x03, 0x74, 0x65, 0x73, 0x74, 0x31, 0x00,
88 0x2b, 0x2e, 0x29, 0x4a, 0x4d, 0xcc, 0xd5, 0x35, 0xe4, 0x02, 0x00, 0x03, 0x61, 0xf0, 0x5f, 0x09,
89 0x00, 0x00, 0x00, 0x1f, 0x8b, 0x08, 0x08, 0x08, 0xf1, 0x55, 0x5a, 0x00, 0x03, 0x74, 0x65, 0x73,
90 0x74, 0x32, 0x00, 0x2b, 0x2e, 0x29, 0x4a, 0x4d, 0xcc, 0xd5, 0x35, 0xe2, 0x02, 0x00, 0xc0, 0x32,
91 0xdd, 0x74, 0x09, 0x00, 0x00, 0x00
92 };
93 final byte[] bytes = new byte[data.length];
94 for (int i = 0; i < data.length; i++) {
95 bytes[i] = (byte) (data[i] & 0xff);
96 }
97
98 try (final GzipDecompressingEntity entity = new GzipDecompressingEntity(new InputStreamEntity(new ByteArrayInputStream(bytes), ContentType.APPLICATION_OCTET_STREAM))) {
99 Assert.assertEquals("stream-1\nstream-2\n", EntityUtils.toString(entity, StandardCharsets.US_ASCII));
100 }
101 }
102
103 }