package net.contextfw.web.commons.cloud.storage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import net.contextfw.web.application.WebApplication;
import net.contextfw.web.application.PageHandle;
import net.contextfw.web.application.configuration.Configuration;
import net.contextfw.web.application.scope.ScopedWebApplicationExecution;
import net.contextfw.web.application.scope.WebApplicationStorage;
import net.contextfw.web.commons.cloud.internal.serializer.Serializer;
import org.apache.commons.lang.mutable.MutableBoolean;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class BasicStorageTest extends AbstractStorageTest {
private static final String I_WAS_CHANGED = "I was changed";
private static final String SCOPED1 = "Scoped1";
@Inject
private SingletonScoped singletonScoped;
@Inject
Provider<WebApplicationMock> webApplicationProvider;
@Inject
protected Serializer serializer;
@Inject
protected Configuration configuration;
private WebApplicationStorage storage;
private WebApplicationStorage getStorage() {
return new MongoWebApplicationStorage(db, configuration, serializer);
}
@Before
public void setupStorage() {
storage = getStorage();
}
private ScopedWebApplicationExecution mockExecution(WebApplication application) {
ScopedWebApplicationExecution mock =
createStrictMock(ScopedWebApplicationExecution.class);
mock.execute(application);
regMock(mock);
return mock;
}
private PageHandle initWebApplication() {
WebApplicationMock app = webApplicationProvider.get();
app.getScoped1().setMsg(SCOPED1);
app.getScoped2().setMsg("Scoped2");
storage.initialize(app,
mockRequest(RequestExpect.WITH_REMOTE_ADDR),
System.currentTimeMillis() + 1100,
mockExecution(app));
return app.getHandle();
}
@Test
public void WebApplication_Is_Initialized() {
final PageHandle handle = initWebApplication();
assertNotNull(handle);
final MutableBoolean executionCalled = new MutableBoolean(false);
ScopedWebApplicationExecution execution = new ScopedWebApplicationExecution() {
public void execute(WebApplication application) {
WebApplicationMock mock = (WebApplicationMock) application;
assertSame(singletonScoped, mock.getSingletonScoped());
assertNotNull(mock.getScoped1());
assertNotNull(mock.getScoped2());
assertEquals(SCOPED1, mock.getScoped1().getMsg());
assertNull(mock.getScoped2().getMsg());
assertEquals(handle, mock.getHandle());
executionCalled.setValue(true);
}
};
storage.update(handle,
mockRequest(RequestExpect.WITH_REMOTE_ADDR),
System.currentTimeMillis() + 1000,
execution);
assertTrue(executionCalled.booleanValue());
}
@Test
public void WebApplication_Is_Removed() {
final PageHandle handle = initWebApplication();
assertNotNull(handle);
final MutableBoolean executionCalled = new MutableBoolean(false);
ScopedWebApplicationExecution execution = new ScopedWebApplicationExecution() {
public void execute(WebApplication application) {
assertNull(application);
executionCalled.setValue(true);
}
};
storage.remove(handle, mockRequest(RequestExpect.WITH_REMOTE_ADDR));
storage.update(handle,
mockRequest(RequestExpect.WITH_REMOTE_ADDR),
System.currentTimeMillis() + 1000,
execution);
assertTrue(executionCalled.booleanValue());
}
@Test
public void Execute_And_Update_With_Existing_WebApplication() {
final PageHandle handle = initWebApplication();
ScopedWebApplicationExecution changeExecution = new ScopedWebApplicationExecution() {
public void execute(WebApplication application) {
assertNotNull(application);
WebApplicationMock mock = (WebApplicationMock) application;
mock.getScoped1().setMsg(I_WAS_CHANGED);
}
};
storage.execute(handle, changeExecution);
final MutableBoolean executionCalled = new MutableBoolean(false);
ScopedWebApplicationExecution verifyExecution = new ScopedWebApplicationExecution() {
public void execute(WebApplication application) {
WebApplicationMock mock = (WebApplicationMock) application;
assertEquals(I_WAS_CHANGED, mock.getScoped1().getMsg());
executionCalled.setValue(true);
}
};
storage.execute(handle, verifyExecution);
assertTrue(executionCalled.booleanValue());
}
@Test
public void Execute_With_Non_Exisiting_WebApplication() {
final MutableBoolean executionCalled = new MutableBoolean(false);
ScopedWebApplicationExecution execution = new ScopedWebApplicationExecution() {
public void execute(WebApplication application) {
assertNull(application);
executionCalled.setValue(true);
}
};
storage.execute(new PageHandle("foo"), execution);
assertTrue(executionCalled.booleanValue());
}
@Test
public void WebApplication_Is_Refreshed() {
final PageHandle handle = initWebApplication();
sleep(500);
storage.refresh(handle,
mockRequest(RequestExpect.WITH_REMOTE_ADDR),
System.currentTimeMillis() + 1500);
sleep(1000);
final MutableBoolean executionCalled = new MutableBoolean(false);
ScopedWebApplicationExecution execution = new ScopedWebApplicationExecution() {
public void execute(WebApplication application) {
assertNotNull(application);
executionCalled.setValue(true);
}
};
storage.execute(handle, execution);
assertTrue(executionCalled.booleanValue());
}
@Test
public void WebApplication_Is_Expired() {
final PageHandle handle = initWebApplication();
final MutableBoolean executionCalled = new MutableBoolean(false);
ScopedWebApplicationExecution execution = new ScopedWebApplicationExecution() {
public void execute(WebApplication application) {
assertNull(application);
executionCalled.setValue(true);
}
};
sleep(1500);
storage.execute(handle, execution);
assertTrue(executionCalled.booleanValue());
}
}