You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2018/07/02 21:25:21 UTC
[2/5] wicket git commit: WICKET-6563 new IPageStore implementation
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
index a1b960d..c1d7737 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/TestMapperContext.java
@@ -20,19 +20,20 @@ import org.apache.wicket.MockPage;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.core.request.handler.PageProvider;
import org.apache.wicket.markup.MarkupParser;
-import org.apache.wicket.page.IPageManagerContext;
-import org.apache.wicket.page.PageStoreManager;
-import org.apache.wicket.pageStore.DefaultPageStore;
-import org.apache.wicket.pageStore.IDataStore;
-import org.apache.wicket.pageStore.IPageStore;
-import org.apache.wicket.pageStore.memory.DummyPageManagerContext;
+import org.apache.wicket.mock.MockPageStore;
+import org.apache.wicket.page.IPageManager;
+import org.apache.wicket.page.PageManager;
+import org.apache.wicket.pageStore.DummyPageContext;
+import org.apache.wicket.pageStore.IPageContext;
+import org.apache.wicket.pageStore.InMemoryPageStore;
+import org.apache.wicket.pageStore.RequestPageStore;
+import org.apache.wicket.pageStore.InSessionPageStore;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.request.resource.ResourceReference.Key;
import org.apache.wicket.request.resource.ResourceReferenceRegistry;
import org.apache.wicket.serialize.java.JavaSerializer;
-import org.apache.wicket.versioning.InMemoryPageStore;
/**
* Simple {@link IMapperContext} implementation for testing purposes
@@ -43,10 +44,10 @@ public class TestMapperContext implements IMapperContext
{
private static final String APP_NAME = "test_app";
private static int count;
- IDataStore dataStore;
- IPageStore pageStore;
- IPageManagerContext pageManagerContext;
- PageStoreManager pageManager;
+
+ InSessionPageStore pageStore;
+ DummyPageContext pageContext;
+ IPageManager pageManager;
private String appName;
private boolean createMockPageIfInstanceNotFound = true;
@@ -56,10 +57,18 @@ public class TestMapperContext implements IMapperContext
public TestMapperContext()
{
appName = APP_NAME + count++;
- dataStore = new InMemoryPageStore();
- pageStore = new DefaultPageStore(new JavaSerializer(appName), dataStore, 4);
- pageManagerContext = new DummyPageManagerContext();
- pageManager = new PageStoreManager(appName, pageStore, pageManagerContext);
+
+ pageContext = new DummyPageContext();
+
+ InMemoryPageStore inMemoryPageStore = new InMemoryPageStore(appName, Integer.MAX_VALUE);
+ pageStore = new InSessionPageStore(inMemoryPageStore, new JavaSerializer(appName), 4);
+ pageManager = new PageManager(new RequestPageStore(pageStore)) {
+ @Override
+ protected IPageContext createPageContext()
+ {
+ return pageContext;
+ }
+ };
}
/**
@@ -67,17 +76,17 @@ public class TestMapperContext implements IMapperContext
*/
public void cleanSessionCache()
{
- getPageManager().getContext().setRequestData(null);
+ pageContext.clearRequest();
MockPage other = new MockPage();
other.setPageId(Integer.MAX_VALUE);
- getPageManager().touchPage(other);
- getPageManager().commitRequest();
+ getPageManager().addPage(other);
+ pageManager.detach();
}
/**
* @return pageManager
*/
- public PageStoreManager getPageManager()
+ public IPageManager getPageManager()
{
return pageManager;
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java
index fe1875b..f49a384 100644
--- a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java
+++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTestCase.java
@@ -22,8 +22,6 @@ import org.apache.wicket.application.IComponentInstantiationListener;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.mock.MockPageManager;
import org.apache.wicket.page.IManageablePage;
-import org.apache.wicket.page.IPageManager;
-import org.apache.wicket.page.IPageManagerContext;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.util.tester.WicketTestCase;
import org.apache.wicket.util.tester.WicketTester;
@@ -55,21 +53,16 @@ public abstract class DontStoreNotRenderedPageTestCase extends WicketTestCase
@Override
protected IPageManagerProvider newTestPageManagerProvider()
{
- return new IPageManagerProvider()
- {
- @Override
- public IPageManager apply(IPageManagerContext context)
+ return () -> {
+ return new MockPageManager()
{
- return new MockPageManager()
+ @Override
+ public void addPage(IManageablePage page)
{
- @Override
- public void touchPage(IManageablePage page)
- {
- Assert.assertFalse("PageB should not be touched!", page instanceof PageB);
- super.touchPage(page);
- }
- };
- }
+ Assert.assertFalse("PageB should not be touched!", page instanceof PageB);
+ super.addPage(page);
+ }
+ };
};
}
};
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java
index 39586e0..6ec0066 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/TransparentWebMarkupContainerTest.java
@@ -34,7 +34,7 @@ import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.mock.MockPageManager;
import org.apache.wicket.page.IManageablePage;
import org.apache.wicket.page.IPageManager;
-import org.apache.wicket.page.IPageManagerContext;
+import org.apache.wicket.pageStore.IPageContext;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.StringResourceStream;
@@ -117,15 +117,15 @@ public class TransparentWebMarkupContainerTest extends WicketTestCase
return new IPageManagerProvider()
{
@Override
- public IPageManager apply(IPageManagerContext context)
+ public IPageManager get()
{
return new MockPageManager()
{
@Override
- public void touchPage(IManageablePage page)
+ public void addPage(IManageablePage page)
{
page = WicketObjects.cloneObject(page);
- super.touchPage(page);
+ super.addPage(page);
}
};
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java b/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java
index e2053df..eeb9ba3 100644
--- a/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/page/PageAccessSynchronizerTest.java
@@ -324,7 +324,7 @@ public class PageAccessSynchronizerTest extends Assert
int pageId = 1;
IManageablePage page = new MockPage(pageId);
- synchronizedPageManager.touchPage(page);
+ synchronizedPageManager.addPage(page);
synchronizedPageManager.getPage(pageId);
PageLock pageLock2 = locks.get(Integer.valueOf(pageId));
assertNotNull(pageLock2);
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java b/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java
index 23fe264..cb39d94 100644
--- a/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/page/PersistentPageManagerTest.java
@@ -19,19 +19,19 @@ package org.apache.wicket.page;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.io.ObjectInputStream;
import java.io.Serializable;
+import java.util.concurrent.atomic.AtomicReference;
import org.apache.wicket.Application;
+import org.apache.wicket.MetaDataKey;
import org.apache.wicket.ThreadContext;
-import org.apache.wicket.pageStore.DefaultPageStore;
-import org.apache.wicket.pageStore.IDataStore;
+import org.apache.wicket.pageStore.DummyPageContext;
+import org.apache.wicket.pageStore.IPageContext;
import org.apache.wicket.pageStore.IPageStore;
-import org.apache.wicket.pageStore.memory.DummyPageManagerContext;
+import org.apache.wicket.pageStore.InSessionPageStore;
+import org.apache.wicket.pageStore.NoopPageStore;
import org.apache.wicket.serialize.java.JavaSerializer;
-import org.apache.wicket.versioning.InMemoryPageStore;
import org.junit.Assert;
import org.junit.Test;
@@ -58,44 +58,43 @@ public class PersistentPageManagerTest
ThreadContext.detach();
// create IPageManager (with IPageStore) and store a page instance
- IPageManager pageManager = newPersistentPageManager(APP_NAME);
+ final AtomicReference<Object> sessionData = new AtomicReference<Object>(null);
+
+ IPageManager pageManager = createPageManager(APP_NAME, sessionData);
+
+ // add a page
TestPage toSerializePage = new TestPage();
- pageManager.touchPage(toSerializePage);
- pageManager.commitRequest();
+ pageManager.addPage(toSerializePage);
+ pageManager.detach();
// get the stored SessionEntry
- Serializable sessionEntry = pageManager.getContext().getSessionAttribute(null);
+ assertNotNull(sessionData.get());
// destroy the manager and the store
pageManager.destroy();
// simulate persisting of the http sessions initiated by the web container
- byte[] serializedSessionEntry = new JavaSerializer(APP_NAME).serialize(sessionEntry);
+ byte[] serializedSessionData = new JavaSerializer(APP_NAME).serialize(sessionData.get());
assertNotNull("Wicket needs to be able to serialize the session entry",
- serializedSessionEntry);
-
- // simulate loading of the persisted http session initiated by the web container
- // when starting an application
- ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
- serializedSessionEntry));
+ serializedSessionData);
// WicketFilter is not initialized so there is no Application available yet
Assert.assertFalse("Worker thread should be unaware of Wicket application",
Application.exists());
- assertEquals(APP_NAME, in.readObject());
+ // simulate loading of the persisted http session initiated by the web container
+ // when starting an application
+ sessionData.set(new JavaSerializer(APP_NAME).deserialize(serializedSessionData));
// without available IPageStore the read SessionEntry holds
// the IManageablePage itself, not SerializedPage
- Serializable loadedSessionEntry = (Serializable)in.readObject();
assertNotNull(
"Wicket needs to be able to deserialize the session entry regardless the application availability",
- loadedSessionEntry);
+ sessionData.get());
// provide new IPageStore which will read IManageablePage's or SerializedPage's
// from the SessionEntry's
- IPageManager newPageManager = newPersistentPageManager(APP_NAME);
- newPageManager.getContext().setSessionAttribute(null, loadedSessionEntry);
+ IPageManager newPageManager = createPageManager(APP_NAME, sessionData);
TestPage deserializedPage = (TestPage)newPageManager.getPage(toSerializePage.getPageId());
assertNotNull(deserializedPage);
@@ -104,12 +103,34 @@ public class PersistentPageManagerTest
newPageManager.destroy();
}
- private PageStoreManager newPersistentPageManager(String appName)
+ /**
+ * Create a manager that stores session data in the given atomic reference.
+ */
+ private IPageManager createPageManager(String appName, AtomicReference<Object> sessionData)
{
- IDataStore dataStore = new InMemoryPageStore();
- IPageStore pageStore = new DefaultPageStore(new JavaSerializer(appName), dataStore, 4);
- IPageManagerContext pageManagerContext = new DummyPageManagerContext();
- return new PageStoreManager(appName, pageStore, pageManagerContext);
+ IPageStore store = new InSessionPageStore(new NoopPageStore(), new JavaSerializer(APP_NAME), Integer.MAX_VALUE);
+
+ return new PageManager(store) {
+ @Override
+ protected IPageContext createPageContext()
+ {
+ return new DummyPageContext() {
+ @Override
+ public <T extends Serializable> void setSessionData(MetaDataKey<T> key, T value)
+ {
+ super.setSessionData(key, value);
+
+ sessionData.set(value);
+ }
+
+ @Override
+ public <T extends Serializable> T getSessionData(MetaDataKey<T> key)
+ {
+ return (T)sessionData.get();
+ }
+ };
+ }
+ };
}
private static class TestPage implements IManageablePage
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java b/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java
deleted file mode 100644
index 1270800..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * 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 org.apache.wicket.page.persistent.disk;
-
-import java.security.SecureRandom;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import org.apache.wicket.pageStore.PageWindowManager;
-import org.apache.wicket.pageStore.PageWindowManager.PageWindow;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * @author Matej Knopp
- */
-public class PageWindowManagerTest extends Assert
-{
- /**
- * https://issues.apache.org/jira/browse/WICKET-4572
- */
- @Test
- public void removeObsoleteIndices()
- {
- int page0id = 0,
- page1id = 1,
- page2id = 2;
- int maxSize = 10;
-
- PageWindowManager manager = new PageWindowManager(maxSize);
-
- // Add few pages.
- // All of them fully occupy the max space in the pageWindowManager.
- // So adding N+1st page removes the Nth page.
- manager.createPageWindow(page0id, maxSize);
- PageWindow page0Window = manager.getPageWindow(page0id);
- assertWindow(page0Window, page0id, page0Window.getFilePartOffset(), page0Window.getFilePartSize());
-
- manager.createPageWindow(page1id, maxSize);
- PageWindow page1Window = manager.getPageWindow(page1id);
- assertWindow(page1Window, page1id, page1Window.getFilePartOffset(), page1Window.getFilePartSize());
-
- // Try to get a page which has been lost with the adding of page1
- assertNull("Page0 must be lost when Page1 has been added.", manager.getPageWindow(page0id));
-
- manager.createPageWindow(page2id, maxSize);
- PageWindow page2Window = manager.getPageWindow(page2id);
- assertWindow(page2Window, page2id, page2Window.getFilePartOffset(), page2Window.getFilePartSize());
-
- // Try to get a page which has been lost with the adding of page2
- assertNull("Page1 must be lost when Page2 has been added.", manager.getPageWindow(page1id));
- }
-
- /**
- *
- */
- @Test
- public void addRemove()
- {
- PageWindowManager manager = new PageWindowManager(300);
- PageWindow window;
-
- window = manager.createPageWindow(1, 50);
- assertWindow(window, 1, 0, 50);
-
- window = manager.createPageWindow(2, 40);
- assertWindow(window, 2, 50, 40);
-
- assertEquals(manager.getTotalSize(), 90);
-
- window = manager.createPageWindow(2, 30);
- assertWindow(window, 2, 50, 30);
- assertEquals(manager.getTotalSize(), 80);
-
- manager.removePage(2);
- assertEquals(manager.getTotalSize(), 50);
-
- window = manager.createPageWindow(3, 30);
- assertWindow(window, 3, 50, 30);
- assertEquals(manager.getTotalSize(), 80);
- }
-
- /**
- *
- */
- @Test
- public void pageWindowCycle()
- {
- PageWindowManager manager = new PageWindowManager(100);
- PageWindow window;
-
- window = manager.createPageWindow(1, 30);
-
- window = manager.createPageWindow(2, 30);
-
- window = manager.createPageWindow(3, 30);
-
- assertWindow(window, 3, 60, 30);
-
- window = manager.createPageWindow(4, 30);
-
- assertWindow(window, 4, 90, 30);
-
- // should start at the beginging
-
- window = manager.createPageWindow(5, 20);
-
- assertWindow(window, 5, 0, 20);
-
- assertNull(manager.getPageWindow(1));
-
- window = manager.getPageWindow(2);
- assertWindow(window, 2, 30, 30);
-
- window = manager.createPageWindow(6, 10);
-
- assertWindow(window, 6, 20, 10);
-
- window = manager.getPageWindow(2);
- assertWindow(window, 2, 30, 30);
-
- window = manager.createPageWindow(6, 30);
- assertWindow(window, 6, 20, 30);
-
- assertNull(manager.getPageWindow(2));
- assertNotNull(manager.getPageWindow(3));
-
- window = manager.createPageWindow(6, 60);
- assertWindow(window, 6, 20, 60);
-
- assertNull(manager.getPageWindow(3));
-
- window = manager.createPageWindow(7, 20);
- assertWindow(window, 7, 80, 20);
-
- assertNotNull(manager.getPageWindow(7));
-
- // should start at the beginning again
-
- window = manager.createPageWindow(8, 10);
- assertWindow(window, 8, 0, 10);
-
- assertNull(manager.getPageWindow(5));
- assertNotNull(manager.getPageWindow(6));
-
- window = manager.createPageWindow(9, 20);
- assertWindow(window, 9, 10, 20);
-
- assertNull(manager.getPageWindow(6));
- assertNotNull(manager.getPageWindow(7));
-
- window = manager.createPageWindow(10, 20);
- assertWindow(window, 10, 30, 20);
-
- assertNull(manager.getPageWindow(6));
- assertNotNull(manager.getPageWindow(7));
-
- // make sure when replacing a page that's not last the old "instance" is
- // not valid anymore
-
- manager.createPageWindow(8, 10);
-
- window = manager.getPageWindow(8);
- assertWindow(window, 8, 50, 10);
- }
-
-
- private void assertWindow(PageWindow window, int pageId, int filePartOffset, int filePartSize)
- {
- assertTrue(window.getPageId() == pageId && window.getFilePartOffset() == filePartOffset &&
- window.getFilePartSize() == filePartSize);
- }
-
- /** how many operations to execute */
- private static final int EXECUTIONS = 10000;
-
- /** used to wait the executions */
- private static final CountDownLatch LATCH = new CountDownLatch(EXECUTIONS);
-
- private final PageWindowManager pageWindowManager = new PageWindowManager(1000L);
-
- /** the execution types */
- private final Runnable[] TASKS = new Runnable[]
- {
- new CreatePageWindowTask(pageWindowManager),
- new GetPageWindowTask(pageWindowManager),
- new RemovePageInSessionTask(pageWindowManager)
- };
-
- private static final SecureRandom RND = new SecureRandom();
-
- /**
- * Executes random mutator and accessor operations on {@link org.apache.wicket.pageStore.AsynchronousDataStore} validating
- * that the used data structures can be used simultaneously.
- *
- * @throws Exception
- */
- @Test
- public void randomOperations() throws Exception
- {
- ExecutorService executorService = Executors.newFixedThreadPool(50);
-
- for (int i = 0; i < EXECUTIONS; i++)
- {
- Runnable task = TASKS[RND.nextInt(TASKS.length)];
- executorService.submit(task);
- }
- LATCH.await();
- executorService.shutdown();
- }
-
- private static abstract class AbstractTask implements Runnable
- {
- /** the ids for the stored/removed pages */
- private static final int[] PAGE_IDS = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
-
- protected final PageWindowManager pageWindowManager;
-
- private AbstractTask(PageWindowManager pageWindowManager)
- {
- this.pageWindowManager = pageWindowManager;
- }
-
- protected abstract void r();
-
- @Override
- public void run()
- {
- try
- {
- r();
- }
- finally
- {
- LATCH.countDown();
- }
- }
-
- protected int getPageId()
- {
- return PAGE_IDS[RND.nextInt(PAGE_IDS.length)];
- }
- }
-
- private static class CreatePageWindowTask extends AbstractTask
- {
- private CreatePageWindowTask(PageWindowManager pageWindowManager)
- {
- super(pageWindowManager);
- }
-
- @Override
- public void r()
- {
- pageWindowManager.createPageWindow(getPageId(), 1000);
- }
- }
-
- private static class GetPageWindowTask extends AbstractTask
- {
- private GetPageWindowTask(PageWindowManager pageWindowManager)
- {
- super(pageWindowManager);
- }
-
- @Override
- public void r()
- {
- pageWindowManager.getPageWindow(getPageId());
- }
- }
-
- private static class RemovePageInSessionTask extends AbstractTask
- {
- private RemovePageInSessionTask(PageWindowManager pageWindowManager)
- {
- super(pageWindowManager);
- }
-
- @Override
- public void r()
- {
- pageWindowManager.removePage(getPageId());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/AbstractPageStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/AbstractPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/AbstractPageStoreTest.java
index 0ab35fd..d662b5a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/AbstractPageStoreTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/AbstractPageStoreTest.java
@@ -29,17 +29,16 @@ public abstract class AbstractPageStoreTest extends Assert
protected final String sessionId = "1234567890";
protected final int pageId = 123;
protected final ISerializer serializer = new JavaSerializer(getClass().getName());
- protected final IDataStore dataStore = new NoopDataStore();
protected int maxEntries = 1;
protected IPageStore pageStore = null;
@Before
public void before()
{
- pageStore = createPageStore(serializer, dataStore, maxEntries);
+ pageStore = createPageStore(serializer, maxEntries);
}
- protected abstract IPageStore createPageStore(ISerializer serializer, IDataStore dataStore, int maxEntries);
+ protected abstract IPageStore createPageStore(ISerializer serializer, int maxEntries);
@After
public void after()
@@ -57,9 +56,11 @@ public abstract class AbstractPageStoreTest extends Assert
@Test
public void storePage()
{
- pageStore.storePage(sessionId, new MockPage(pageId));
+ IPageContext context = new DummyPageContext(sessionId);
+
+ pageStore.addPage(context, new MockPage(pageId));
- assertNotNull(pageStore.getPage(sessionId, pageId));
+ assertNotNull(pageStore.getPage(context, pageId));
}
/**
@@ -68,46 +69,51 @@ public abstract class AbstractPageStoreTest extends Assert
@Test
public void storePage2()
{
+ IPageContext context = new DummyPageContext(sessionId);
int maxEntries = 10;
- pageStore = createPageStore(serializer, dataStore, maxEntries);
+ pageStore = createPageStore(serializer, maxEntries);
- pageStore.storePage(sessionId, new MockPage(pageId));
- pageStore.storePage(sessionId, new MockPage(pageId));
+ pageStore.addPage(context, new MockPage(pageId));
+ pageStore.addPage(context, new MockPage(pageId));
- assertNotNull(pageStore.getPage(sessionId, pageId));
+ assertNotNull(pageStore.getPage(context, pageId));
- pageStore.removePage(sessionId, pageId);
+ pageStore.removePage(context, new MockPage(pageId));
- assertNull(pageStore.getPage(sessionId, pageId));
+ assertNull(pageStore.getPage(context, pageId));
}
@Test
public void removePage()
{
- pageStore.storePage(sessionId, new MockPage(pageId));
+ IPageContext context = new DummyPageContext(sessionId);
+
+ pageStore.addPage(context, new MockPage(pageId));
- assertNotNull(pageStore.getPage(sessionId, pageId));
+ assertNotNull(pageStore.getPage(context, pageId));
- pageStore.removePage(sessionId, pageId);
+ pageStore.removePage(context, new MockPage(pageId));
- assertNull(pageStore.getPage(sessionId, pageId));
+ assertNull(pageStore.getPage(context, pageId));
}
/**
- * Verify that at most {@code maxEntries} per session can be put in the cache
+ * Verify that at most {@code maxEntries} per session can be put in the store
*/
@Test
public void maxSizeSameSession()
{
- pageStore.storePage(sessionId, new MockPage(pageId));
+ IPageContext context = new DummyPageContext(sessionId);
+
+ pageStore.addPage(context, new MockPage(pageId));
- assertNotNull(pageStore.getPage(sessionId, pageId));
+ assertNotNull(pageStore.getPage(context, pageId));
int pageId2 = 234;
- pageStore.storePage(sessionId, new MockPage(pageId2));
- assertNull(pageStore.getPage(sessionId, pageId));
- assertNotNull(pageStore.getPage(sessionId, pageId2));
+ pageStore.addPage(context, new MockPage(pageId2));
+ assertNull(pageStore.getPage(context, pageId));
+ assertNotNull(pageStore.getPage(context, pageId2));
}
/**
@@ -117,15 +123,16 @@ public abstract class AbstractPageStoreTest extends Assert
@Test
public void maxSizeDifferentSessions()
{
- String sessionId2 = "0987654321";
+ IPageContext context = new DummyPageContext(sessionId);
+ IPageContext context2 = new DummyPageContext("0987654321");
- pageStore.storePage(sessionId, new MockPage(pageId));
+ pageStore.addPage(context, new MockPage(pageId));
- assertNotNull(pageStore.getPage(sessionId, pageId));
+ assertNotNull(pageStore.getPage(context, pageId));
- pageStore.storePage(sessionId2, new MockPage(pageId));
+ pageStore.addPage(context2, new MockPage(pageId));
- assertNull(pageStore.getPage(sessionId, pageId));
- assertNotNull(pageStore.getPage(sessionId2, pageId));
+ assertNotNull(pageStore.getPage(context, pageId));
+ assertNotNull(pageStore.getPage(context2, pageId));
}
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java
index 7f5b2c1..7c0b0a7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java
@@ -21,7 +21,8 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import org.apache.wicket.versioning.InMemoryPageStore;
+import org.apache.wicket.MockPage;
+import org.apache.wicket.page.IManageablePage;
import org.junit.Test;
/**
@@ -29,17 +30,13 @@ import org.junit.Test;
*/
public class AsynchronousDataStoreTest
{
-// private static final IDataStore WRAPPED_DATA_STORE = new DiskDataStore("asyncDataStoreApp", new StoreSettings(null).getFileStoreFolder(), Bytes.kilobytes(1));
- private static final IDataStore WRAPPED_DATA_STORE = new InMemoryPageStore();
+ private static final IPageStore WRAPPED_PAGE_STORE = new InMemoryPageStore("test", Integer.MAX_VALUE);
/** the data store under test */
- private static final IDataStore DATA_STORE = new AsynchronousDataStore(WRAPPED_DATA_STORE, 100);
-
- /** the data for each page */
- private static final byte[] DATA = new byte[] { 1, 2, 3 };
+ private static final IPageStore ASYNC_PAGE_STORE = new AsynchronousPageStore(WRAPPED_PAGE_STORE, 100);
/** the used jsessionid's */
- private static final String[] SESSIONS = new String[] { "s1", "s2", "s3" };
+ private static final IPageContext[] CONTEXT = new IPageContext[] { createContext("s1"), createContext("s2"), createContext("s3")};
/** the ids for the stored/removed pages */
private static final int[] PAGE_IDS = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
@@ -74,7 +71,12 @@ public class AsynchronousDataStoreTest
}
LATCH.await();
executorService.shutdown();
- DATA_STORE.destroy();
+ ASYNC_PAGE_STORE.destroy();
+ }
+
+ private static IPageContext createContext(String sessionId)
+ {
+ return new DummyPageContext(sessionId);
}
private static abstract class AbstractTask implements Runnable
@@ -94,15 +96,20 @@ public class AsynchronousDataStoreTest
}
}
- protected String getSessionId()
+ protected IPageContext getPageContext()
{
- return SESSIONS[RND.nextInt(SESSIONS.length)];
+ return CONTEXT[RND.nextInt(CONTEXT.length)];
}
protected int getPageId()
{
return PAGE_IDS[RND.nextInt(PAGE_IDS.length)];
}
+
+ protected IManageablePage getPage()
+ {
+ return new MockPage(getPageId());
+ }
}
private static class StoreTask extends AbstractTask
@@ -110,7 +117,7 @@ public class AsynchronousDataStoreTest
@Override
public void r()
{
- DATA_STORE.storeData(getSessionId(), getPageId(), DATA);
+ ASYNC_PAGE_STORE.addPage(getPageContext(), getPage());
}
}
@@ -119,7 +126,7 @@ public class AsynchronousDataStoreTest
@Override
public void r()
{
- DATA_STORE.getData(getSessionId(), getPageId());
+ ASYNC_PAGE_STORE.getPage(getPageContext(), getPageId());
}
}
@@ -128,7 +135,7 @@ public class AsynchronousDataStoreTest
@Override
public void r()
{
- DATA_STORE.removeData(getSessionId(), getPageId());
+ ASYNC_PAGE_STORE.removePage(getPageContext(), getPage());
}
}
@@ -137,7 +144,7 @@ public class AsynchronousDataStoreTest
@Override
public void r()
{
- DATA_STORE.removeData(getSessionId());
+ ASYNC_PAGE_STORE.removeAllPages(getPageContext());
}
}
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java
index 4b17f69..1752e50 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousPageStoreTest.java
@@ -17,21 +17,19 @@
package org.apache.wicket.pageStore;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
+import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
-import com.google.common.base.Stopwatch;
import org.apache.commons.lang3.RandomUtils;
+import org.apache.wicket.mock.MockPageStore;
import org.apache.wicket.page.IManageablePage;
import org.apache.wicket.serialize.ISerializer;
import org.apache.wicket.serialize.java.DeflatedJavaSerializer;
@@ -43,6 +41,8 @@ import org.junit.experimental.categories.Category;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Stopwatch;
+
/**
* AsynchronousPageStoreTest
@@ -155,31 +155,50 @@ public class AsynchronousPageStoreTest
@Test
public void storeReturnsSameInstanceOnClosePageRequest() throws InterruptedException
{
+ final Semaphore semaphore = new Semaphore(0);
+
+ IPageStore store = new NoopPageStore() {
+
+ @Override
+ public synchronized void addPage(IPageContext context, IManageablePage page)
+ {
+ try
+ {
+ semaphore.acquire();
+ }
+ catch (InterruptedException e)
+ {
+ }
+
+ super.addPage(context, page);
+ }
+
+ @Override
+ public IManageablePage getPage(IPageContext context, int id)
+ {
+ fail();
+ return null;
+ }
+ };
- ISerializer serializer = new DeflatedJavaSerializer("applicationKey");
- // ISerializer serializer = new DummySerializer();
-
- IDataStore dataStore = new DiskDataStore("applicationName", new File("./target"),
- Bytes.bytes(10000l));
-
- // IPageStore pageStore = new DummyPageStore(new File("target/store"));
- IPageStore pageStore = spy(new DefaultPageStore(serializer, dataStore, 0));
-
- IPageStore asyncPageStore = new AsynchronousPageStore(pageStore, 100);
+ IPageStore asyncPageStore = new AsynchronousPageStore(store, 100);
int pageId = 0;
+
String sessionId = "sessionId";
+
+ IPageContext context = new DummyPageContext(sessionId);
DummyPage page = new DummyPage(pageId, 1000, 1000, sessionId);
- asyncPageStore.storePage(sessionId, page);
-
- Thread.sleep(500);
+ asyncPageStore.addPage(context, page);
- IManageablePage pageBack = asyncPageStore.getPage(sessionId, pageId);
+ IManageablePage pageBack = asyncPageStore.getPage(context, pageId);
- verify(pageStore, never()).getPage(sessionId, pageId);
+ semaphore.release();
assertEquals(page, pageBack);
+
+ store.destroy();
}
/**
@@ -191,31 +210,55 @@ public class AsynchronousPageStoreTest
@Test
public void storeReturnsRestoredInstanceOnDistantPageRequest() throws InterruptedException
{
+ final Semaphore semaphore = new Semaphore(0);
+
+ final AtomicBoolean got = new AtomicBoolean(false);
+
+ IPageStore store = new MockPageStore() {
+
+ @Override
+ public synchronized void addPage(IPageContext context, IManageablePage page)
+ {
+ super.addPage(context, page);
+
+ semaphore.release();
+ }
+
+ @Override
+ public IManageablePage getPage(IPageContext context, int id)
+ {
+ got.set(true);
+
+ return super.getPage(context, id);
+ }
+ };
- ISerializer serializer = new DeflatedJavaSerializer("applicationKey");
- // ISerializer serializer = new DummySerializer();
-
- IDataStore dataStore = new DiskDataStore("applicationName", new File("./target"),
- Bytes.bytes(10000l));
-
- // IPageStore pageStore = new DummyPageStore(new File("target/store"));
- IPageStore pageStore = spy(new DefaultPageStore(serializer, dataStore, 0));
-
- IPageStore asyncPageStore = new AsynchronousPageStore(pageStore, 100);
+ IPageStore asyncPageStore = new AsynchronousPageStore(store, 100);
int pageId = 0;
+
String sessionId = "sessionId";
+
+ IPageContext context = new DummyPageContext(sessionId);
DummyPage page = new DummyPage(pageId, 1000, 1000, sessionId);
- asyncPageStore.storePage(sessionId, page);
+ asyncPageStore.addPage(context, page);
- Thread.sleep(1500);
+ try
+ {
+ semaphore.acquire();
+ }
+ catch (InterruptedException e)
+ {
+ }
- IManageablePage pageBack = asyncPageStore.getPage(sessionId, pageId);
+ IManageablePage pageBack = asyncPageStore.getPage(context, pageId);
- verify(pageStore, times(1)).getPage(sessionId, pageId);
+ semaphore.release();
- assertNotEquals(page, pageBack);
+ assertEquals(page, pageBack);
+
+ store.destroy();
}
/**
@@ -315,18 +358,13 @@ public class AsynchronousPageStoreTest
// ISerializer serializer = new DummySerializer();
ISerializer serializer = new DeflatedJavaSerializer("applicationKey");
- IDataStore dataStore = new DiskDataStore("applicationName", new File("./target"),
- Bytes.bytes(10000l));
-
- // IPageStore pageStore = new DummyPageStore(new File("target/store")) {
- IPageStore pageStore = new DefaultPageStore(serializer, dataStore, 0)
- {
-
+ IPageStore pageStore = new DiskPageStore("applicationName", serializer, new File("./target"),
+ Bytes.bytes(10000l)) {
@Override
- public void storePage(String sessionId, IManageablePage page)
+ public void addPage(IPageContext context, IManageablePage page)
{
- super.storePage(sessionId, page);
+ super.addPage(context, page);
lock.countDown();
}
@@ -341,20 +379,21 @@ public class AsynchronousPageStoreTest
for (int i = 1; i <= sessions; i++)
{
String sessionId = String.valueOf(i);
+ IPageContext context = new DummyPageContext(sessionId);
Metrics metrics = new Metrics();
stopwatch.reset();
DummyPage page = new DummyPage(pageId, around(writeMillis), around(readMillis),
sessionId);
stopwatch.start();
- asyncPageStore.storePage(sessionId, page);
+ asyncPageStore.addPage(context, page);
metrics.storedPage = page;
metrics.storingMillis = stopwatch.elapsed(TimeUnit.MILLISECONDS);
stopwatch.reset();
stopwatch.start();
metrics.restoredPage = DummyPage.class
- .cast(asyncPageStore.getPage(sessionId, pageId));
+ .cast(asyncPageStore.getPage(context, pageId));
metrics.restoringMillis = stopwatch.elapsed(TimeUnit.MILLISECONDS);
results.add(metrics);
@@ -363,6 +402,8 @@ public class AsynchronousPageStoreTest
lock.await(pages * sessions * (writeMillis + readMillis), TimeUnit.MILLISECONDS);
+ pageStore.destroy();
+
return results;
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/DefaultPageStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/DefaultPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/DefaultPageStoreTest.java
deleted file mode 100644
index 2ffa376..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/DefaultPageStoreTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 org.apache.wicket.pageStore;
-
-import org.apache.wicket.serialize.ISerializer;
-
-/**
- * Tests for DefaultPageStore
- */
-public class DefaultPageStoreTest extends AbstractPageStoreTest
-{
- @Override
- protected IPageStore createPageStore(ISerializer serializer, IDataStore dataStore, int maxEntries)
- {
- return new DefaultPageStore(serializer, dataStore, maxEntries);
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java
index e69ead6..933870e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.wicket.pageStore;
+import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -26,6 +27,8 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.wicket.page.IManageablePage;
+import org.apache.wicket.serialize.java.JavaSerializer;
import org.apache.wicket.settings.StoreSettings;
import org.apache.wicket.util.SlowTests;
import org.apache.wicket.util.lang.Bytes;
@@ -36,6 +39,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
+ * Test for {@link DiskDataStore}.
*/
@Category(SlowTests.class)
public class DiskDataStoreTest extends Assert
@@ -59,20 +63,33 @@ public class DiskDataStoreTest extends Assert
private static final int SLEEP_MAX = 10;
private static final int THREAD_COUNT = 20;
private static final int READ_MODULO = 100;
+
+ private static final ConcurrentHashMap<String, IPageContext> contexts = new ConcurrentHashMap<>();
+
+ private static IPageContext getContext(String sessionId) {
+ IPageContext context = new DummyPageContext();
+
+ IPageContext existing = contexts.putIfAbsent(sessionId, context);
+ return existing != null ? existing : context;
+ }
- private static class File
+ private static class TaskPage implements IManageablePage
{
private final String sessionId;
- private final int id;
+
+ private int id;
- private byte first;
- private byte last;
- private int length;
+ private byte[] data;
- public File(String sessionId, int id)
+ public TaskPage(String sessionId, int id)
{
this.sessionId = sessionId;
+
this.id = id;
+
+ int length = FILE_SIZE_MIN + random.nextInt(FILE_SIZE_MAX - FILE_SIZE_MIN);
+ data = new byte[length];
+ random.nextBytes(data);
}
public String getSessionId()
@@ -80,51 +97,54 @@ public class DiskDataStoreTest extends Assert
return sessionId;
}
- public int getId()
+ public boolean check(TaskPage other)
{
- return id;
- }
-
- public byte[] generateData()
- {
- length = FILE_SIZE_MIN + random.nextInt(FILE_SIZE_MAX - FILE_SIZE_MIN);
- byte data[] = new byte[length];
- random.nextBytes(data);
- first = data[0];
- last = data[data.length - 1];
- return data;
- }
-
- public boolean checkData(byte data[])
- {
- if (data == null)
- {
- log.error("data[] should never be null");
- return false;
- }
- if (data.length != length)
+ if (other.data.length != other.data.length)
{
log.error("data.length != length");
return false;
}
- if (first != data[0])
+ if (other.id != other.id)
{
- log.error("first != data[0]");
+ log.error("data.id != id");
return false;
}
- if (last != data[data.length - 1])
+ if (other.sessionId != other.sessionId)
{
- log.error("last != data[data.length - 1]");
+ log.error("data.sessionId != sessionId");
return false;
}
return true;
}
+
+ @Override
+ public boolean isPageStateless()
+ {
+ return false;
+ }
+
+ @Override
+ public int getPageId()
+ {
+ return id;
+ }
+
+ @Override
+ public void detach()
+ {
+ }
+
+ @Override
+ public boolean setFreezePageId(boolean freeze)
+ {
+ return false;
+ }
}
private final Map<String, AtomicInteger> sessionCounter = new ConcurrentHashMap<String, AtomicInteger>();
- private final ConcurrentLinkedQueue<File> filesToSave = new ConcurrentLinkedQueue<File>();
- private final ConcurrentLinkedQueue<File> filesToRead1 = new ConcurrentLinkedQueue<File>();
- private final ConcurrentLinkedQueue<File> filesToRead2 = new ConcurrentLinkedQueue<File>();
+ private final ConcurrentLinkedQueue<TaskPage> pagesToSave = new ConcurrentLinkedQueue<TaskPage>();
+ private final ConcurrentLinkedQueue<TaskPage> filesToRead1 = new ConcurrentLinkedQueue<TaskPage>();
+ private final ConcurrentLinkedQueue<TaskPage> filesToRead2 = new ConcurrentLinkedQueue<TaskPage>();
private final AtomicInteger read1Count = new AtomicInteger(0);
private final AtomicInteger read2Count = new AtomicInteger(0);
@@ -164,15 +184,15 @@ public class DiskDataStoreTest extends Assert
for (int i = 0; i < FILES_COUNT; ++i)
{
String session = randomSessionId();
- File file = new File(session, nextSessionId(session));
+ TaskPage file = new TaskPage(session, nextSessionId(session));
long now = System.nanoTime();
- filesToSave.add(file);
+ pagesToSave.add(file);
long duration = System.nanoTime() - now;
saveTime.addAndGet((int)duration);
}
}
- private IDataStore dataStore;
+ private IPageStore pageStore;
/**
* Stores RuntimeException into a field.
@@ -205,21 +225,20 @@ public class DiskDataStoreTest extends Assert
@Override
protected void doRun()
{
- File file;
+ TaskPage page;
- while ((file = filesToSave.poll()) != null || saveCount.get() < FILES_COUNT)
+ while ((page = pagesToSave.poll()) != null || saveCount.get() < FILES_COUNT)
{
- if (file != null)
+ if (page != null)
{
- byte data[] = file.generateData();
- dataStore.storeData(file.getSessionId(), file.getId(), data);
+ pageStore.addPage(getContext(page.getSessionId()), page);
if (saveCount.get() % READ_MODULO == 0)
{
- filesToRead1.add(file);
+ filesToRead1.add(page);
}
saveCount.incrementAndGet();
- bytesWritten.addAndGet(data.length);
+ bytesWritten.addAndGet(page.data.length);
}
try
@@ -242,20 +261,20 @@ public class DiskDataStoreTest extends Assert
@Override
protected void doRun()
{
- File file;
- while ((file = filesToRead1.poll()) != null || !saveDone.get())
+ TaskPage page;
+ while ((page = filesToRead1.poll()) != null || !saveDone.get())
{
- if (file != null)
+ if (page != null)
{
- byte bytes[] = dataStore.getData(file.getSessionId(), file.getId());
- if (file.checkData(bytes) == false)
+ TaskPage other = (TaskPage)pageStore.getPage(getContext(page.getSessionId()), page.getPageId());
+ if (page.check(other) == false)
{
failures.incrementAndGet();
log.error("Detected error number: " + failures.get());
}
- filesToRead2.add(file);
+ filesToRead2.add(page);
read1Count.incrementAndGet();
- bytesRead.addAndGet(bytes.length);
+ bytesRead.addAndGet(other.data.length);
}
try
@@ -277,19 +296,19 @@ public class DiskDataStoreTest extends Assert
@Override
protected void doRun()
{
- File file;
- while ((file = filesToRead2.poll()) != null || !read1Done.get())
+ TaskPage page;
+ while ((page = filesToRead2.poll()) != null || !read1Done.get())
{
- if (file != null)
+ if (page != null)
{
- byte bytes[] = dataStore.getData(file.getSessionId(), file.getId());
- if (file.checkData(bytes) == false)
+ TaskPage other = (TaskPage)pageStore.getPage(getContext(page.getSessionId()), page.getPageId());
+ if (page.check(other) == false)
{
failures.incrementAndGet();
log.error("Detected error number: " + failures.get());
}
read2Count.incrementAndGet();
- bytesRead.addAndGet(bytes.length);
+ bytesRead.addAndGet(other.data.length);
}
try
@@ -356,7 +375,7 @@ public class DiskDataStoreTest extends Assert
for (String s : sessionCounter.keySet())
{
- dataStore.removeData(s);
+ pageStore.removeAllPages(getContext(s));
}
}
@@ -369,15 +388,15 @@ public class DiskDataStoreTest extends Assert
generateFiles();
StoreSettings storeSettings = new StoreSettings(null);
- java.io.File fileStoreFolder = storeSettings.getFileStoreFolder();
-
- dataStore = new DiskDataStore("app1", fileStoreFolder, MAX_SIZE_PER_SESSION);
+ File fileStoreFolder = storeSettings.getFileStoreFolder();
int asynchronousQueueCapacity = storeSettings.getAsynchronousQueueCapacity();
- dataStore = new AsynchronousDataStore(dataStore, asynchronousQueueCapacity);
+
+ pageStore = new DiskPageStore("app1", new JavaSerializer("app1"), fileStoreFolder, MAX_SIZE_PER_SESSION);
+ pageStore = new AsynchronousPageStore(pageStore, asynchronousQueueCapacity);
doTestDataStore();
- dataStore.destroy();
+ pageStore.destroy();
}
/**
@@ -391,7 +410,7 @@ public class DiskDataStoreTest extends Assert
{
StoreSettings storeSettings = new StoreSettings(null);
java.io.File fileStoreFolder = storeSettings.getFileStoreFolder();
- DiskDataStore store = new DiskDataStore("sessionFolderName", fileStoreFolder, MAX_SIZE_PER_SESSION);
+ DiskPageStore store = new DiskPageStore("sessionFolderName", new JavaSerializer("sessionFolderName"), fileStoreFolder, MAX_SIZE_PER_SESSION);
String sessionId = "abcdefg";
java.io.File sessionFolder = store.getSessionFolder(sessionId, true);
@@ -401,7 +420,7 @@ public class DiskDataStoreTest extends Assert
assertTrue(absolutePath.contains("1279"));
assertTrue(absolutePath.contains("abcdefg"));
- DiskDataStore.SessionEntry sessionEntry = new DiskDataStore.SessionEntry(store, sessionId);
+ DiskPageStore.DiskData sessionEntry = new DiskPageStore.DiskData(store, sessionId);
sessionEntry.unbind();
// assert that the 'sessionId' folder and the parents two levels up are removed
assertFalse(sessionFolder.getParentFile().getParentFile().exists());
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/DummyPageContext.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/DummyPageContext.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/DummyPageContext.java
new file mode 100644
index 0000000..0cd0b08
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/DummyPageContext.java
@@ -0,0 +1,103 @@
+/*
+ * 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 org.apache.wicket.pageStore;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.wicket.MetaDataEntry;
+import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.pageStore.IPageContext;
+
+/**
+ * Dummy implementation of a page context - suitable for a single session only.
+ */
+public class DummyPageContext implements IPageContext
+{
+
+ final String sessionId;
+
+ MetaDataEntry<?>[] requestData;
+
+ MetaDataEntry<?>[] sessionData;
+
+ Map<String, Object> sessionAttributes = new HashMap<>();
+
+ public DummyPageContext()
+ {
+ this("dummy_id");
+ }
+
+ public DummyPageContext(String sessionId)
+ {
+ this.sessionId = sessionId;
+ }
+
+ @Override
+ public <T> void setRequestData(MetaDataKey<T> key, T value)
+ {
+ requestData = key.set(requestData, value);
+ }
+
+ @Override
+ public <T> T getRequestData(MetaDataKey<T> key)
+ {
+ return key.get(requestData);
+ }
+
+ @Override
+ public <T extends Serializable> void setSessionAttribute(String key, T value)
+ {
+ sessionAttributes.put(key, value);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T extends Serializable> T getSessionAttribute(String key)
+ {
+ return (T)sessionAttributes.get(key);
+ }
+
+ @Override
+ public <T extends Serializable> void setSessionData(MetaDataKey<T> key, T value)
+ {
+ sessionData = key.set(sessionData, value);
+ }
+
+ @Override
+ public <T extends Serializable> T getSessionData(MetaDataKey<T> key)
+ {
+ return key.get(sessionData);
+ }
+
+ @Override
+ public void bind()
+ {
+ }
+
+ @Override
+ public String getSessionId()
+ {
+ return sessionId;
+ }
+
+ public void clearRequest()
+ {
+ requestData = null;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/GroupingPageStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/GroupingPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/GroupingPageStoreTest.java
new file mode 100644
index 0000000..b863074
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/GroupingPageStoreTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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 org.apache.wicket.pageStore;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.Serializable;
+
+import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.MockPage;
+import org.apache.wicket.mock.MockPageStore;
+import org.apache.wicket.page.IManageablePage;
+import org.junit.Test;
+
+/**
+ * Test for {@link GroupingPageStore}.
+ *
+ * @author svenmeier
+ */
+public class GroupingPageStoreTest
+{
+
+ private static MetaDataKey<Serializable> KEY = new MetaDataKey<Serializable>()
+ {
+ };
+
+ private static Serializable VALUE = new Serializable()
+ {
+ };
+
+ @Test
+ public void test()
+ {
+ String sessionId = "foo";
+
+ IPageStore store = new MockPageStore() {
+
+ public void addPage(IPageContext context, IManageablePage page) {
+
+ context.setSessionAttribute("attribute", "value");
+ context.setSessionData(KEY, VALUE);
+
+ assertEquals(sessionId + "_" + group(page), context.getSessionId());
+
+ super.addPage(context, page);
+ }
+
+ @Override
+ public void removeAllPages(IPageContext context)
+ {
+ assertEquals(sessionId + "_group0", context.getSessionId());
+
+ super.removeAllPages(context);
+ }
+ };
+
+ IPageStore groupingStore = new GroupingPageStore(store, 2) {
+ @Override
+ protected String getGroup(IManageablePage page)
+ {
+ return group(page);
+ }
+ };
+
+ DummyPageContext context = new DummyPageContext(sessionId) {
+ @Override
+ public <T extends Serializable> void setSessionData(MetaDataKey<T> key, T value)
+ {
+ assertFalse("session not set directly in session", value == VALUE);
+
+ super.setSessionData(key, value);
+ }
+
+ @Override
+ public <T extends Serializable> void setSessionAttribute(String key, T value)
+ {
+ assertTrue("key starts with group", key.startsWith("attribute_group"));
+
+ super.setSessionAttribute(key, value);
+ }
+ };
+
+ groupingStore.addPage(context, new MockPage(0));
+ groupingStore.addPage(context, new MockPage(1));
+ groupingStore.addPage(context, new MockPage(10));
+ groupingStore.addPage(context, new MockPage(11));
+ groupingStore.addPage(context, new MockPage(2));
+ groupingStore.addPage(context, new MockPage(21));
+
+ }
+
+ protected String group(IManageablePage page)
+ {
+ return "group" + page.getPageId() / 10;
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/InMemoryPageStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/InMemoryPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/InMemoryPageStoreTest.java
new file mode 100644
index 0000000..ab1dcec
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/InMemoryPageStoreTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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 org.apache.wicket.pageStore;
+
+import org.apache.wicket.serialize.ISerializer;
+
+/**
+ * Tests for {@link InMemoryPageStore}
+ */
+public class InMemoryPageStoreTest extends AbstractPageStoreTest
+{
+ @Override
+ protected IPageStore createPageStore(ISerializer serializer, int maxEntries)
+ {
+ return new InMemoryPageStore("test", maxEntries);
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/InSessionPageStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/InSessionPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/InSessionPageStoreTest.java
new file mode 100644
index 0000000..4fa2f4e
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/InSessionPageStoreTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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 org.apache.wicket.pageStore;
+
+import org.apache.wicket.serialize.ISerializer;
+
+/**
+ * Test for {@link InSessionPageStore}.
+ */
+public class InSessionPageStoreTest extends AbstractPageStoreTest
+{
+ @Override
+ protected IPageStore createPageStore(ISerializer serializer, int maxEntries)
+ {
+ return new InSessionPageStore(new NoopPageStore(), serializer, maxEntries);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/NoopDataStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/NoopDataStore.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/NoopDataStore.java
deleted file mode 100644
index 0cadaee..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/NoopDataStore.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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 org.apache.wicket.pageStore;
-
-/**
- * An implementation of IDataStore that does nothing
- */
-public class NoopDataStore implements IDataStore
-{
- @Override
- public byte[] getData(String sessionId, int id)
- {
- return null;
- }
-
- @Override
- public void removeData(String sessionId, int id)
- {
- }
-
- @Override
- public void removeData(String sessionId)
- {
- }
-
- @Override
- public void storeData(String sessionId, int id, byte[] data)
- {
- }
-
- @Override
- public void destroy()
- {
- }
-
- @Override
- public boolean isReplicated()
- {
- return false;
- }
-
- @Override
- public boolean canBeAsynchronous()
- {
- return false;
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/PerSessionPageStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/PerSessionPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/PerSessionPageStoreTest.java
deleted file mode 100644
index 0cd4a2a..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/PerSessionPageStoreTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 org.apache.wicket.pageStore;
-
-import org.apache.wicket.MockPage;
-import org.apache.wicket.serialize.ISerializer;
-import org.junit.Test;
-
-/**
- * Tests for PerSessionPageStore
- */
-public class PerSessionPageStoreTest extends AbstractPageStoreTest
-{
- @Override
- protected IPageStore createPageStore(ISerializer serializer, IDataStore dataStore, int maxEntries)
- {
- return new PerSessionPageStore(serializer, dataStore, maxEntries);
- }
-
- /**
- * Verify that it is OK to store more pages than {@code maxEntries}
- * if they are in different sessions
- */
- @Test
- @Override
- public void maxSizeDifferentSessions()
- {
- String sessionId2 = "0987654321";
-
- pageStore.storePage(sessionId, new MockPage(pageId));
-
- assertNotNull(pageStore.getPage(sessionId, pageId));
-
- pageStore.storePage(sessionId2, new MockPage(pageId));
-
- assertNotNull(pageStore.getPage(sessionId, pageId));
- assertNotNull(pageStore.getPage(sessionId2, pageId));
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java
new file mode 100644
index 0000000..57ce54d
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java
@@ -0,0 +1,303 @@
+/*
+ * 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 org.apache.wicket.pageStore.disk;
+
+import java.security.SecureRandom;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.pageStore.disk.PageWindowManager.FileWindow;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test for {@link PageWindowManager}.
+ *
+ * @author Matej Knopp
+ */
+public class PageWindowManagerTest extends Assert
+{
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-4572
+ */
+ @Test
+ public void removeObsoleteIndices()
+ {
+ int page0id = 0,
+ page1id = 1,
+ page2id = 2;
+ int maxSize = 10;
+
+ PageWindowManager manager = new PageWindowManager(maxSize);
+
+ // Add few pages.
+ // All of them fully occupy the max space in the pageWindowManager.
+ // So adding N+1st page removes the Nth page.
+ manager.createPageWindow(page0id, WebPage.class, maxSize);
+ FileWindow page0Window = manager.getPageWindow(page0id);
+ assertWindow(page0Window, page0id, page0Window.getFilePartOffset(), page0Window.getFilePartSize());
+
+ manager.createPageWindow(page1id, WebPage.class, maxSize);
+ FileWindow page1Window = manager.getPageWindow(page1id);
+ assertWindow(page1Window, page1id, page1Window.getFilePartOffset(), page1Window.getFilePartSize());
+
+ // Try to get a page which has been lost with the adding of page1
+ assertNull("Page0 must be lost when Page1 has been added.", manager.getPageWindow(page0id));
+
+ manager.createPageWindow(page2id, WebPage.class, maxSize);
+ FileWindow page2Window = manager.getPageWindow(page2id);
+ assertWindow(page2Window, page2id, page2Window.getFilePartOffset(), page2Window.getFilePartSize());
+
+ // Try to get a page which has been lost with the adding of page2
+ assertNull("Page1 must be lost when Page2 has been added.", manager.getPageWindow(page1id));
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void addRemove()
+ {
+ PageWindowManager manager = new PageWindowManager(300);
+ FileWindow window;
+
+ window = manager.createPageWindow(1, WebPage.class, 50);
+ assertWindow(window, 1, 0, 50);
+
+ window = manager.createPageWindow(2, WebPage.class, 40);
+ assertWindow(window, 2, 50, 40);
+
+ assertEquals(manager.getTotalSize(), 90);
+
+ window = manager.createPageWindow(2, WebPage.class, 30);
+ assertWindow(window, 2, 50, 30);
+ assertEquals(manager.getTotalSize(), 80);
+
+ manager.removePage(2);
+ assertEquals(manager.getTotalSize(), 50);
+
+ window = manager.createPageWindow(3, WebPage.class, 30);
+ assertWindow(window, 3, 50, 30);
+ assertEquals(manager.getTotalSize(), 80);
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void pageWindowCycle()
+ {
+ PageWindowManager manager = new PageWindowManager(100);
+ FileWindow window;
+
+ window = manager.createPageWindow(1, WebPage.class, 30);
+
+ window = manager.createPageWindow(2, WebPage.class, 30);
+
+ window = manager.createPageWindow(3, WebPage.class, 30);
+
+ assertWindow(window, 3, 60, 30);
+
+ window = manager.createPageWindow(4, WebPage.class, 30);
+
+ assertWindow(window, 4, 90, 30);
+
+ // should start at the beginging
+
+ window = manager.createPageWindow(5, WebPage.class, 20);
+
+ assertWindow(window, 5, 0, 20);
+
+ assertNull(manager.getPageWindow(1));
+
+ window = manager.getPageWindow(2);
+ assertWindow(window, 2, 30, 30);
+
+ window = manager.createPageWindow(6, WebPage.class, 10);
+
+ assertWindow(window, 6, 20, 10);
+
+ window = manager.getPageWindow(2);
+ assertWindow(window, 2, 30, 30);
+
+ window = manager.createPageWindow(6, WebPage.class, 30);
+ assertWindow(window, 6, 20, 30);
+
+ assertNull(manager.getPageWindow(2));
+ assertNotNull(manager.getPageWindow(3));
+
+ window = manager.createPageWindow(6, WebPage.class, 60);
+ assertWindow(window, 6, 20, 60);
+
+ assertNull(manager.getPageWindow(3));
+
+ window = manager.createPageWindow(7, WebPage.class, 20);
+ assertWindow(window, 7, 80, 20);
+
+ assertNotNull(manager.getPageWindow(7));
+
+ // should start at the beginning again
+
+ window = manager.createPageWindow(8, WebPage.class, 10);
+ assertWindow(window, 8, 0, 10);
+
+ assertNull(manager.getPageWindow(5));
+ assertNotNull(manager.getPageWindow(6));
+
+ window = manager.createPageWindow(9, WebPage.class, 20);
+ assertWindow(window, 9, 10, 20);
+
+ assertNull(manager.getPageWindow(6));
+ assertNotNull(manager.getPageWindow(7));
+
+ window = manager.createPageWindow(10, WebPage.class, 20);
+ assertWindow(window, 10, 30, 20);
+
+ assertNull(manager.getPageWindow(6));
+ assertNotNull(manager.getPageWindow(7));
+
+ // make sure when replacing a page that's not last the old "instance" is
+ // not valid anymore
+
+ manager.createPageWindow(8, WebPage.class, 10);
+
+ window = manager.getPageWindow(8);
+ assertWindow(window, 8, 50, 10);
+ }
+
+
+ private void assertWindow(FileWindow window, int pageId, int filePartOffset, int filePartSize)
+ {
+ assertTrue(window.getPageId() == pageId && window.getFilePartOffset() == filePartOffset &&
+ window.getFilePartSize() == filePartSize);
+ }
+
+ /** how many operations to execute */
+ private static final int EXECUTIONS = 10000;
+
+ /** used to wait the executions */
+ private static final CountDownLatch LATCH = new CountDownLatch(EXECUTIONS);
+
+ private final PageWindowManager pageWindowManager = new PageWindowManager(1000L);
+
+ /** the execution types */
+ private final Runnable[] TASKS = new Runnable[]
+ {
+ new CreatePageWindowTask(pageWindowManager),
+ new GetPageWindowTask(pageWindowManager),
+ new RemovePageInSessionTask(pageWindowManager)
+ };
+
+ private static final SecureRandom RND = new SecureRandom();
+
+ /**
+ * Executes random mutator and accessor operations on {@link org.apache.wicket.pageStore.AsynchronousDataStore} validating
+ * that the used data structures can be used simultaneously.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void randomOperations() throws Exception
+ {
+ ExecutorService executorService = Executors.newFixedThreadPool(50);
+
+ for (int i = 0; i < EXECUTIONS; i++)
+ {
+ Runnable task = TASKS[RND.nextInt(TASKS.length)];
+ executorService.submit(task);
+ }
+ LATCH.await();
+ executorService.shutdown();
+ }
+
+ private static abstract class AbstractTask implements Runnable
+ {
+ /** the ids for the stored/removed pages */
+ private static final int[] PAGE_IDS = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+
+ protected final PageWindowManager pageWindowManager;
+
+ private AbstractTask(PageWindowManager pageWindowManager)
+ {
+ this.pageWindowManager = pageWindowManager;
+ }
+
+ protected abstract void r();
+
+ @Override
+ public void run()
+ {
+ try
+ {
+ r();
+ }
+ finally
+ {
+ LATCH.countDown();
+ }
+ }
+
+ protected int getPageId()
+ {
+ return PAGE_IDS[RND.nextInt(PAGE_IDS.length)];
+ }
+ }
+
+ private static class CreatePageWindowTask extends AbstractTask
+ {
+ private CreatePageWindowTask(PageWindowManager pageWindowManager)
+ {
+ super(pageWindowManager);
+ }
+
+ @Override
+ public void r()
+ {
+ pageWindowManager.createPageWindow(getPageId(), WebPage.class, 1000);
+ }
+ }
+
+ private static class GetPageWindowTask extends AbstractTask
+ {
+ private GetPageWindowTask(PageWindowManager pageWindowManager)
+ {
+ super(pageWindowManager);
+ }
+
+ @Override
+ public void r()
+ {
+ pageWindowManager.getPageWindow(getPageId());
+ }
+ }
+
+ private static class RemovePageInSessionTask extends AbstractTask
+ {
+ private RemovePageInSessionTask(PageWindowManager pageWindowManager)
+ {
+ super(pageWindowManager);
+ }
+
+ @Override
+ public void r()
+ {
+ pageWindowManager.removePage(getPageId());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java
deleted file mode 100644
index 99d4c90..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/DummyPageManagerContext.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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 org.apache.wicket.pageStore.memory;
-
-import java.io.Serializable;
-
-import org.apache.wicket.page.IPageManagerContext;
-
-/**
- */
-public class DummyPageManagerContext implements IPageManagerContext
-{
-
- Serializable attribute = null;
- Object requestData;
-
- @Override
- public void setRequestData(Object data)
- {
- requestData = data;
- }
-
- @Override
- public Object getRequestData()
- {
- return requestData;
- }
-
- @Override
- public void setSessionAttribute(String key, Serializable value)
- {
- attribute = value;
- }
-
- @Override
- public Serializable getSessionAttribute(String key)
- {
- return attribute;
- }
-
- @Override
- public void bind()
- {
- }
-
- @Override
- public String getSessionId()
- {
- return "dummy_id";
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java
deleted file mode 100644
index 10b5268..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/HttpSessionDataStoreTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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 org.apache.wicket.pageStore.memory;
-
-import static org.junit.Assert.assertArrayEquals;
-
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- */
-public class HttpSessionDataStoreTest extends WicketTestCase
-{
- final String sessionId = "anything";
-
- final int pageId = 1;
-
- final byte[] PAGE1 = new byte[] { 1 };
- final byte[] PAGE2 = new byte[] { 2 };
-
- HttpSessionDataStore store;
-
- /**
- * before()
- */
- @Before
- public void before()
- {
- store = new HttpSessionDataStore(new DummyPageManagerContext(), new NoopEvictionStrategy());
- }
-
- /**
- * after()
- */
- @After
- public void after()
- {
- store.destroy();
- }
-
- /**
- * storePage()
- */
- @Test
- public void storePage()
- {
- assertNull(store.getData(sessionId, pageId));
-
- store.storeData(sessionId, pageId, PAGE1);
- assertArrayEquals(PAGE1, store.getData(sessionId, pageId));
- }
-
- /**
- * removePage1()
- */
- @Test
- public void removePage1()
- {
- assertNull(store.getData(sessionId, pageId));
-
- store.storeData(sessionId, pageId, PAGE1);
-
- assertNotNull(store.getData(sessionId, pageId));
-
- store.removeData(sessionId, pageId);
-
- assertNull(store.getData(sessionId, pageId));
- }
-
- /**
- * removePage2()
- */
- @Test
- public void removePage2()
- {
- assertNull(store.getData(sessionId, pageId));
-
- store.storeData(sessionId, pageId, PAGE1);
-
- assertNotNull(store.getData(sessionId, pageId));
-
- store.removeData(sessionId);
-
- assertNull(store.getData(sessionId, pageId));
- }
-
-
- private static final class NoopEvictionStrategy implements IDataStoreEvictionStrategy
- {
-
- @Override
- public void evict(PageTable pageTable)
- {
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java
deleted file mode 100644
index 50033fa..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/MemorySizeEvictionStrategyTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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 org.apache.wicket.pageStore.memory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import org.apache.wicket.util.lang.Bytes;
-import org.apache.wicket.core.util.lang.WicketObjects;
-import org.junit.Test;
-
-/***/
-public class MemorySizeEvictionStrategyTest
-{
- final byte[] PAGE1 = new byte[] { 1 };
- final byte[] PAGE2 = new byte[] { 2, 3 };
-
- /***/
- @Test
- public void evict()
- {
- PageTable pageTable = new PageTable();
-
- long sizeOfEmptyPageTable = WicketObjects.sizeof(pageTable);
-
- // evict to empty page table
- MemorySizeEvictionStrategy strategy = new MemorySizeEvictionStrategy(
- Bytes.bytes(sizeOfEmptyPageTable));
- pageTable.storePage(PAGE1.length, PAGE1);
- assertEquals(1, pageTable.size());
- strategy.evict(pageTable);
- assertEquals(0, pageTable.size());
- long currentSize = WicketObjects.sizeof(pageTable);
- assertTrue("Current size: |" + currentSize + "|, strategy size: |" + sizeOfEmptyPageTable +
- "|", currentSize <= sizeOfEmptyPageTable);
-
- // evict to page table with size: empty + PAGE2
- pageTable.storePage(PAGE2.length, PAGE2);
- long sizeOfWithPage2 = WicketObjects.sizeof(pageTable);
- strategy = new MemorySizeEvictionStrategy(Bytes.bytes(sizeOfWithPage2));
- pageTable.storePage(PAGE1.length, PAGE1);
- assertEquals(2, pageTable.size());
- strategy.evict(pageTable);
- // the following assertion depends on the fact that PAGE2 has
- // bigger size than PAGE1
- assertEquals(1, pageTable.size());
- currentSize = WicketObjects.sizeof(pageTable);
- assertTrue("Current size: |" + currentSize + "|, strategy size: |" + sizeOfWithPage2 + "|",
- currentSize <= sizeOfWithPage2);
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java
deleted file mode 100644
index d3bf35b..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/PageNumberEvictionStrategyTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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 org.apache.wicket.pageStore.memory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import org.junit.Test;
-
-/***/
-public class PageNumberEvictionStrategyTest
-{
-
- final byte[] PAGE1 = new byte[] { 1 };
- final byte[] PAGE2 = new byte[] { 2, 3 };
-
- /***/
- @Test
- public void evict()
- {
- // evict to page table with one page only
- PageNumberEvictionStrategy strategy = new PageNumberEvictionStrategy(1);
-
- PageTable pageTable = new PageTable();
-
- pageTable.storePage(PAGE1.length, PAGE1);
- assertEquals(1, pageTable.size());
- strategy.evict(pageTable);
- assertEquals(1, pageTable.size());
- assertNotNull(pageTable.getPage(PAGE1.length));
-
- pageTable.storePage(PAGE2.length, PAGE2);
- assertEquals(2, pageTable.size());
- strategy.evict(pageTable);
- assertEquals(1, pageTable.size());
- assertNotNull(pageTable.getPage(PAGE2.length));
- assertNull(pageTable.getPage(PAGE1.length));
- }
-
- /**
- * The number of pages must be at least '1'
- */
- @Test(expected = IllegalArgumentException.class)
- public void greaterThanZero()
- {
- new PageNumberEvictionStrategy(0);
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/bcf76f51/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java
deleted file mode 100644
index 062068f..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/memory/PageTableTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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 org.apache.wicket.pageStore.memory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import org.junit.Test;
-
-/***/
-public class PageTableTest
-{
-
- final byte[] data = new byte[] { 1 };
-
- /***/
- @Test
- public void getOldest()
- {
- PageTable pageTable = new PageTable();
-
- assertNull(pageTable.getOldest());
-
- pageTable.storePage(1, data);
- // index: 1
- assertEquals(Integer.valueOf(1), pageTable.getOldest());
-
- pageTable.storePage(2, data);
- // index: 2, 1
- assertEquals(Integer.valueOf(1), pageTable.getOldest());
-
- pageTable.storePage(3, data);
- // index: 3, 2, 1
- assertEquals(Integer.valueOf(1), pageTable.getOldest());
-
- pageTable.getPage(1);
- // index: 1, 3, 2
- assertEquals(Integer.valueOf(2), pageTable.getOldest());
-
- pageTable.removePage(2);
- // index: 1, 3
- assertEquals(Integer.valueOf(3), pageTable.getOldest());
- }
-}