blob: f9b4892b0b328d88360b0fc833b92849f6cc69ea [file] [log] [blame]
/*
* 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.struts2.util;
import com.mockobjects.dynamic.Mock;
import com.mockobjects.servlet.MockPageContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.StrutsInternalTestCase;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
/**
* InvocationSessionStoreTest
*
*/
public class InvocationSessionStoreTest extends StrutsInternalTestCase {
private static final String INVOCATION_KEY = "org.apache.struts2.util.InvocationSessionStoreTest.invocation";
private static final String TOKEN_VALUE = "org.apache.struts2.util.InvocationSessionStoreTest.token";
private ActionInvocation invocation;
private Map<String, Object> session;
private Mock invocationMock;
private ValueStack stack;
public void testStore() {
assertNull(InvocationSessionStore.loadInvocation(INVOCATION_KEY, TOKEN_VALUE));
InvocationSessionStore.storeInvocation(INVOCATION_KEY, TOKEN_VALUE, invocation);
assertNotNull(InvocationSessionStore.loadInvocation(INVOCATION_KEY, TOKEN_VALUE));
assertEquals(invocation, InvocationSessionStore.loadInvocation(INVOCATION_KEY, TOKEN_VALUE));
}
public void testValueStackReset() {
ActionContext actionContext = ActionContext.getContext();
assertEquals(stack, actionContext.getValueStack());
InvocationSessionStore.loadInvocation(INVOCATION_KEY, TOKEN_VALUE);
assertEquals(stack, actionContext.getValueStack());
}
public void testActionContextReset() {
ActionContext actionContext = ActionContext.getContext();
InvocationSessionStore.storeInvocation(INVOCATION_KEY, TOKEN_VALUE, invocation);
ActionContext actionContext2 = ActionContext.of()
.withSession(session)
.bind();
assertEquals(actionContext2, ActionContext.getContext());
InvocationSessionStore.loadInvocation(INVOCATION_KEY, TOKEN_VALUE);
assertEquals(actionContext, ActionContext.getContext());
}
public void testStoreAndLoadFromDeserializedSession() throws Exception {
InvocationSessionStore.storeInvocation(INVOCATION_KEY, TOKEN_VALUE, invocation);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(session);//WW-4873 invocation is not serializable but we should not fail at this line
oos.close();
byte[] b = baos.toByteArray();
baos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(b);
ObjectInputStream ois = new ObjectInputStream(bais);
session = (Map<String, Object>) ois.readObject();
ActionContext.getContext().withSession(session);
ois.close();
bais.close();
ActionInvocation savedInvocation = InvocationSessionStore.loadInvocation(INVOCATION_KEY, TOKEN_VALUE);
assertNull(savedInvocation);//Currently we don't support invocation restore from serialized session
}
public void testStoreAndLoadPreservesPageContext() {
// Create mock PageContext to put with the current context (simulating a PageContext
// associated with the current (active) process flow). In real-world processing it
// will usually be null, but if non-null it should be preserved/restored upon load of the
// saved context.
MockPageContext mockPreviousPageContext = new MockPageContext();
// Create mock PageContext to put with the saved context (simulating a PageContext previously
// used and closed after generating JSP output).
MockPageContext mockSavedPageContext = new MockPageContext();
ActionContext actionContext = ActionContext.getContext()
.withPageContext(mockSavedPageContext);
assertEquals(mockSavedPageContext, ActionContext.getContext().getPageContext());
InvocationSessionStore.storeInvocation(INVOCATION_KEY, TOKEN_VALUE, invocation);
ActionContext actionContext2 = ActionContext.of()
.withSession(session)
.withPageContext(mockPreviousPageContext)
.bind();
assertEquals(actionContext2, ActionContext.getContext());
actionContext2.withPageContext(mockPreviousPageContext);
assertEquals(mockPreviousPageContext, ActionContext.getContext().getPageContext());
InvocationSessionStore.loadInvocation(INVOCATION_KEY, TOKEN_VALUE);
assertEquals(actionContext, ActionContext.getContext());
assertEquals(mockPreviousPageContext, ActionContext.getContext().getPageContext());
}
protected void setUp() throws Exception {
super.setUp();
stack = ActionContext.getContext().getValueStack();
session = new HashMap<>();
ActionContext actionContext = ActionContext.of(stack.getContext())
.withSession(session)
.withValueStack(stack)
.bind();
invocationMock = new Mock(ActionInvocation.class);
invocation = (ActionInvocation) invocationMock.proxy();
invocationMock.matchAndReturn("getInvocationContext", actionContext);
invocationMock.matchAndReturn("getStack", stack);
Mock proxyMock = new Mock(ActionProxy.class);
proxyMock.matchAndReturn("getInvocation", invocation);
ActionProxy proxy = (ActionProxy) proxyMock.proxy();
invocationMock.matchAndReturn("getProxy", proxy);
}
}