Skip to content

Commit

Permalink
Add test to check potential gc of dictionary data
Browse files Browse the repository at this point in the history
  • Loading branch information
Benjamin Wollmer committed Nov 27, 2024
1 parent a7683c5 commit 3ec114d
Showing 1 changed file with 31 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,16 @@
package com.aayushatharva.brotli4j.encoder;

import com.aayushatharva.brotli4j.Brotli4jLoader;
import com.aayushatharva.brotli4j.common.BrotliCommon;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
Expand Down Expand Up @@ -77,4 +80,32 @@ void encodeModeEnumValues() {
assertEquals(Encoder.Mode.TEXT, Encoder.Mode.of(Encoder.Mode.TEXT.ordinal()));
assertEquals(Encoder.Mode.GENERIC, Encoder.Mode.of(Encoder.Mode.GENERIC.ordinal()));
}


@Test
void ensureDictionaryDataRemainsAfterGC() throws IOException, InterruptedException {
// We hard code the compressed data, since the dictionary could also be collected just before our first compression
final byte[] expectedCompression = new byte[]{27, 43, 0, -8, 37, 0, -62, -104, -40, -63, 0};
final String dictionaryData = "This is some data to be used as a dictionary";
final byte[] rawBytes = dictionaryData.getBytes(); // Use dictionary also as data to keep it small
final PreparedDictionary dic = Encoder.prepareDictionary(BrotliCommon.makeNative(dictionaryData.getBytes()), 0);

// Create gc pressure to trigger potential collection of dictionary data
ArrayList<Integer> hashes = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
String obj = String.valueOf(Math.random());
hashes.add(obj.hashCode());
}
hashes = null;
System.gc();

try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BrotliOutputStream brotliOutputStream = new BrotliOutputStream(byteArrayOutputStream)) {
brotliOutputStream.attachDictionary(dic);
brotliOutputStream.write(rawBytes);
brotliOutputStream.close();
byteArrayOutputStream.close();
assertArrayEquals(expectedCompression, byteArrayOutputStream.toByteArray()); // Otherwise the GC already cleared the data
}
}
}

0 comments on commit 3ec114d

Please sign in to comment.