blob: 94e2fb6632d6c7f911b2c0c32b083e1817adc6ab [file] [log] [blame]
/*
JSPWiki - a JSP-based WikiWiki clone.
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 com.ecyrd.jspwiki.providers;
import junit.framework.*;
import java.io.*;
import java.util.*;
import org.apache.jspwiki.api.WikiPage;
import com.ecyrd.jspwiki.*;
import com.ecyrd.jspwiki.util.FileUtil;
// FIXME: Should this thingy go directly to the VersioningFileProvider,
// or should it rely on the WikiEngine API?
public class VersioningFileProviderTest extends TestCase
{
public static final String NAME1 = "Test1";
Properties props = new Properties();
TestEngine engine;
public VersioningFileProviderTest( String s )
{
super( s );
}
public void setUp()
throws Exception
{
props.load( TestEngine.findTestProperties("/jspwiki_vers.properties") );
engine = new TestEngine(props);
}
public void tearDown()
{
String files = props.getProperty( FileSystemProvider.PROP_PAGEDIR );
// Remove file
File f = new File( files, NAME1+FileSystemProvider.FILE_EXT );
f.delete();
f = new File( files, "OLD" );
TestEngine.deleteAll(f);
}
/**
* Checks if migration from FileSystemProvider to VersioningFileProvider
* works by creating a dummy file without corresponding content in OLD/
*/
public void testMigration()
throws IOException
{
String files = props.getProperty( FileSystemProvider.PROP_PAGEDIR );
File f = new File( files, NAME1+FileSystemProvider.FILE_EXT );
Writer out = new FileWriter( f );
FileUtil.copyContents( new StringReader("foobar"), out );
out.close();
String res = engine.getText( NAME1 );
assertEquals( "latest did not work", "foobar", res );
res = engine.getText( NAME1, 1 ); // Should be the first version.
assertEquals( "fetch by direct version did not work", "foobar", res );
}
public void testMillionChanges()
throws Exception
{
String text = "";
String name = NAME1;
int maxver = 100; // Save 100 versions.
for( int i = 0; i < maxver; i++ )
{
text = text + ".";
engine.saveText( name, text );
}
WikiPage pageinfo = engine.getPage( NAME1 );
assertEquals( "wrong version", maxver, pageinfo.getVersion() );
// +2 comes from \r\n.
assertEquals( "wrong text", maxver+2, engine.getText(NAME1).length() );
}
public void testCheckin()
throws Exception
{
String text = "diddo\r\n";
engine.saveText( NAME1, text );
String res = engine.getText(NAME1);
assertEquals( text, res );
}
public void testGetByVersion()
throws Exception
{
String text = "diddo\r\n";
engine.saveText( NAME1, text );
WikiPage page = engine.getPage( NAME1, 1 );
assertEquals( "name", NAME1, page.getName() );
assertEquals( "version", 1, page.getVersion() );
}
public void testPageInfo()
throws Exception
{
String text = "diddo\r\n";
engine.saveText( NAME1, text );
WikiPage res = engine.getPage(NAME1);
assertEquals( 1, res.getVersion() );
}
public void testGetOldVersion()
throws Exception
{
String text = "diddo\r\n";
String text2 = "barbar\r\n";
String text3 = "Barney\r\n";
engine.saveText( NAME1, text );
engine.saveText( NAME1, text2 );
engine.saveText( NAME1, text3 );
WikiPage res = engine.getPage(NAME1);
assertEquals("wrong version", 3, res.getVersion() );
assertEquals("ver1", text, engine.getText( NAME1, 1 ) );
assertEquals("ver2", text2, engine.getText( NAME1, 2 ) );
assertEquals("ver3", text3, engine.getText( NAME1, 3 ) );
}
public void testGetOldVersion2()
throws Exception
{
String text = "diddo\r\n";
String text2 = "barbar\r\n";
String text3 = "Barney\r\n";
engine.saveText( NAME1, text );
engine.saveText( NAME1, text2 );
engine.saveText( NAME1, text3 );
WikiPage res = engine.getPage(NAME1);
assertEquals("wrong version", 3, res.getVersion() );
assertEquals("ver1", 1, engine.getPage( NAME1, 1 ).getVersion() );
assertEquals("ver2", 2, engine.getPage( NAME1, 2 ).getVersion() );
assertEquals("ver3", 3, engine.getPage( NAME1, 3 ).getVersion() );
}
/**
* 2.0.7 and before got this wrong.
*/
public void testGetOldVersionUTF8()
throws Exception
{
String text = "\u00e5\u00e4\u00f6\r\n";
String text2 = "barbar\u00f6\u00f6\r\n";
String text3 = "Barney\u00e4\u00e4\r\n";
engine.saveText( NAME1, text );
engine.saveText( NAME1, text2 );
engine.saveText( NAME1, text3 );
WikiPage res = engine.getPage(NAME1);
assertEquals("wrong version", 3, res.getVersion() );
assertEquals("ver1", text, engine.getText( NAME1, 1 ) );
assertEquals("ver2", text2, engine.getText( NAME1, 2 ) );
assertEquals("ver3", text3, engine.getText( NAME1, 3 ) );
}
public void testNonexistantPage()
{
assertNull( engine.getPage("fjewifjeiw") );
}
public void testVersionHistory()
throws Exception
{
String text = "diddo\r\n";
String text2 = "barbar\r\n";
String text3 = "Barney\r\n";
engine.saveText( NAME1, text );
engine.saveText( NAME1, text2 );
engine.saveText( NAME1, text3 );
Collection history = engine.getVersionHistory(NAME1);
assertEquals( "size", 3, history.size() );
}
public void testDelete()
throws Exception
{
engine.saveText( NAME1, "v1" );
engine.saveText( NAME1, "v2" );
engine.saveText( NAME1, "v3" );
PageManager mgr = engine.getPageManager();
WikiPageProvider provider = mgr.getProvider();
provider.deletePage( NAME1 );
String files = props.getProperty( FileSystemProvider.PROP_PAGEDIR );
File f = new File( files, NAME1+FileSystemProvider.FILE_EXT );
assertFalse( "file exists", f.exists() );
f = new File( files, NAME1+".properties" );
assertFalse( "RCS file exists", f.exists() );
}
public void testDeleteVersion()
throws Exception
{
engine.saveText( NAME1, "v1\r\n" );
engine.saveText( NAME1, "v2\r\n" );
engine.saveText( NAME1, "v3\r\n" );
PageManager mgr = engine.getPageManager();
WikiPageProvider provider = mgr.getProvider();
List l = provider.getVersionHistory( NAME1 );
assertEquals( "wrong # of versions", 3, l.size() );
provider.deleteVersion( NAME1, 2 );
l = provider.getVersionHistory( NAME1 );
assertEquals( "wrong # of versions", 2, l.size() );
assertEquals( "v1", "v1\r\n", provider.getPageText( NAME1, 1 ) );
assertEquals( "v3", "v3\r\n", provider.getPageText( NAME1, 3 ) );
try
{
provider.getPageText( NAME1, 2 );
fail( "v2" );
}
catch( NoSuchVersionException e )
{
// This is expected
}
}
public void testChangeNote()
throws Exception
{
WikiPage p = engine.createPage( NAME1 );
p.setAttribute(WikiPage.CHANGENOTE, "Test change" );
WikiContext context = engine.getWikiContextFactory().newViewContext(p);
engine.saveText( context, "test" );
WikiPage p2 = engine.getPage( NAME1 );
assertEquals( "Test change", p2.getAttribute(WikiPage.CHANGENOTE) );
}
public void testChangeNoteOldVersion()
throws Exception
{
WikiPage p = engine.createPage( NAME1 );
WikiContext context = engine.getWikiContextFactory().newViewContext(p);
context.getPage().setAttribute(WikiPage.CHANGENOTE, "Test change" );
engine.saveText( context, "test" );
context.getPage().setAttribute(WikiPage.CHANGENOTE, "Change 2" );
engine.saveText( context, "test2" );
WikiPage p2 = engine.getPage( NAME1, 1 );
assertEquals( "Test change", p2.getAttribute(WikiPage.CHANGENOTE) );
WikiPage p3 = engine.getPage( NAME1, 2 );
assertEquals( "Change 2", p3.getAttribute(WikiPage.CHANGENOTE) );
}
public void testChangeNoteOldVersion2() throws Exception
{
WikiPage p = engine.createPage( NAME1 );
WikiContext context = engine.getWikiContextFactory().newViewContext( p );
context.getPage().setAttribute( WikiPage.CHANGENOTE, "Test change" );
engine.saveText( context, "test" );
for( int i = 0; i < 5; i++ )
{
WikiPage p2 = (WikiPage)engine.getPage( NAME1 ).clone();
p2.removeAttribute(WikiPage.CHANGENOTE);
context.setPage( p2 );
engine.saveText( context, "test"+i );
}
WikiPage p3 = engine.getPage( NAME1, -1 );
assertEquals( null, p3.getAttribute(WikiPage.CHANGENOTE) );
}
public static Test suite()
{
return new TestSuite( VersioningFileProviderTest.class );
}
}