/*
* Licensed 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.wiki;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import org.apache.wiki.api.exceptions.WikiException;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import net.sf.ehcache.CacheManager;
/**
* The ReferenceManager maintains all hyperlinks between wiki pages.
*/
public class ReferenceManagerTest extends TestCase
{
Properties props = TestEngine.getTestProperties();
TestEngine engine;
ReferenceManager mgr;
public ReferenceManagerTest( String s )
{
super( s );
}
@Override
public void setUp()
throws Exception
{
props.setProperty( "jspwiki.translatorReader.matchEnglishPlurals", "true");
// make sure that the reference manager cache is cleaned first
TestEngine.emptyWorkDir(null);
engine = new TestEngine(props);
// create two handy wiki pages used in most test cases
// Danger! all wiki page names must start with a capital letter!
engine.saveText( "TestPage", "Reference to [Foobar]." );
engine.saveText( "Foobar", "Reference to [Foobar2], [Foobars], [Foobar]" );
mgr = engine.getReferenceManager();
}
@Override
public void tearDown()
throws Exception
{
// any wiki page that was created must be deleted!
TestEngine.emptyWikiDir();
// jspwiki always uses a singleton CacheManager, so
// clear the cache at the end of every test case to avoid
// polluting another test case
CacheManager.getInstance().removeAllCaches();
}
public void testNonExistant1()
throws Exception
{
Collection c = mgr.findReferrers("Foobar2");
assertNotNull( "referrers expected", c );
assertTrue( c.size() == 1 && c.contains("Foobar") );
}
public void testNonExistant2()
{
Collection c = mgr.findReferrers("TestBug");
assertNull( c );
}
public void testRemove()
throws Exception
{
Collection c = mgr.findReferrers("Foobar2");
assertNotNull( "referrers expected", c );
assertTrue( c.size() == 1 && c.contains("Foobar") );
engine.deletePage( "Foobar" );
c = mgr.findReferrers("Foobar2");
assertNull( c );
engine.saveText( "Foobar", "[Foobar2]");
c = mgr.findReferrers("Foobar2");
assertNotNull( "referrers expected", c );
assertTrue( c.size() == 1 && c.contains("Foobar") );
}
public void testUnreferenced()
throws Exception
{
Collection c = mgr.findUnreferenced();
assertTrue( "Unreferenced page not found by ReferenceManager",
Util.collectionContains( c, "TestPage" ));
}
public void testBecomesUnreferenced()
throws Exception
{
engine.saveText( "Foobar2", "[TestPage]" );
Collection c = mgr.findUnreferenced();
assertEquals( "Wrong # of orphan pages, stage 1", 0, c.size() );
engine.saveText( "Foobar2", "norefs" );
c = mgr.findUnreferenced();
assertEquals( "Wrong # of orphan pages", 1, c.size() );
Iterator i = c.iterator();
String first = (String) i.next();
assertEquals( "Not correct referrers", "TestPage", first );
}
public void testUncreated()
throws Exception
{
Collection c = mgr.findUncreated();
assertTrue( c.size()==1 && ((String) c.iterator().next()).equals("Foobar2") );
}
public void testReferrers()
throws Exception
{
Collection c = mgr.findReferrers( "TestPage" );
assertNull( "TestPage referrers", c );
c = mgr.findReferrers( "Foobar" );
assertNotNull( "referrers expected", c );
assertTrue( "Foobar referrers", c.size()==2 );
c = mgr.findReferrers( "Foobar2" );
assertNotNull( "referrers expected", c );
assertTrue( "Foobar2 referrers", c.size()==1 && ((String) c.iterator().next()).equals("Foobar") );
c = mgr.findReferrers( "Foobars" );
assertNotNull( "referrers expected", c );
assertEquals( "Foobars referrers", 2, c.size() );
//assertEquals( "Foobars referrer 'TestPage'", "TestPage", (String) c.iterator().next() );
}
public void testRefersTo()
throws Exception
{
Collection s = mgr.findRefersTo( "Foobar" );
assertTrue( "does not have Foobar", s.contains("Foobar") );
// assertTrue( "does not have Foobars", s.contains("Foobars") );
assertTrue( "does not have Foobar2", s.contains("Foobar2") );
}
/**
* Should fail in 2.2.14-beta
* @throws Exception
*/
public void testSingularReferences()
throws Exception
{
engine.saveText( "RandomPage", "FatalBugs" );
engine.saveText( "FatalBugs", "<foo>" );
engine.saveText( "BugCommentPreviewDeletesAllComments", "FatalBug" );
Collection c = mgr.findReferrers( "FatalBugs" );
assertNotNull( "referrers expected", c );
assertEquals( "FatalBugs referrers number", 2, c.size() );
}
/**
* Is a page recognized as referenced if only plural form links exist.
*/
// NB: Unfortunately, cleaning out self-references in the case there's
// a plural and a singular form of the page becomes nigh impossible, so we
// just don't do it.
public void testUpdatePluralOnlyRef()
throws Exception
{
engine.saveText( "TestPage", "Reference to [Foobars]." );
Collection c = mgr.findUnreferenced();
assertTrue( "Foobar unreferenced", c.size()==1 && ((String) c.iterator().next()).equals("TestPage") );
c = mgr.findReferrers( "Foobar" );
assertNotNull( "referrers expected", c );
Iterator it = c.iterator();
String s1 = (String)it.next();
assertTrue( "Foobar referrers",
c.size()==2 );
}
/**
* Opposite to testUpdatePluralOnlyRef(). Is a page with plural form recognized as
* the page referenced by a singular link.
*/
public void testUpdateFoobar2s()
throws Exception
{
engine.saveText( "Foobar2s", "qwertz" );
assertTrue( "no uncreated", mgr.findUncreated().size()==0 );
Collection c = mgr.findReferrers( "Foobar2s" );
assertNotNull( "referrers expected", c );
assertTrue( "referrers", c!=null && c.size()==1 && ((String) c.iterator().next()).equals("Foobar") );
}
public void testUpdateBothExist()
throws Exception
{
engine.saveText( "Foobars", "qwertz" );
Collection c = mgr.findReferrers( "Foobars" );
assertNotNull( "referrers expected", c );
assertEquals( "Foobars referrers", 2, c.size() );
assertTrue( "Foobars referrer is not TestPage", c.contains( "TestPage" ) && c.contains("Foobar"));
}
public void testUpdateBothExist2()
throws Exception
{
engine.saveText( "Foobars", "qwertz" );
engine.saveText( "TestPage", "Reference to [Foobar], [Foobars]." );
Collection c = mgr.findReferrers( "Foobars" );
assertNotNull( "referrers expected", c );
assertEquals( "Foobars referrers count", 2, c.size() );
Iterator i = c.iterator();
String first = (String) i.next();
assertTrue( "Foobars referrers",
c.contains("TestPage") && c.contains("Foobar"));
}
public void testCircularRefs()
throws Exception
{
engine.saveText( "Foobar2", "ref to [TestPage]" );
assertTrue( "no uncreated", mgr.findUncreated().size()==0 );
assertTrue( "no unreferenced", mgr.findUnreferenced().size()==0 );
}
public void testPluralSingularUpdate1()
throws Exception
{
engine.saveText( "BugOne", "NewBug" );
engine.saveText( "NewBugs", "foo" );
engine.saveText( "OpenBugs", "bar" );
engine.saveText( "BugOne", "OpenBug" );
Collection ref = mgr.findReferrers( "NewBugs" );
assertNull("newbugs",ref); // No referrers must be found
ref = mgr.findReferrers( "NewBug" );
assertNull("newbug",ref); // No referrers must be found
ref = mgr.findReferrers( "OpenBugs" );
assertNotNull("referrers expected", ref);
assertEquals("openbugs",1,ref.size());
assertEquals("openbugs2","BugOne",ref.iterator().next());
ref = mgr.findReferrers( "OpenBug" );
assertNotNull("referrers expected", ref);
assertEquals("openbug",1,ref.size());
assertEquals("openbug2","BugOne",ref.iterator().next());
}
public void testPluralSingularUpdate2()
throws Exception
{
engine.saveText( "BugOne", "NewBug" );
engine.saveText( "NewBug", "foo" );
engine.saveText( "OpenBug", "bar" );
engine.saveText( "BugOne", "OpenBug" );
Collection ref = mgr.findReferrers( "NewBugs" );
assertNull("newbugs",ref); // No referrers must be found
ref = mgr.findReferrers( "NewBug" );
assertNull("newbug",ref); // No referrers must be found
ref = mgr.findReferrers( "OpenBugs" );
assertNotNull("referrers expected", ref);
assertEquals("openbugs",1,ref.size());
assertEquals("openbugs2","BugOne",ref.iterator().next());
ref = mgr.findReferrers( "OpenBug" );
assertNotNull("referrers expected", ref);
assertEquals("openbug",1,ref.size());
assertEquals("openbug2","BugOne",ref.iterator().next());
}
public void testPluralSingularUpdate3()
throws Exception
{
engine.saveText( "BugOne", "NewBug" );
engine.saveText( "BugTwo", "NewBug" );
engine.saveText( "NewBugs", "foo" );
engine.saveText( "OpenBugs", "bar" );
engine.saveText( "BugOne", "OpenBug" );
Collection ref = mgr.findReferrers( "NewBugs" );
assertNotNull("referrers expected", ref);
assertEquals("newbugs",1,ref.size());
assertEquals("newbugs2","BugTwo",ref.iterator().next());
ref = mgr.findReferrers( "NewBug" );
assertNotNull("referrers expected", ref);
assertEquals("newbugs",1,ref.size());
assertEquals("newbugs2","BugTwo",ref.iterator().next());
ref = mgr.findReferrers( "OpenBugs" );
assertNotNull("referrers expected", ref);
assertEquals("openbugs",1,ref.size());
assertEquals("openbugs2","BugOne",ref.iterator().next());
ref = mgr.findReferrers( "OpenBug" );
assertNotNull("referrers expected", ref);
assertEquals("openbug",1,ref.size());
assertEquals("openbug2","BugOne",ref.iterator().next());
}
public void testSelf() throws WikiException
{
engine.saveText( "BugOne", "BugOne" );
Collection ref = mgr.findReferrers( "BugOne" );
assertNotNull("referrers expected", ref);
assertEquals("wrong size",1,ref.size());
assertEquals("ref", "BugOne", ref.iterator().next());
}
public static Test suite()
{
return new TestSuite( ReferenceManagerTest.class );
}
public static void main(String[] args)
{
junit.textui.TestRunner.main( new String[] { ReferenceManagerTest.class.getName() } );
}
/**
* Test method: dumps the contents of ReferenceManager link lists to stdout.
* This method is NOT synchronized, and should be used in testing
* with one user, one WikiEngine only.
*/
public static String dumpReferenceManager( ReferenceManager rm )
{
StringBuilder buf = new StringBuilder();
try
{
buf.append( "================================================================\n" );
buf.append( "Referred By list:\n" );
Set keys = rm.getReferredBy().keySet();
Iterator it = keys.iterator();
while( it.hasNext() )
{
String key = (String) it.next();
buf.append( key + " referred by: " );
Set refs = (Set)rm.getReferredBy().get( key );
Iterator rit = refs.iterator();
while( rit.hasNext() )
{
String aRef = (String)rit.next();
buf.append( aRef + " " );
}
buf.append( "\n" );
}
buf.append( "----------------------------------------------------------------\n" );
buf.append( "Refers To list:\n" );
keys = rm.getRefersTo().keySet();
it = keys.iterator();
while( it.hasNext() )
{
String key = (String) it.next();
buf.append( key + " refers to: " );
Collection refs = (Collection)rm.getRefersTo().get( key );
if(refs != null)
{
Iterator rit = refs.iterator();
while( rit.hasNext() )
{
String aRef = (String)rit.next();
buf.append( aRef + " " );
}
buf.append( "\n" );
}
else
buf.append("(no references)\n");
}
buf.append( "================================================================\n" );
}
catch(Exception e)
{
buf.append("Problem in dump(): " + e + "\n" );
}
return( buf.toString() );
}
}