| /* ==================================================================== |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ==================================================================== */ |
| |
| package org.apache.poi.hdgf.chunks; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import org.junit.Test; |
| |
| public final class TestChunks { |
| public static final byte[] data_a = new byte[] { 70, 0, 0, 0, |
| -1, -1, -1, -1, 2, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, |
| 0, 0, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, |
| 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, |
| 0, 36, 0, 0, 0, 1, 0, 84, 24, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, |
| 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| -124, 0, 0, 0, 2, 0, 85, 73, 0, 0, 0, 0, 0, 0, -56, 63, 73, 0, 0, 0, |
| 0, 0, 0, -64, 63, 63, 0, 0, 0, 0, 0, 0, -64, 63, 63, 0, 0, 0, 0, 0, 0, |
| -64, -65, 73, 0, 0, 0, 0, 0, 0, -16, 63, 73, 0, 0, 0, 0, 0, 0, -16, 63, |
| 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 63, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 1, -1, 3, 0, 0, 32, 0, 0, 0, 0, 0, -73, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, |
| 79, 0, 0, 0, 2, 0, 85, 32, 32, 64, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, |
| 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, |
| 8, 8, 65, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, |
| 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, -13, 15, 0, 0, 0, 0, |
| -56, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 2, 0, 85, 63, 0, 0, |
| 0, 0, 0, 0, -48, 63, 63, 0, 0, 0, 0, 0, 0, -48, 63, 63, 0, 0, 0, 0, 0, |
| 0, -48, 63, 63, 0, 0, 0, 0, 0, 0, -48, 63, 0, 0, 0, 0, 0, 0, -16, 63, |
| 0, 0, 0, 0, 0, 0, -16, 63, 1, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, |
| 0, 1, -1, 15, 7, 0, 0, 0, 0, 101, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 28, |
| 0, 0, 0, 1, 0, 84, 24, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 2, 0, 85, 5, 0, 0, |
| 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
| }; |
| public static final byte[] data_b = new byte[] { 70, 0, 0, 0, |
| -1, -1, -1, -1, 3, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, |
| 0, 0, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, |
| 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, |
| 0, 2, 0, 0, 0, 32, 0, 0, 0, 1, 0, 84, 24, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 1, 0, 0, 0, 0, 0, 0, 0, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, |
| 0, 0, 0, 2, 0, 85, 63, 0, 0, 0, 0, 0, 0, 33, 64, 63, 0, 0, 0, 0, 0, 0, |
| 38, 64, 63, 0, 0, 0, 0, 0, 0, -64, 63, 63, 0, 0, 0, 0, 0, 0, -64, -65, |
| 73, 0, 0, 0, 0, 0, 0, -16, 63, 73, 0, 0, 0, 0, 0, 0, -16, 63, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 3, |
| 0, 4, 32, 0, 0, 0, 0, 0, -56, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, |
| 0, 2, 0, 85, 63, 0, 0, 0, 0, 0, 0, -48, 63, 63, 0, 0, 0, 0, 0, 0, -48, |
| 63, 63, 0, 0, 0, 0, 0, 0, -48, 63, 63, 0, 0, 0, 0, 0, 0, -48, 63, 0, 0, |
| 0, 0, 0, 0, -16, 63, 0, 0, 0, 0, 0, 0, -16, 63, 1, 0, 1, 0, 0, 1, 1, 0, |
| 7, 0, 0, 0, 0, 0, 0, 0, 1, -1, 15, 7, 0, 0, 0, 0, 101, 0, 0, 0, 1, 0, 0, |
| 0, 1, 0, 0, 0, 28, 0, 0, 0, 1, 0, 84, 24, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 2, 0, |
| 85, 5, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, 0, 2, 0, 0, 0, |
| 0, 0, 0, 0, -122, 0, 0, 0, 1, 0, 80, 1, 0, 0, 0, 60, 0, 0, 0, 60, 0, 0, |
| 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0 |
| }; |
| |
| @Test |
| public void testChunkHeaderA() throws Exception { |
| ChunkHeader h = |
| ChunkHeader.createChunkHeader(11, data_a, 0); |
| |
| assertTrue(h instanceof ChunkHeaderV11); |
| ChunkHeaderV11 header = (ChunkHeaderV11)h; |
| |
| assertEquals(70, header.getType()); |
| assertEquals(-1, header.getId()); |
| assertEquals(2, header.getUnknown1()); |
| assertEquals(68, header.getLength()); |
| assertEquals(0, header.getUnknown2()); |
| assertEquals(0, header.getUnknown3()); |
| |
| assertTrue(header.hasTrailer()); |
| assertTrue(header.hasSeparator()); |
| } |
| |
| @Test |
| public void testChunkHeaderB() throws Exception { |
| ChunkHeader h = |
| ChunkHeader.createChunkHeader(11, data_b, 0); |
| |
| assertTrue(h instanceof ChunkHeaderV11); |
| ChunkHeaderV11 header = (ChunkHeaderV11)h; |
| |
| assertEquals(70, header.getType()); |
| assertEquals(-1, header.getId()); |
| assertEquals(3, header.getUnknown1()); |
| assertEquals(68, header.getLength()); |
| assertEquals(0, header.getUnknown2()); |
| assertEquals(0, header.getUnknown3()); |
| |
| assertTrue(header.hasTrailer()); |
| assertTrue(header.hasSeparator()); |
| } |
| |
| @Test |
| public void testOneChunk() throws Exception { |
| ChunkFactory cf = new ChunkFactory(11); |
| cf.createChunk(data_a, 0); |
| cf.createChunk(data_b, 0); |
| |
| Chunk chunk = cf.createChunk(data_a, 0); |
| assertNotNull(chunk.getHeader()); |
| assertNotNull(chunk.getTrailer()); |
| assertNotNull(chunk.getSeparator()); |
| |
| // Should be 19 + length + 8 + 4 big |
| assertEquals(68, chunk.getHeader().getLength()); |
| assertEquals(68+19+8+4, chunk.getOnDiskSize()); |
| |
| // Type is 70, or 0x46 |
| assertEquals(70, chunk.getHeader().getType()); |
| assertEquals(0x46, chunk.getHeader().getType()); |
| |
| // Should have two virtual chunk commands, a |
| // 10 (page sheet) and an 18 |
| assertEquals(2, chunk.commandDefinitions.length); |
| assertEquals(0, chunk.getCommands().length); |
| |
| assertEquals(10, chunk.commandDefinitions[0].getType()); |
| assertEquals(0, chunk.commandDefinitions[0].getOffset()); |
| assertEquals("PageSheet", chunk.commandDefinitions[0].getName()); |
| |
| assertEquals(18, chunk.commandDefinitions[1].getType()); |
| assertEquals(0, chunk.commandDefinitions[1].getOffset()); |
| assertEquals("0", chunk.commandDefinitions[1].getName()); |
| } |
| |
| @Test |
| public void testAnotherChunk() throws Exception { |
| ChunkFactory cf = new ChunkFactory(11); |
| |
| // Go for the 2nd chunk in the stream |
| int offset = 0; |
| Chunk chunk = cf.createChunk(data_b, offset); |
| offset += chunk.getOnDiskSize(); |
| chunk = cf.createChunk(data_b, offset); |
| |
| assertNotNull(chunk.getHeader()); |
| assertNotNull(chunk.getTrailer()); |
| assertNotNull(chunk.getSeparator()); |
| |
| // Should be 19 + length + 8 + 4 big |
| assertEquals(32, chunk.getHeader().getLength()); |
| assertEquals(32+19+8+4, chunk.getOnDiskSize()); |
| |
| // Type is 104, or 0x68 |
| assertEquals(104, chunk.getHeader().getType()); |
| assertEquals(0x68, chunk.getHeader().getType()); |
| |
| // Should have two virtual chunk commands, a |
| // 10 (Unknown) and an 18 |
| assertEquals(2, chunk.commandDefinitions.length); |
| assertEquals(0, chunk.getCommands().length); |
| |
| assertEquals(10, chunk.commandDefinitions[0].getType()); |
| assertEquals(0, chunk.commandDefinitions[0].getOffset()); |
| assertEquals("PropList", chunk.commandDefinitions[0].getName()); |
| |
| assertEquals(18, chunk.commandDefinitions[1].getType()); |
| assertEquals(0, chunk.commandDefinitions[1].getOffset()); |
| assertEquals("0", chunk.commandDefinitions[1].getName()); |
| } |
| |
| @Test |
| public void testManyChunks() throws Exception { |
| ChunkFactory cf = new ChunkFactory(11); |
| Chunk chunk; |
| int offset = 0; |
| |
| chunk = cf.createChunk(data_a, offset); |
| assertNotNull(chunk.getHeader()); |
| assertNotNull(chunk.getTrailer()); |
| assertNotNull(chunk.getSeparator()); |
| offset += chunk.getOnDiskSize(); |
| |
| chunk = cf.createChunk(data_a, offset); |
| assertNotNull(chunk.getHeader()); |
| assertNotNull(chunk.getTrailer()); |
| assertNotNull(chunk.getSeparator()); |
| offset += chunk.getOnDiskSize(); |
| |
| // Has a separator but no trailer |
| chunk = cf.createChunk(data_a, offset); |
| assertNotNull(chunk.getHeader()); |
| assertNull(chunk.getTrailer()); |
| assertNotNull(chunk.getSeparator()); |
| offset += chunk.getOnDiskSize(); |
| |
| chunk = cf.createChunk(data_a, offset); |
| assertNotNull(chunk.getHeader()); |
| assertNull(chunk.getTrailer()); |
| assertNotNull(chunk.getSeparator()); |
| offset += chunk.getOnDiskSize(); |
| |
| chunk = cf.createChunk(data_a, offset); |
| assertNotNull(chunk.getHeader()); |
| assertNull(chunk.getTrailer()); |
| assertNotNull(chunk.getSeparator()); |
| offset += chunk.getOnDiskSize(); |
| } |
| } |