package kr.debop4j.core.compress; import com.carrotsearch.junitbenchmarks.BenchmarkOptions; import kr.debop4j.core.AbstractTest; import kr.debop4j.core.compress.spring.CompressorConfiguration; import kr.debop4j.core.io.spring.SerializerConfiguration; import kr.debop4j.core.tools.StringTool; import lombok.extern.slf4j.Slf4j; import org.fest.assertions.Assertions; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.Collection; import java.util.Map; import java.util.Random; /** * {@link ICompressor} TestCase * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 12. 9. 12 */ @Slf4j @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { CompressorConfiguration.class, SerializerConfiguration.class }) public class CompressorTest extends AbstractTest { private static final int TextCount = 10; protected static final String text = "동해물과 백두산이 마르고 닳도록, 하느님이 부우하사 우리나라 만세~ Hello world!"; protected static String plainText; private Collection<ICompressor> compressors; @Autowired ApplicationContext context; @Before public void before() { Assertions.assertThat(context).isNotNull(); Map<String, ICompressor> compressorMap = context.getBeansOfType(ICompressor.class); //= Springs.getBeansOfType(ICompressor.class); compressors = compressorMap.values(); Random random = new Random(System.currentTimeMillis()); StringBuilder builder = new StringBuilder(); byte[] bytes = new byte[1024]; for (int i = 0; i < TextCount; i++) { random.nextBytes(bytes); builder.append(StringTool.replicate(text, i)); builder.append(StringTool.getHexString(bytes)); builder.append(StringTool.replicate(StringTool.reverse(text), i)); } plainText = builder.toString(); } @BenchmarkOptions(concurrency = BenchmarkOptions.CONCURRENCY_AVAILABLE_CORES, benchmarkRounds = 100, warmupRounds = 1) @Test public void testCompressors() { for (ICompressor compressor : compressors) { try { compressAndDecompress(compressor); compressAndDecompressString(compressor); } catch (Exception e) { log.error("compressor=" + compressor, e); } } } private static void compressAndDecompress(ICompressor compressor) { if (log.isDebugEnabled()) log.debug("압축/복원 테스트를 시작합니다... compressor=[{}]", compressor); try { byte[] plainBytes = StringTool.getUtf8Bytes(plainText); byte[] compressed = compressor.compress(plainBytes); Assert.assertNotNull(compressed); byte[] decompressedBytes = compressor.decompress(compressed); Assert.assertNotNull(plainBytes); String decompressedText = StringTool.getUtf8String(decompressedBytes); Assert.assertNotNull(decompressedText); Assert.assertEquals(plainText, decompressedText); } catch (Exception e) { log.error("압축/복원 테스트 실패 compressor=" + compressor, e); } } private static void compressAndDecompressString(ICompressor compressor) { if (log.isDebugEnabled()) log.debug("압축/복원 테스트를 시작합니다... compressor=[{}]", compressor); try { String compressedBase64 = compressor.compressString(plainText); Assert.assertNotNull(compressedBase64); String decompressedText = compressor.decompressString(compressedBase64); Assert.assertNotNull(decompressedText); Assert.assertEquals(plainText, decompressedText); } catch (Exception e) { log.error("압축/복원 테스트 실패 compressor=" + compressor, e); } } }