tikhomirov@711: /* tikhomirov@711: * Copyright (c) 2013 TMate Software Ltd tikhomirov@711: * tikhomirov@711: * This program is free software; you can redistribute it and/or modify tikhomirov@711: * it under the terms of the GNU General Public License as published by tikhomirov@711: * the Free Software Foundation; version 2 of the License. tikhomirov@711: * tikhomirov@711: * This program is distributed in the hope that it will be useful, tikhomirov@711: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@711: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@711: * GNU General Public License for more details. tikhomirov@711: * tikhomirov@711: * For information on how to redistribute this software under tikhomirov@711: * the terms of a license other than GNU General Public License tikhomirov@711: * contact TMate Software at support@hg4j.com tikhomirov@711: */ tikhomirov@711: package org.tmatesoft.hg.test; tikhomirov@711: tikhomirov@711: import java.io.File; tikhomirov@711: import java.nio.ByteBuffer; tikhomirov@711: tikhomirov@711: import org.junit.Assert; tikhomirov@711: import org.junit.Test; tikhomirov@711: import org.tmatesoft.hg.internal.ByteArrayChannel; tikhomirov@711: import org.tmatesoft.hg.internal.Filter; tikhomirov@711: import org.tmatesoft.hg.internal.Filter.Direction; tikhomirov@711: import org.tmatesoft.hg.internal.KeywordFilter; tikhomirov@711: import org.tmatesoft.hg.repo.HgLookup; tikhomirov@711: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@711: import org.tmatesoft.hg.repo.HgRepositoryFiles; tikhomirov@711: import org.tmatesoft.hg.util.Path; tikhomirov@711: tikhomirov@711: /** tikhomirov@711: * tikhomirov@711: * @author Artem Tikhomirov tikhomirov@711: * @author TMate Software Ltd. tikhomirov@711: */ tikhomirov@711: public class TestKeywordFilter { tikhomirov@711: tikhomirov@711: private HgRepository repo; tikhomirov@711: tikhomirov@711: @Test tikhomirov@711: public void testSmallBuffer() throws Exception { tikhomirov@711: initRepo(); tikhomirov@711: final Filter kwFilter = createFilter(Filter.Direction.ToRepo); tikhomirov@711: final byte[] in = "1\n2\n3\n".getBytes(); tikhomirov@711: ByteBuffer bb = kwFilter.filter(ByteBuffer.wrap(in)); tikhomirov@711: final byte[] out = new byte[bb.remaining()]; tikhomirov@711: bb.get(out); tikhomirov@711: Assert.assertArrayEquals(in, out); tikhomirov@711: } tikhomirov@711: tikhomirov@711: @Test tikhomirov@711: public void testKeywordDrop() throws Exception { tikhomirov@711: initRepo(); tikhomirov@711: final Filter kwFilter = createFilter(Filter.Direction.ToRepo); tikhomirov@711: final byte[] in = "1\n$Revision: cf200271439a7ec256151b30bc4360b21db3542e$\n3\n".getBytes(); tikhomirov@711: ByteBuffer bb = kwFilter.filter(ByteBuffer.wrap(in)); tikhomirov@711: final byte[] out = new byte[bb.remaining()]; tikhomirov@711: bb.get(out); tikhomirov@711: Assert.assertArrayEquals("1\n$Revision$\n3\n".getBytes(), out); tikhomirov@711: } tikhomirov@711: tikhomirov@711: @Test tikhomirov@711: public void testKeywordExpansion() throws Exception { tikhomirov@711: Assert.fail("Need real repo with changeset to check kw expansion"); tikhomirov@711: } tikhomirov@711: tikhomirov@711: /** tikhomirov@711: * what if keyword is split between two input buffers tikhomirov@711: */ tikhomirov@711: @Test tikhomirov@711: public void testKeywordSplitInBuffer() throws Exception { tikhomirov@711: initRepo(); tikhomirov@711: final byte[] in1 = "1\n$Id:whatever".getBytes(); tikhomirov@711: final byte[] in2 = " continues here$\n3\n".getBytes(); tikhomirov@711: ByteArrayChannel out = new ByteArrayChannel(); tikhomirov@711: final Filter kwFilter = createFilter(Filter.Direction.ToRepo); tikhomirov@711: out.write(kwFilter.filter(ByteBuffer.wrap(in1))); tikhomirov@711: out.write(kwFilter.filter(ByteBuffer.wrap(in2))); tikhomirov@711: Assert.assertEquals("1\n$Id$\n3\n", new String(out.toArray())); tikhomirov@711: // Same as above, to extreme - only $ in the first buffer tikhomirov@711: final Filter kwFilter2 = createFilter(Filter.Direction.ToRepo); tikhomirov@711: out = new ByteArrayChannel(); tikhomirov@711: out.write(kwFilter2.filter(ByteBuffer.wrap("1\n$".getBytes()))); tikhomirov@711: out.write(kwFilter2.filter(ByteBuffer.wrap("Id:whatever continues here$\n3\n".getBytes()))); tikhomirov@711: Assert.assertEquals("1\n$Id$\n3\n", new String(out.toArray())); tikhomirov@711: } tikhomirov@711: tikhomirov@711: /** tikhomirov@711: * what if input contains smth similar to keyword but unless the second part of the buffer tikhomirov@711: * comes in, it's impossible to tell tikhomirov@711: */ tikhomirov@711: @Test tikhomirov@711: public void testIncompleteKeyword() throws Exception { tikhomirov@711: initRepo(); tikhomirov@711: final byte[] in1 = "1\n$Id:whatever".getBytes(); tikhomirov@711: final byte[] in2 = " id doesn't close here\n3\n".getBytes(); tikhomirov@711: ByteArrayChannel out = new ByteArrayChannel(); tikhomirov@711: final Filter kwFilter = createFilter(Filter.Direction.ToRepo); tikhomirov@711: out.write(kwFilter.filter(ByteBuffer.wrap(in1))); tikhomirov@711: out.write(kwFilter.filter(ByteBuffer.wrap(in2))); tikhomirov@711: byte[] expected = new byte[in1.length + in2.length]; tikhomirov@711: System.arraycopy(in1, 0, expected, 0, in1.length); tikhomirov@711: System.arraycopy(in2, 0, expected, in1.length, in2.length); tikhomirov@711: Assert.assertEquals(new String(expected), new String(out.toArray())); tikhomirov@711: } tikhomirov@711: tikhomirov@711: @Test tikhomirov@711: public void testIncompleteKeywordAtEOF() throws Exception { tikhomirov@711: initRepo(); tikhomirov@711: final byte[] in = "1\n$Id:whatever\n".getBytes(); tikhomirov@711: final Filter kwFilter = createFilter(Filter.Direction.ToRepo); tikhomirov@711: ByteBuffer outBuf = kwFilter.filter(ByteBuffer.wrap(in)); tikhomirov@711: byte[] out = new byte[outBuf.remaining()]; tikhomirov@711: outBuf.get(out); tikhomirov@711: Assert.assertEquals(new String(in), new String(out)); tikhomirov@711: // tikhomirov@711: // incomplete $kw is stripped of in case of EOF tikhomirov@711: final Filter kwFilter2 = createFilter(Filter.Direction.ToRepo); tikhomirov@711: outBuf = kwFilter2.filter(ByteBuffer.wrap("1\n$Id:whatever".getBytes())); tikhomirov@711: out = new byte[outBuf.remaining()]; tikhomirov@711: outBuf.get(out); tikhomirov@711: Assert.assertEquals("1\n", new String(out)); tikhomirov@711: } tikhomirov@711: tikhomirov@711: private Filter createFilter(Direction dir) { tikhomirov@711: final KeywordFilter.Factory kwFactory = new KeywordFilter.Factory(); tikhomirov@711: kwFactory.initialize(repo); tikhomirov@711: return kwFactory.create(Path.create("a/b"), new Filter.Options(dir)); tikhomirov@711: } tikhomirov@711: tikhomirov@711: private HgRepository initRepo() throws Exception { tikhomirov@711: final File repoLoc = RepoUtils.initEmptyTempRepo("test-kw-filter"); tikhomirov@711: final File hgrc = new File(repoLoc, HgRepositoryFiles.RepoConfig.getPath()); tikhomirov@711: RepoUtils.createFile(hgrc, "[extensions]\nkeyword=\n\n[keyword]\n**.*=\n"); tikhomirov@711: repo = new HgLookup().detect(repoLoc); tikhomirov@711: return repo; tikhomirov@711: } tikhomirov@711: }