// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.wiki; import junit.framework.TestCase; import fitnesse.testutil.SimpleCachinePage; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; public class CachingPageTest { private CachingPage root; private PageCrawler crawler; private WikiPagePath pageOnePath; private WikiPagePath childOnePath; private WikiPagePath rootPath; @Before public void setUp() throws Exception { root = new SimpleCachinePage("RooT", null); crawler = root.getPageCrawler(); pageOnePath = PathParser.parse(".PageOne"); childOnePath = PathParser.parse(".PageOne.ChildOne"); rootPath = PathParser.parse("root"); } @Test public void testCreate() throws Exception { String alpha = "AlphaAlpha"; WikiPage root = InMemoryPage.makeRoot("root"); assertFalse(root.hasChildPage(alpha)); crawler.addPage(root, PathParser.parse(alpha), "content"); assertTrue(root.hasChildPage(alpha)); } @Test public void testTwoLevel() throws Exception { String alpha = "AlphaAlpha"; String beta = "BetaBeta"; WikiPage subPage1 = crawler.addPage(root, PathParser.parse(alpha)); crawler.addPage(subPage1, PathParser.parse(beta)); assertTrue(crawler.pageExists(root, PathParser.parse(alpha + "." + beta))); } @Test public void testDoubleDot() throws Exception { String alpha = "AlphaAlpha"; String beta = "BetaBeta"; WikiPage subPage1 = crawler.addPage(root, PathParser.parse(alpha)); crawler.addPage(subPage1, PathParser.parse(beta)); assertFalse(crawler.pageExists(root, PathParser.parse(alpha + ".." + beta))); } @Test public void testClearPage() throws Exception { String child = "ChildPage"; crawler.addPage(root, PathParser.parse(child), "content"); assertTrue(root.hasCachedSubpage(child)); root.removeChildPage(child); assertFalse(root.hasCachedSubpage(child)); } @Test public void testGetName() throws Exception { WikiPage frontPage = crawler.addPage(root, PathParser.parse("FrontPage"), "FrontPage"); WikiPage c1 = crawler.addPage(frontPage, PathParser.parse("ChildOne"), "ChildOne"); assertEquals("ChildOne", c1.getName()); assertEquals(PathParser.parse("FrontPage.ChildOne"), crawler.getFullPath(c1)); } @Test public void testDefaultAttributes() throws Exception { WikiPage page = crawler.addPage(root, PathParser.parse("SomePage")); assertTrue(page.getData().hasAttribute("Edit")); assertTrue(page.getData().hasAttribute("Search")); assertFalse(page.getData().hasAttribute("Test")); assertFalse(page.getData().hasAttribute("TestSuite")); } @Test public void testPageDataIsCached() throws Exception { CachingPage.cacheTime = 100; CachingPage page = (CachingPage) crawler.addPage(root, PathParser.parse("PageOne"), "some content"); PageData data1 = page.getCachedData(); PageData data2 = page.getCachedData(); Thread.sleep(200); PageData data3 = page.getData(); assertSame(data1, data2); assertNotSame(data1, data3); } @Test public void testDumpCachedExpiredData() throws Exception { CachingPage.cacheTime = 100; CachingPage page = (CachingPage) crawler.addPage(root, PathParser.parse("PageOne"), "some content"); PageData data = page.getData(); assertNotNull(data); Thread.sleep(200); ((CachingPage) page).dumpExpiredCachedData(); assertNull(page.getCachedData()); } @Test public void testGetPageThatStartsWithDot() throws Exception { WikiPage page1 = crawler.addPage(root, PathParser.parse("PageOne"), "page one"); WikiPage child1 = crawler.addPage(root, PathParser.parse("PageOne.ChildOne"), "child one"); assertSame(page1, crawler.getPage(page1, pageOnePath)); assertSame(child1, crawler.getPage(page1, childOnePath)); assertSame(page1, crawler.getPage(child1, pageOnePath)); } @Test public void testGetPageUsingRootKeyWord() throws Exception { WikiPage page1 = crawler.addPage(root, PathParser.parse("PageOne"), "page one"); assertSame(root, crawler.getPage(page1, rootPath)); assertSame(root, crawler.getPage(root, rootPath)); } @Test public void testEquals() throws Exception { WikiPage root = InMemoryPage.makeRoot("RooT"); WikiPage pageOne = crawler.addPage(root, PathParser.parse("PageOne"), "content"); assertEquals(pageOne, pageOne); root.removeChildPage("PageOne"); WikiPage pageOneOne = crawler.addPage(root, PathParser.parse("PageOne")); assertEquals(pageOne, pageOneOne); } @Test public void testCachedDataIsTrashedBeforeOutOfMemoryError() throws Exception { CachingPage page = (CachingPage) crawler.addPage(root, PathParser.parse("SomePage"), "some content"); page.getData(); assertTrue(page.getCachedData() != null); boolean exceptionThrown = false; try { new MemoryEater(); } catch (OutOfMemoryError e) { assertTrue(page.getCachedData() == null); exceptionThrown = true; } assertTrue(exceptionThrown); } class MemoryEater { long[] array = new long[1000000]; MemoryEater eater = new MemoryEater(); } }