/* * Copyright (C) 2013-2017 NTT DATA Corporation * * 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 org.terasoluna.gfw.web.token.transaction; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import java.util.Enumeration; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpSession; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.terasoluna.gfw.web.token.TokenStringGenerator; import org.terasoluna.gfw.web.token.transaction.HttpSessionTransactionTokenStore; import org.terasoluna.gfw.web.token.transaction.TransactionToken; /** * Test class for HttpSessionTransactionTokenStore */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:test-context.xml" }) public class HttpSessionTransactionTokenStoreTest { MockHttpServletRequest request; MockHttpServletResponse response; @Autowired ApplicationContext applicationContext; @Autowired ConfigurableApplicationContext context; HttpSessionTransactionTokenStore store; @Before public void setUp() throws Exception { // prepare request object request = new MockHttpServletRequest(); // prepare response object response = new MockHttpServletResponse(); // set ServletRequestAttributes to RequestContextHolder ServletRequestAttributes attributes = new ServletRequestAttributes(request); RequestContextHolder.setRequestAttributes(attributes); } /** * tokenHolder is null */ @Test public void testGetAndClear01() { // setup parameters HttpSession session = new MockHttpSession(); request.setSession(session); TransactionToken token = new TransactionToken("TransactionToken"); // prepare store instance store = new HttpSessionTransactionTokenStore(); // run String actuals = store.getAndClear(token); // assert assertNull(actuals); } /** * tokenHolder is not null */ @Test public void testGetAndClear02() { // setup parameters HttpSession session = new MockHttpSession(); TransactionToken token = new TransactionToken("tokenName", "tokenKey", "tokenValue"); session.setAttribute( HttpSessionTransactionTokenStore.TOKEN_HOLDER_SESSION_ATTRIBUTE_PREFIX + token.getTokenName() + token.getTokenKey(), token); request.setSession(session); // prepare store instance store = new HttpSessionTransactionTokenStore(); store.store(token); // run String actuals = store.getAndClear(token); // assert assertThat(actuals, is(token.getTokenValue())); assertNotNull(session .getAttribute(HttpSessionTransactionTokenStore.TOKEN_HOLDER_SESSION_ATTRIBUTE_PREFIX + token.getTokenName() + token.getTokenKey())); } @Test(expected = IllegalArgumentException.class) public void testGetAndClear_tokenIsNull() throws Exception { try { store = new HttpSessionTransactionTokenStore(); store.getAndClear(null); } catch (Exception e) { assertThat(e.getMessage(), is("token must not be null")); throw e; } } @Test public void testRemove() { // setup parameters HttpSession session = new MockHttpSession(); request.setSession(session); TransactionToken token = new TransactionToken("tokenName", "tokenKey", "tokenValue"); // prepare store instance store = new HttpSessionTransactionTokenStore(); store.store(token); // run store.remove(token); // assert assertNull(session .getAttribute(HttpSessionTransactionTokenStore.TOKEN_HOLDER_SESSION_ATTRIBUTE_PREFIX + token.getTokenName() + token.getTokenKey())); } @Test(expected = IllegalArgumentException.class) public void testRemove_tokenIsNull() throws Exception { try { store = new HttpSessionTransactionTokenStore(); store.remove(null); } catch (Exception e) { assertThat(e.getMessage(), is("token must not be null")); throw e; } } /** * create a new Token key (stored token is as it is the same as sizePerTokenName) */ @Test public void testCreateAndReserveTokenKey_storedToken_is_as_same_as_sizePerTokenName() throws InterruptedException { // prepare store instance store = new HttpSessionTransactionTokenStore(4, 4); // setup parameters HttpSession session = new MockHttpSession(); request.setSession(session); TransactionToken tokenA = new TransactionToken("tokenName", "tokenKeyA", "tokenValueA"); store.store(tokenA); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenB = new TransactionToken("tokenName", "tokenKeyB", "tokenValueB"); store.store(tokenB); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenC = new TransactionToken("tokenName", "tokenKeyC", "tokenValueC"); store.store(tokenC); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenD = new TransactionToken("tokenName", "tokenKeyD", "tokenValueD"); store.store(tokenD); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token1 = new TransactionToken("tokenName1", "tokenKey1", "tokenValue1"); store.store(token1); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token2 = new TransactionToken("tokenName2", "tokenKey2", "tokenValue2"); store.store(token2); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token3 = new TransactionToken("tokenName3", "tokenKey3", "tokenValue3"); store.store(token3); // run String actual = store.createAndReserveTokenKey(tokenA.getTokenName()); Enumeration<String> enumeration = session.getAttributeNames(); while (enumeration.hasMoreElements()) { System.out.println(enumeration.nextElement()); } // String expected = ""; // assert assertNotNull(actual); assertThat(session.getAttribute(store .createSessionAttributeName(tokenA)), is(nullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenB)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenC)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenD)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token1)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token2)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token3)), is(notNullValue())); } /** * create a new Token key (stored token is as it is the same as sizePerTokenName) */ @Test public void testCreateAndReserveTokenKey_storedToken_is_greater_than_sizePerTokenName() throws InterruptedException { // prepare store instance store = new HttpSessionTransactionTokenStore(4, 4); // setup parameters HttpSession session = new MockHttpSession(); request.setSession(session); TransactionToken tokenA = new TransactionToken("tokenName", "tokenKeyA", "tokenValueA"); store.store(tokenA); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenB = new TransactionToken("tokenName", "tokenKeyB", "tokenValueB"); store.store(tokenB); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenC = new TransactionToken("tokenName", "tokenKeyC", "tokenValueC"); store.store(tokenC); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenD = new TransactionToken("tokenName", "tokenKeyD", "tokenValueE"); store.store(tokenD); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenE = new TransactionToken("tokenName", "tokenKeyE", "tokenValueD"); store.store(tokenE); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token1 = new TransactionToken("tokenName1", "tokenKey1", "tokenValue1"); store.store(token1); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token2 = new TransactionToken("tokenName2", "tokenKey2", "tokenValue2"); store.store(token2); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token3 = new TransactionToken("tokenName3", "tokenKey3", "tokenValue3"); store.store(token3); // run String actual = store.createAndReserveTokenKey(tokenA.getTokenName()); Enumeration<String> enumeration = session.getAttributeNames(); while (enumeration.hasMoreElements()) { System.out.println(enumeration.nextElement()); } // String expected = ""; // assert assertNotNull(actual); assertThat(session.getAttribute(store .createSessionAttributeName(tokenA)), is(nullValue())); // check assertThat(session.getAttribute(store .createSessionAttributeName(tokenB)), is(nullValue())); // check assertThat(session.getAttribute(store .createSessionAttributeName(tokenC)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenD)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenE)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token1)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token2)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token3)), is(notNullValue())); } /** * create a new Token key (stored token is as it is the same as sizePerTokenName) */ @Test public void testCreateAndReserveTokenKey_storedToken_is_greater_than_sizePerTokenName2() throws InterruptedException { // prepare store instance store = new HttpSessionTransactionTokenStore(4, 4); // setup parameters HttpSession session = new MockHttpSession(); request.setSession(session); TransactionToken tokenA = new TransactionToken("tokenName", "tokenKeyA", "tokenValueA"); store.store(tokenA); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenB = new TransactionToken("tokenName", "tokenKeyB", "tokenValueB"); store.store(tokenB); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenC = new TransactionToken("tokenName", "tokenKeyC", "tokenValueC"); store.store(tokenC); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenD = new TransactionToken("tokenName", "tokenKeyD", "tokenValueD"); store.store(tokenD); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenE = new TransactionToken("tokenName", "tokenKeyE", "tokenValueE"); store.store(tokenE); TimeUnit.MILLISECONDS.sleep(1); TransactionToken tokenF = new TransactionToken("tokenName", "tokenKeyF", "tokenValueF"); store.store(tokenF); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token1 = new TransactionToken("tokenName1", "tokenKey1", "tokenValue1"); store.store(token1); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token2 = new TransactionToken("tokenName2", "tokenKey2", "tokenValue2"); store.store(token2); TimeUnit.MILLISECONDS.sleep(1); TransactionToken token3 = new TransactionToken("tokenName3", "tokenKey3", "tokenValue3"); store.store(token3); // run String actual = store.createAndReserveTokenKey(tokenA.getTokenName()); Enumeration<String> enumeration = session.getAttributeNames(); while (enumeration.hasMoreElements()) { System.out.println(enumeration.nextElement()); } // String expected = ""; // assert assertNotNull(actual); assertThat(session.getAttribute(store .createSessionAttributeName(tokenA)), is(nullValue())); // check assertThat(session.getAttribute(store .createSessionAttributeName(tokenB)), is(nullValue())); // check assertThat(session.getAttribute(store .createSessionAttributeName(tokenC)), is(nullValue())); // check assertThat(session.getAttribute(store .createSessionAttributeName(tokenD)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenE)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenF)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token1)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token2)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token3)), is(notNullValue())); } /** * create a new Token key (stored token is less than sizePerTokenName) */ @Test public void testCreateAndReserveTokenKey_storedToken_isLessThan_sizePerTokenName() { // prepare store instance store = new HttpSessionTransactionTokenStore(5); // setup parameters HttpSession session = new MockHttpSession(); request.setSession(session); TransactionToken tokenA = new TransactionToken("tokenName", "tokenKeyA", "tokenValueA"); store.store(tokenA); TransactionToken tokenB = new TransactionToken("tokenName", "tokenKeyB", "tokenValueB"); store.store(tokenB); TransactionToken tokenC = new TransactionToken("tokenName", "tokenKeyC", "tokenValueC"); store.store(tokenC); TransactionToken token1 = new TransactionToken("tokenName1", "tokenKey1", "tokenValue1"); store.store(token1); TransactionToken token2 = new TransactionToken("tokenName2", "tokenKey2", "tokenValue2"); store.store(token2); TransactionToken token3 = new TransactionToken("tokenName3", "tokenKey3", "tokenValue3"); store.store(token3); // run String actual = store.createAndReserveTokenKey(tokenA.getTokenName()); // String expected = ""; // assert assertNotNull(actual); assertThat(session.getAttribute(store .createSessionAttributeName(tokenA)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenB)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(tokenC)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token1)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token2)), is(notNullValue())); assertThat(session.getAttribute(store .createSessionAttributeName(token3)), is(notNullValue())); } @Test(expected = IllegalStateException.class) public void testCreateAndReserveTokenKey_generate_failed() throws Exception { // prepare store instance store = new HttpSessionTransactionTokenStore(new TokenStringGenerator() { @Override public String generate(String seed) { // return always same value return "xxxxx"; } }, 5, 5); // setup parameters MockHttpSession session = new MockHttpSession(); request.setSession(session); session.setAttribute( HttpSessionTransactionTokenStore.TOKEN_HOLDER_SESSION_ATTRIBUTE_PREFIX + "foo" + TransactionToken.TOKEN_STRING_SEPARATOR + "xxxxx", "already in!"); try { store.createAndReserveTokenKey("foo"); } catch (Exception e) { assertThat(e.getMessage(), is("token key generation failed within retry count 5")); throw e; } } @Test(expected = IllegalArgumentException.class) public void testStore_token_isNull() throws Exception { try { store = new HttpSessionTransactionTokenStore(5); store.store(null); } catch (Exception e) { assertThat(e.getMessage(), is("token must not be null")); throw e; } } @Test(expected = IllegalArgumentException.class) public void testConstructor_generator_isNull() throws Exception { try { new HttpSessionTransactionTokenStore(null, 10, 10); } catch (Exception e) { assertThat(e.getMessage(), is("generator must not be null")); throw e; } } @Test(expected = IllegalArgumentException.class) public void testConstructor_transactionTokensPerTokenName_isZero() throws Exception { try { new HttpSessionTransactionTokenStore(new TokenStringGenerator(), 0, 1); } catch (Exception e) { assertThat( e.getMessage(), is("transactionTokenSizePerTokenName must be greater than 0")); throw e; } } @Test(expected = IllegalArgumentException.class) public void testConstructor_transactionTokensPerTokenName_isNegative() throws Exception { try { new HttpSessionTransactionTokenStore(new TokenStringGenerator(), -1, 0); } catch (Exception e) { assertThat( e.getMessage(), is("transactionTokenSizePerTokenName must be greater than 0")); throw e; } } @Test(expected = IllegalArgumentException.class) public void testConstructor_retryCreateTokenName_isZero() throws Exception { try { new HttpSessionTransactionTokenStore(new TokenStringGenerator(), 1, 0); } catch (Exception e) { assertThat(e.getMessage(), is("retryCreateTokenName must be greater than 0")); throw e; } } @Test(expected = IllegalArgumentException.class) public void testConstructor_retryCreateTokenName_isNegative() throws Exception { try { new HttpSessionTransactionTokenStore(new TokenStringGenerator(), 1, -1); } catch (Exception e) { assertThat(e.getMessage(), is("retryCreateTokenName must be greater than 0")); throw e; } } }