package kr.pe.kwonnam.hibernate4memcached.spymemcached;
import kr.pe.kwonnam.hibernate4memcached.util.OverridableReadOnlyProperties;
import kr.pe.kwonnam.hibernate4memcached.util.OverridableReadOnlyPropertiesImpl;
import net.spy.memcached.CachedData;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.Charset;
import java.util.Properties;
import static org.fest.assertions.api.Assertions.assertThat;
public class KryoTranscoderTest {
private Logger log = LoggerFactory.getLogger(KryoTranscoderTest.class);
@Rule
public ExpectedException expectedException = ExpectedException.none();
private KryoTranscoder kryoTranscoder;
private void givenKryoTranscoder(int compressionThreadHold) {
Properties properties = new Properties();
properties.setProperty(KryoTranscoder.COMPRESSION_THREASHOLD_PROPERTY_KEY, String.valueOf(compressionThreadHold));
kryoTranscoder = new KryoTranscoder();
kryoTranscoder.init(new OverridableReadOnlyPropertiesImpl(properties));
}
@Test
public void kryoEncodeDecode() throws Exception {
givenKryoTranscoder(LOREM_IPSUM_BYTES.length * 2);
CachedData cachedData = kryoTranscoder.encode(LOREM_IPSUM);
assertThat(cachedData.getFlags()).isEqualTo(KryoTranscoder.BASE_FLAG);
log.debug("normal data size : {} / original {}", cachedData.getData().length, LOREM_IPSUM_BYTES.length);
assertThat(cachedData.getData().length).isGreaterThan(LOREM_IPSUM_BYTES.length); //not compressed
Object decoded = kryoTranscoder.decode(cachedData);
assertThat(decoded).isEqualTo(LOREM_IPSUM);
}
@Test
public void kryoEncodeDecode_with_compression() throws Exception {
givenKryoTranscoder(LOREM_IPSUM_BYTES.length / 2);
CachedData cachedData = kryoTranscoder.encode(LOREM_IPSUM);
assertThat(cachedData.getFlags() & KryoTranscoder.COMPRESS_FLAG).isGreaterThanOrEqualTo(1);
log.debug("compressed data size : {} / original : {}", cachedData.getData().length, LOREM_IPSUM_BYTES.length);
assertThat(cachedData.getData().length).isLessThan(LOREM_IPSUM_BYTES.length);
Object decoded = kryoTranscoder.decode(cachedData);
assertThat(decoded).isEqualTo(LOREM_IPSUM);
}
private static final String LOREM_IPSUM = "\n" +
"\n" +
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pellentesque non mi et tempor." +
" Etiam venenatis orci in lectus consectetur rutrum. Aliquam erat volutpat. Donec non mauris massa. " +
"Mauris suscipit, arcu vitae ornare rutrum, odio odio ullamcorper lorem, at dignissim purus erat vel " +
"odio. Nullam quis mollis augue. Nullam sit amet rhoncus eros, at varius nisi. Vestibulum lobortis, " +
"justo vitae placerat vestibulum, leo felis condimentum ante, mattis aliquet felis velit in leo. " +
"Praesent at dolor in sapien laoreet vulputate vitae in justo. Duis gravida elit arcu, at tempor sem " +
"scelerisque ac.\n" +
"\n" +
"Nunc pharetra sollicitudin quam, id egestas nisi dignissim ac. Nam lorem orci, laoreet eget metus non," +
" tincidunt hendrerit justo. Quisque nisl enim, semper quis mauris sed, rhoncus cursus tortor. Fusce " +
"malesuada libero eu condimentum blandit. Nullam mollis lacus sit amet justo dictum, eu egestas lorem " +
"pretium. Maecenas varius est non arcu fermentum mattis. Donec et risus enim. Proin quis fermentum odio." +
" Nam luctus mi at risus pharetra fringilla. Suspendisse arcu nisl, fermentum vitae accumsan gravida, " +
"sodales in dolor. Sed ante tortor, convallis sed commodo non, molestie eu elit. Praesent diam quam, " +
"convallis sed rutrum ut, sagittis vitae nisl. Donec non dolor tincidunt est fermentum sagittis. " +
"Pellentesque quis quam arcu. Curabitur volutpat lacinia fermentum. Donec luctus, lacus nec gravida " +
"facilisis, urna velit faucibus turpis, id placerat quam nulla sed lectus.\n" +
"\n" +
"Praesent facilisis velit risus, sed facilisis metus convallis non. Nulla convallis mauris vitae" +
" urna hendrerit ultrices in quis augue. Nulla iaculis risus ligula, at congue lorem varius vitae. " +
"Nulla ut odio dapibus, cursus turpis in, vestibulum felis. Nunc cursus nisl id leo euismod placerat." +
" Aenean luctus tellus sit amet dolor dignissim, in lacinia libero blandit. Donec sem magna, volutpat " +
"ut odio tempus, sollicitudin hendrerit risus. Quisque fringilla nunc tristique tellus volutpat venenatis. " +
"Nulla at cursus erat, at bibendum purus. Aenean vitae lorem urna. Sed et libero quis mauris sodales porta. " +
"Duis euismod arcu nec velit aliquet volutpat. Donec id placerat nibh.\n" +
"\n" +
"Donec varius ipsum ut tellus gravida, ut feugiat risus commodo. Aliquam scelerisque, erat " +
"sollicitudin sagittis hendrerit, urna justo vehicula augue, nec lobortis dolor mauris eget est. " +
"Proin est elit, tristique a metus vel, sollicitudin iaculis justo. Duis sodales est quis pretium " +
"fringilla. Nunc commodo malesuada velit. Vestibulum a dictum diam. Duis tristique massa porttitor, " +
"pulvinar eros malesuada, venenatis nisl. Phasellus eu velit quis dui lacinia tempus.\n" +
"\n" +
"Praesent viverra magna at purus consequat convallis. Nulla semper cursus porttitor. Sed malesuada " +
"sollicitudin tortor. Curabitur interdum porttitor risus, at feugiat urna ultrices ac. Proin augue nulla, " +
"commodo blandit convallis at, placerat sed elit. Integer porta ipsum eu sollicitudin hendrerit. Duis in " +
"leo semper, euismod dolor quis, tincidunt felis. Class aptent taciti sociosqu ad litora torquent per " +
"conubia nostra, per inceptos himenaeos. Donec libero sem, tempus ut elit at, luctus laoreet lacus. Morbi" +
" quis porttitor eros. Sed congue lacus ipsum, id pulvinar felis malesuada ut. Donec nec turpis molestie, " +
"viverra lectus in, iaculis sapien.";
private static final byte[] LOREM_IPSUM_BYTES = LOREM_IPSUM.getBytes(Charset.forName("UTF-8"));
}