| /* Copyright 2016 Google Inc. All Rights Reserved. |
| |
| Distributed under MIT license. |
| See file LICENSE for detail or copy at https://opensource.org/licenses/MIT |
| */ |
| |
| package org.brotli.dec; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.nio.ByteBuffer; |
| import java.nio.channels.FileChannel; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| /** |
| * Tests for {@link Dictionary}. |
| */ |
| @RunWith(JUnit4.class) |
| public class SetDictionaryTest { |
| |
| /** See {@link SynthTest} */ |
| private static final byte[] BASE_DICT_WORD = { |
| (byte) 0x1b, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80, |
| (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b, |
| (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e, |
| (byte) 0x1b, (byte) 0x41, (byte) 0x02 |
| }; |
| |
| /** See {@link SynthTest} */ |
| private static final byte[] ONE_COMMAND = { |
| (byte) 0x1b, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80, |
| (byte) 0xe3, (byte) 0xb4, (byte) 0x0d, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x5b, |
| (byte) 0x26, (byte) 0x31, (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0xe0, (byte) 0x4e, |
| (byte) 0x1b, (byte) 0x11, (byte) 0x86, (byte) 0x02 |
| }; |
| |
| @Test |
| public void testSetDictionary() throws IOException { |
| byte[] buffer = new byte[16]; |
| BrotliInputStream decoder; |
| |
| // No dictionary set; still decoding should succeed, if no dictionary entries are used. |
| decoder = new BrotliInputStream(new ByteArrayInputStream(ONE_COMMAND)); |
| assertEquals(3, decoder.read(buffer, 0, buffer.length)); |
| assertEquals("aaa", new String(buffer, 0, 3, "US-ASCII")); |
| decoder.close(); |
| |
| // Decoding of dictionary item must fail. |
| decoder = new BrotliInputStream(new ByteArrayInputStream(BASE_DICT_WORD)); |
| boolean decodingFailed = false; |
| try { |
| decoder.read(buffer, 0, buffer.length); |
| } catch (IOException ex) { |
| decodingFailed = true; |
| } |
| assertEquals(true, decodingFailed); |
| decoder.close(); |
| |
| // Load dictionary data. |
| FileChannel dictionaryChannel = |
| new FileInputStream(System.getProperty("RFC_DICTIONARY")).getChannel(); |
| ByteBuffer dictionary = dictionaryChannel.map(FileChannel.MapMode.READ_ONLY, 0, 122784).load(); |
| Dictionary.setData(dictionary); |
| |
| // Retry decoding of dictionary item. |
| decoder = new BrotliInputStream(new ByteArrayInputStream(BASE_DICT_WORD)); |
| assertEquals(4, decoder.read(buffer, 0, buffer.length)); |
| assertEquals("time", new String(buffer, 0, 4, "US-ASCII")); |
| decoder.close(); |
| } |
| } |