/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.citrus.service.requestcontext.session.valueencoder; import static com.alibaba.citrus.test.TestUtil.*; import static org.junit.Assert.*; import java.util.Arrays; import javax.servlet.http.HttpSession; import com.alibaba.citrus.service.requestcontext.AbstractRequestContextsTests; import com.alibaba.citrus.service.requestcontext.session.SessionRequestContext; import com.alibaba.citrus.test.runner.Prototyped; import com.alibaba.citrus.test.runner.Prototyped.TestName; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(Prototyped.class) public abstract class AbstractSingleValueEncoderTests extends AbstractRequestContextsTests<SessionRequestContext> implements Cloneable { protected HttpSession session; protected String beanName; protected String attrName; protected String cookieName; protected Object value1; protected String value1Encoded; protected Object value2; protected String value2Encoded; protected Object value3; protected String value3Encoded; @BeforeClass public static void initFactory() { createBeanFactory("services-session-single-valued-cookie-stores.xml"); } @TestName public String testName() { return beanName; } @Override protected void afterInitRequestContext() { session = requestContext.getRequest().getSession(); } @Test public void session() throws Exception { // request 1 - new request invokeNoopServlet("/servlet"); initRequestContext(beanName); assertEquals(true, session.isNew()); session.setAttribute(attrName, value1); requestContexts.commitRequestContext(requestContext); commitToClient(); // check new added cookie String[] newCookies = clientResponse.getHeaderFields("set-cookie"); Arrays.sort(newCookies); assertEquals(2, newCookies.length); assertThat(newCookies[0], containsAll("JSESSIONID=")); assertThat(newCookies[1], containsAll(cookieName + "=" + value1Encoded + ";", " Path=/; HttpOnly")); // request 2 - modify values invokeNoopServlet("/servlet"); initRequestContext(beanName); assertEquals(false, session.isNew()); assertEquals(value1, session.getAttribute(attrName)); session.setAttribute(attrName, value2); requestContexts.commitRequestContext(requestContext); commitToClient(); // check new added cookie newCookies = clientResponse.getHeaderFields("set-cookie"); Arrays.sort(newCookies); assertEquals(1, newCookies.length); assertThat(newCookies[0], containsAll(cookieName + "=" + value2Encoded + ";", " Path=/; HttpOnly")); // request 3 - remove values invokeNoopServlet("/servlet"); initRequestContext(beanName); assertEquals(false, session.isNew()); assertEquals(value2, session.getAttribute(attrName)); session.removeAttribute(attrName); // remove requestContexts.commitRequestContext(requestContext); commitToClient(); // check new added cookie newCookies = clientResponse.getHeaderFields("set-cookie"); Arrays.sort(newCookies); assertEquals(1, newCookies.length); assertThat(newCookies[0], containsAll(cookieName + "=; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly")); // request 4 - re-add attrs invokeNoopServlet("/servlet"); initRequestContext(beanName); assertEquals(false, session.isNew()); // assertFalse(session.getAttributeNames().hasMoreElements()); // no attributes, 由于httpunit parse cookie的bug,string=; 真实环境不会这样。 session.setAttribute(attrName, value3); requestContexts.commitRequestContext(requestContext); commitToClient(); // check new added cookie newCookies = clientResponse.getHeaderFields("set-cookie"); Arrays.sort(newCookies); assertEquals(1, newCookies.length); assertThat(newCookies[0], containsAll(cookieName + "=" + value3Encoded + ";", " Path=/; HttpOnly")); // request 5 - read only, no modification invokeNoopServlet("/servlet"); initRequestContext(beanName); assertEquals(false, session.isNew()); session.setAttribute("count", 1); // 改变session,但不改变singleValued store中的值,这将引起空map提交 requestContexts.commitRequestContext(requestContext); commitToClient(); // check new added cookie newCookies = clientResponse.getHeaderFields("set-cookie"); Arrays.sort(newCookies); assertEquals(0, newCookies.length); // 由于值未改变,所以不提交cookie // request 6 - invalidate invokeNoopServlet("/servlet"); initRequestContext(beanName); assertEquals(value3, session.getAttribute(attrName)); session.invalidate(); requestContexts.commitRequestContext(requestContext); commitToClient(); // check new added cookie newCookies = clientResponse.getHeaderFields("set-cookie"); Arrays.sort(newCookies); assertEquals(2, newCookies.length); assertThat(newCookies[0], containsAll("JSESSIONID=; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly")); assertThat(newCookies[1], containsAll(cookieName + "=; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly")); } }