package voldemort.store.readonly; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Assert; import org.junit.Test; import voldemort.TestUtils; import voldemort.cluster.Cluster; import voldemort.cluster.Node; import voldemort.routing.ConsistentRoutingStrategy; import voldemort.routing.RoutingStrategy; import voldemort.server.VoldemortConfig; import voldemort.store.readonly.chunk.ChunkedFileSet; import voldemort.utils.ByteUtils; public class ChunkedFileSetTest { private static final int NODE_ID = 0; private RoutingStrategy getTempStrategy() { List<Node> nodes = new ArrayList<Node>(); for(int i = 0; i < 1; i++) { nodes.add(new Node(i, "localhost", 8080 + i, 6666 + i, 7000 + i, Arrays.asList(0))); } Cluster cluster = new Cluster("test", nodes); RoutingStrategy router = new ConsistentRoutingStrategy(cluster, 1); return router; } @Test public void testCollision() throws Exception { File fileDir = TestUtils.createTempDir(); File dataFile = new File(fileDir + File.separator + "0_0_0.data"); dataFile.deleteOnExit(); FileOutputStream fw = new FileOutputStream(dataFile.getAbsoluteFile()); DataOutputStream outputStream = new DataOutputStream(fw); /* * 4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2 * and the (different by two bits) * 4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2 * both have MD5 hash 008ee33a9d58b51cfeb425b0959121c9 */ String[] md5collision = { "4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2", "4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2" }; outputStream.writeShort(2); for(int i = 0; i < 2; i ++) { String input = md5collision[i]; byte[] hexInput = ByteUtils.fromHexString(input); outputStream.writeInt(hexInput.length); outputStream.writeInt(hexInput.length); outputStream.write(hexInput); outputStream.write(hexInput); } outputStream.close(); fw.close(); File indexFile = new File(fileDir + File.separator + "0_0_0.index"); indexFile.createNewFile(); indexFile.deleteOnExit(); ChunkedFileSet fileSet = new ChunkedFileSet(fileDir, getTempStrategy(), NODE_ID, VoldemortConfig.DEFAULT_RO_MAX_VALUE_BUFFER_ALLOCATION_SIZE); for(int i = 0; i < 2; i ++) { String input = md5collision[i]; byte[] hexInput = ByteUtils.fromHexString(input); byte[] hexValue = fileSet.readValue(hexInput, 0, 0); Assert.assertArrayEquals(hexInput, hexValue); } } }