1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.util;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.apache.hadoop.conf.Configuration;
25 import org.apache.hadoop.hbase.testclassification.SmallTests;
26 import org.apache.hadoop.hbase.io.compress.Compression;
27 import org.apache.hadoop.io.DataOutputBuffer;
28 import org.apache.hadoop.io.compress.CompressionCodec;
29 import org.apache.hadoop.io.compress.CompressionOutputStream;
30 import org.apache.hadoop.util.NativeCodeLoader;
31 import org.apache.hadoop.util.ReflectionUtils;
32 import org.junit.Test;
33 import org.junit.experimental.categories.Category;
34
35 import java.io.BufferedOutputStream;
36 import java.io.DataOutputStream;
37 import java.io.IOException;
38
39 import static org.junit.Assert.*;
40
41 @Category(SmallTests.class)
42 public class TestCompressionTest {
43 private static final Log LOG = LogFactory.getLog(TestCompressionTest.class);
44
45 @Test
46 public void testExceptionCaching() {
47
48 try {
49 CompressionTest.testCompression(Compression.Algorithm.LZO);
50 fail();
51 } catch (IOException e) {
52
53 assertNotNull(e.getCause());
54 }
55
56
57 try {
58 CompressionTest.testCompression(Compression.Algorithm.LZO);
59 fail();
60 } catch (IOException e) {
61
62 assertNull(e.getCause());
63 }
64
65 assertFalse(CompressionTest.testCompression("LZO"));
66 }
67
68 @Test
69 public void testTestCompression() {
70 assertTrue(CompressionTest.testCompression("NONE"));
71 assertTrue(CompressionTest.testCompression("GZ"));
72
73 if (NativeCodeLoader.isNativeCodeLoaded()) {
74 nativeCodecTest("LZO", "lzo2", "com.hadoop.compression.lzo.LzoCodec");
75 nativeCodecTest("LZ4", null, "org.apache.hadoop.io.compress.Lz4Codec");
76 nativeCodecTest("SNAPPY", "snappy", "org.apache.hadoop.io.compress.SnappyCodec");
77 nativeCodecTest("BZIP2", "bzip2", "org.apache.hadoop.io.compress.BZip2Codec");
78 nativeCodecTest("ZSTD", "zstd", "org.apache.hadoop.io.compress.ZStandardCodec");
79 } else {
80
81 LOG.debug("Native code not loaded");
82 assertFalse(CompressionTest.testCompression("LZO"));
83 assertFalse(CompressionTest.testCompression("LZ4"));
84 assertFalse(CompressionTest.testCompression("SNAPPY"));
85 assertFalse(CompressionTest.testCompression("BZIP2"));
86 assertFalse(CompressionTest.testCompression("ZSTD"));
87 }
88 }
89
90 private boolean isCompressionAvailable(String codecClassName) {
91 try {
92 Thread.currentThread().getContextClassLoader().loadClass(codecClassName);
93 return true;
94 } catch (Exception ex) {
95 return false;
96 }
97 }
98
99
100
101
102 private void nativeCodecTest(String codecName, String libName, String codecClassName) {
103 if (isCompressionAvailable(codecClassName)) {
104 try {
105 if (libName != null) {
106 System.loadLibrary(libName);
107 }
108
109 try {
110 Configuration conf = new Configuration();
111 CompressionCodec codec = (CompressionCodec)
112 ReflectionUtils.newInstance(conf.getClassByName(codecClassName), conf);
113
114 DataOutputBuffer compressedDataBuffer = new DataOutputBuffer();
115 CompressionOutputStream deflateFilter = codec.createOutputStream(compressedDataBuffer);
116
117 byte[] data = new byte[1024];
118 DataOutputStream deflateOut = new DataOutputStream(new BufferedOutputStream(deflateFilter));
119 deflateOut.write(data, 0, data.length);
120 deflateOut.flush();
121 deflateFilter.finish();
122
123
124 assertTrue(CompressionTest.testCompression(codecName));
125 } catch (UnsatisfiedLinkError e) {
126
127
128
129
130 LOG.debug("No JNI for codec '" + codecName + "' " + e.getMessage());
131 } catch (Exception e) {
132 LOG.error(codecName, e);
133 }
134 } catch (UnsatisfiedLinkError e) {
135
136 LOG.debug("Native lib not available: " + codecName);
137 assertFalse(CompressionTest.testCompression(codecName));
138 }
139 } else {
140
141 LOG.debug("Codec class not available: " + codecName);
142 assertFalse(CompressionTest.testCompression(codecName));
143 }
144 }
145 }
146