/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2003 The Apache Software Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowledgement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgement may appear in the software itself,
* if and wherever such third-party acknowledgements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.jrcs.rcs;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.commons.jrcs.util.ToString;
import org.apache.commons.jrcs.diff.Diff;
import org.apache.commons.jrcs.diff.DiffException;
public class ArchiveTest extends TestCase
{
public ArchiveTest(String testName)
{
super(testName);
}
public static Test suite()
{
return new TestSuite(ArchiveTest.class);
}
Object[] v1_1 = new String[]{
"[1] one",
"[2] two",
"[3] three",
"[4] four",
"[5] five",
"[6] six",
};
Object[] v1_2 = new String[]{
"[1] one",
"[2] two",
"[3] three",
"[3.1]", // inserted this
"[4] four",
"[5] five"
// deleted [6]
};
String user = System.getProperty("user.name");
// WARNING: there apparently uneeded string concatenations
// are there to prevent CVS from mangling our test data.
Object[] v1_2_with_keywords = new String[] {
"",
"[3] three $" + "Source: trash #3$",
"[4] four $" + "RCSfile: trash #4$",
"[5] five $" + "Revision: trash # 5 $",
"[7] seven $" + "Author: trash #7 $",
"[8] eight $" + "State: trash 8 $",
"[9] nine $Locker: $",
"[10] ten $" + "RCSfile: trash #10 $ "
+ "$" + "Revision: trash #10 $ "
+ "$" + "Author: trash $",
""
};
Object[] v1_2_with_expanded_keywords = new String[] {
"",
"[3] three $" + "Source: /a/test/path/test_file,v $",
"[4] four $" + "RCSfile: test_file,v $",
"[5] five $" + "Revision: 1.2 $",
"[7] seven $" + "Author: " + user + " $",
"[8] eight $" + "State: Exp $",
"[9] nine $Locker: $",
"[10] ten $" + "RCSfile: test_file,v $ "
+ "$" + "Revision: 1.2 $ "
+ "$" + "Author: " + user + " $",
""
};
Object[] v1_3 = new String[]{
"[1] one changed",
"[2] two",
"[3] three",
"[3.1]",
"[4] four",
"[5] five"
};
Object[] v1_20 = new String[]{
"[1:1.20] one changed",
"[3] three",
"[3.1]",
"[5:1.20] five"
};
Object[] v1_2_1_1 = new String[]{
"[1] one",
"[2] two",
"[2.1]",
"[3] three",
"[3.1]",
"[4] four changed",
"[5] five",
"[5.1]"
};
Object[] v1_2_1_2 = new String[]{
"[1:1.2.1.1] one",
"[2.1]",
"[3] three",
"[3.1]",
"[4] four changed",
"[5:1.2.1.1] five",
"[5.1]"
};
Object[] v1_2_8_2 = new String[]{
"[1:1.2.8.1] one",
"[2.1]",
"[3] three",
"[3.1]",
"[4] four changed",
"[5:1.2.8.1] five",
"[5.1]"
};
Object[] v1_2_8_4 = new String[]{
"[1:1.2.8.1] one",
"[2.1]",
"[3.1:1.2.8.2]",
"[4] four changed",
"[5:1.2.8.1] five",
"[5.1]"
};
Object[] v1_2_8_5 = new String[]{
"[1:1.2.8.5] one"
};
Archive archive;
public void setUp()
{
archive = new Archive(v1_1, "A simple test file");
archive.setFileName("/a/test/path/test_file,v");
}
public void testEmptyArchive()
{
try
{
Object[] rev = new Archive().getRevision();
if (rev != null)
fail("empty archive, exception should be thrown");
}
catch (Exception e)
{
}
}
public void testAdd1_1()
throws DiffException,
RCSException
{
Object[] rev = archive.getRevision();
assertTrue(Diff.compare(v1_1, rev));
assertNull(archive.addRevision(v1_1, "should not be added"));
assertEquals(new Version("1.1"), archive.getRevisionVersion());
assertEquals(new Version("1.1"), archive.getRevisionVersion("1."));
assertNull(archive.getRevisionVersion("2"));
assertNull(archive.getRevisionVersion("1.2.1"));
Node[] log = archive.changeLog();
assertNotNull("log is null", log);
assertEquals( 1, log.length);
assertEquals("1.1", log[0].version.toString());
}
public void testAdd1_2()
throws DiffException,
RCSException
{
testAdd1_1();
archive.addRevision(v1_2, "Added 3.1, deleted 6");
Object[] rev = archive.getRevision();
assertEquals("1.2", archive.head.version.toString());
assertEquals(ToString.arrayToString(v1_2), ToString.arrayToString(rev));
assertNull(archive.addRevision(v1_2, "should not be added"));
assertEquals(new Version("1.2"), archive.getRevisionVersion());
assertEquals(new Version("1.2"), archive.getRevisionVersion("1."));
assertNull(archive.getRevisionVersion("2"));
assertNull(archive.getRevisionVersion("1.2.1"));
Node[] log = archive.changeLog();
assertNotNull("log is null", log);
assertEquals( 2, log.length);
assertEquals("1.1", log[0].version.toString());
assertEquals("1.2", log[1].version.toString());
}
public void testAdd1_2_with_keywords()
throws DiffException,
RCSException
{
testAdd1_1();
archive.addRevision(v1_2_with_keywords, "Added revision with keywords");
Object[] rev = archive.getRevision();
assertEquals("1.2", archive.head.version.toString());
assertEquals(ToString.arrayToString(v1_2_with_expanded_keywords), ToString.arrayToString(rev));
assertNull(archive.addRevision(v1_2_with_expanded_keywords, "should not be added"));
assertEquals(new Version("1.2"), archive.getRevisionVersion());
assertEquals(new Version("1.2"), archive.getRevisionVersion("1."));
assertNull(archive.getRevisionVersion("2"));
assertNull(archive.getRevisionVersion("1.2.1"));
}
public void testAdd1_3()
throws DiffException,
RCSException
{
testAdd1_2();
archive.addRevision(v1_3, "Changed 1");
Object[] rev = archive.getRevision();
assertTrue(Diff.compare(v1_3, rev));
assertNull(archive.addRevision(v1_3, "should not be added"));
assertEquals(new Version("1.3"), archive.getRevisionVersion());
assertEquals(new Version("1.3"), archive.getRevisionVersion("1"));
assertNull(archive.getRevisionVersion("2"));
assertNull(archive.getRevisionVersion("1.2.1"));
Node[] log = archive.changeLog();
assertNotNull("log is null", log);
assertEquals( 3, log.length);
assertEquals("1.1", log[0].version.toString());
assertEquals("1.2", log[1].version.toString());
assertEquals("1.3", log[2].version.toString());
}
public void testAdd1_2_1()
throws DiffException,
RCSException
{
testAdd1_3();
archive.addRevision(v1_2_1_1, "1.2.1", "Added 2.1, changed 4, added 5.1");
String filestr = archive.toString();
String[] file = (String[]) Diff.stringToArray(filestr);
for(int i = 0; i < sampleFile.length && i < file.length; i++)
{
if(!sampleFile[i].startsWith("date"))
assertEquals("line " + i, sampleFile[i], file[i]);
}
assertEquals("file size", sampleFile.length, file.length);
Object[] rev = archive.getRevision("1.2.1");
assertTrue("diffs equal", Diff.compare(v1_2_1_1, rev));
assertNull("should not be added", archive.addRevision(v1_2_1_1, "1.2.1", "should not be added"));
assertEquals("dot", new Version("1.2.1.1"), archive.getRevisionVersion("1.2."));
assertEquals("zero", new Version("1.2.1.1"), archive.getRevisionVersion("1.2.0"));
assertEquals(new Version("1.2.1.1"), archive.getRevisionVersion("1.2.1"));
assertEquals(new Version("1.2.1.1"), archive.getRevisionVersion("1.2.1"));
assertNull(archive.getRevisionVersion("2"));
assertNull(archive.getRevisionVersion("1.3.1"));
assertNull(archive.getRevisionVersion("1.2.1.2"));
assertNull(archive.getRevisionVersion("1.2.2"));
Node[] log = archive.changeLog(new Version("1.2.1"));
assertNotNull("log is null", log);
assertEquals( 3, log.length);
assertEquals("1.1", log[0].version.toString());
assertEquals("1.2", log[1].version.toString());
assertEquals("1.2.1.1", log[2].version.toString());
log = archive.changeLog(new Version("1.2.1"), new Version("1.2"));
assertNotNull("log is null", log);
assertEquals( 2, log.length);
assertEquals("1.2", log[0].version.toString());
assertEquals("1.2.1.1", log[1].version.toString());
}
public void testBranch()
throws DiffException,
RCSException
{
testAdd1_3();
archive.setBranch("1.2.0");
archive.addRevision(v1_2_1_1, "Added 2.1, changed 4");
String file = archive.toString();
Object[] rev = archive.getRevision("1.2.1.1");
assertTrue(Diff.compare(v1_2_1_1, rev));
Version v;
v = archive.addRevision(v1_2_1_2, "1.2.0", "Arbitrary revision number");
assertEquals("1.2.1.2", v.toString());
v = archive.addRevision(v1_2_8_2, "1.2.8.2", "Arbitrary revision number");
assertEquals("1.2.8.2", v.toString());
try
{
v = archive.addRevision(v1_2_8_4, "1.2.8.1", "Added to arbitrary branch");
fail("could add revision 1.2.8.1 after having added 1.2.8.2");
}
catch (InvalidVersionNumberException e)
{
}
v = archive.addRevision(v1_2_8_4, "1.2.8.4", "Added to arbitrary branch");
assertEquals("1.2.8.4", v.toString());
v = archive.addRevision(v1_2_8_5, "1.2.0", "Added to arbitrary branch");
assertEquals("1.2.8.5", v.toString());
assertEquals(new Version("1.2.8.5"), archive.getRevisionVersion());
assertEquals(".8", new Version("1.2.8.5"), archive.getRevisionVersion("1.2.8"));
assertEquals(new Version("1.2.8.5"), archive.getRevisionVersion("1.2."));
assertEquals(new Version("1.2.8.5"), archive.getRevisionVersion("1.2.0"));
assertNull(archive.getRevisionVersion("1.2.8.6"));
assertNull(archive.getRevisionVersion("1.2.3"));
assertNull(archive.getRevisionVersion("1.2.9"));
Node[] log = archive.changeLog(new Version("1.2.8"));
assertNotNull("log is null", log);
assertEquals( 5, log.length);
assertEquals("1.1", log[0].version.toString());
assertEquals("1.2" , log[1].version.toString());
assertEquals("1.2.8.2", log[2].version.toString());
assertEquals("1.2.8.4", log[3].version.toString());
assertEquals("1.2.8.5", log[4].version.toString());
try
{
log = archive.changeLog(new Version("1.2.8"), new Version("1.2.1"));
fail("found change log between 1.2.8.5 and 1.2.1.2");
}
catch (NodeNotFoundException e)
{
}
}
public void testInvalidBranch()
throws DiffException,
RCSException
{
testAdd1_1();
try
{
archive.setBranch("1.3.1");
fail("succeeded with invalid branch");
}
catch (InvalidVersionNumberException e)
{
}
}
public void testUnicodeEscapes()
throws DiffException, RCSException
{
Archive archive = new Archive(new String[] { "\\user" }, "original");
archive.addRevision(new String[] { "user" }, "original");
}
String[] sampleFile = {
"head\t1.3;",
"access;",
"symbols;",
"locks; strict;",
"comment\t@# @;",
"",
"",
"1.3",
"date\t99.08.24.16.58.59;\tauthor juanca;\tstate Exp;",
"branches;",
"next\t1.2;",
"",
"1.2",
"date\t99.08.24.16.57.54;\tauthor juanca;\tstate Exp;",
"branches",
"\t1.2.1.1;",
"next\t1.1;",
"",
"1.1",
"date\t99.08.24.16.56.51;\tauthor juanca;\tstate Exp;",
"branches;",
"next\t;",
"",
"1.2.1.1",
"date\t99.08.24.17.00.30;\tauthor juanca;\tstate Exp;",
"branches;",
"next\t;",
"",
"",
"desc",
"@@",
"",
"",
"1.3",
"log",
"@Changed 1",
"@",
"text",
"@[1] one changed",
"[2] two",
"[3] three",
"[3.1]",
"[4] four",
"[5] five",
"@",
"",
"",
"1.2",
"log",
"@Added 3.1, deleted 6",
"@", // 50
"text",
"@d1 1",
"a1 1",
"[1] one",
"@",
"",
"",
"1.2.1.1",
"log",
"@Added 2.1, changed 4, added 5.1", //60
"@",
"text",
"@a2 1",
"[2.1]",
"d5 1",
"a5 1",
"[4] four changed",
"a6 1",
"[5.1]",
"@", // 70
"",
"",
"1.1",
"log",
"@A simple test file",
"@",
"text",
"@d4 1",
"a6 1",
"[6] six",
"@"
};
}