TokenStore tests
diff --git a/src/test/java/org/apache/sling/auth/form/impl/TokenStoreTest.java b/src/test/java/org/apache/sling/auth/form/impl/TokenStoreTest.java
new file mode 100644
index 0000000..89526d4
--- /dev/null
+++ b/src/test/java/org/apache/sling/auth/form/impl/TokenStoreTest.java
@@ -0,0 +1,122 @@
+package org.apache.sling.auth.form.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.math.BigInteger;
+import java.util.UUID;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/*
+ * 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.
+ */
+
+/* TokenStore tests, incomplete for now */
+ public class TokenStoreTest {
+ private TokenStore store;
+ private static final long sessionTimeoutMsec = 60 * 1000L;
+ private static final long defaultExpirationTimeMsec = System.currentTimeMillis() + sessionTimeoutMsec / 2;
+ private static final boolean defaultFastSeed = false;
+ private static final String userId = "user_" + UUID.randomUUID();
+ private String encodedToken;
+ private File tokenFile;
+ private int additionalFileIndex;
+
+ private File additionalTokenFile() {
+ return new File(tokenFile.getParent(), tokenFile.getName() + "-" + additionalFileIndex++);
+ }
+
+ @Before
+ public void setup() throws Exception {
+ tokenFile = File.createTempFile(getClass().getName(), "tokenstore");
+ store = new TokenStore(tokenFile, sessionTimeoutMsec, defaultFastSeed);
+ encodedToken = store.encode(defaultExpirationTimeMsec, userId);
+ }
+
+ @Test
+ public void validTokenTest() throws Exception {
+ assertTrue(store.isValid(encodedToken));
+ }
+
+ @Test
+ public void invalidTokensTest() throws Exception {
+ final String [] invalid = {
+ "1@21@3",
+ "nothing",
+ "0@bad@token"
+ };
+ for(String token : invalid) {
+ assertFalse(store.isValid(token));
+ }
+ }
+
+ @Test
+ public void expiredTokenTest() throws Exception {
+ final String expired = store.encode(1, userId);
+ Thread.sleep(50);
+ assertFalse(store.isValid(expired));
+ }
+
+ @Test
+ public void loadTokenFileTest() throws Exception {
+ final TokenStore newStore = new TokenStore(tokenFile, sessionTimeoutMsec, defaultFastSeed);
+ assertTrue(newStore.isValid(encodedToken));
+
+ final TokenStore emptyStore = new TokenStore(additionalTokenFile(), sessionTimeoutMsec, defaultFastSeed);
+ assertFalse(emptyStore.isValid(encodedToken));
+ }
+
+ @Test
+ public void encodingPartsTest() throws Exception {
+
+ // Test with both a normal and "fast seed" store
+ final TokenStore [] testStores = {
+ new TokenStore(additionalTokenFile(), sessionTimeoutMsec, true),
+ new TokenStore(additionalTokenFile(), sessionTimeoutMsec, false)
+ };
+
+ for(TokenStore testStore : testStores) {
+ String lastHexNumber = "";
+ for(int i=1 ; i < 100; i++) {
+ final String uniqueUserId = "user-" + i;
+ final String [] parts = TokenStore.split(testStore.encode(123, uniqueUserId));
+
+ // First a unique large hex number
+ assertFalse(parts[0].equals(lastHexNumber));
+ lastHexNumber = parts[0];
+ new BigInteger(lastHexNumber, 16);
+ assertTrue(lastHexNumber.length() > 20);
+
+ // Then the timeout prefixed by something else
+ assertEquals("123", parts[1].substring(1));
+
+ // Then the user id
+ assertEquals(uniqueUserId, parts[2]);
+ }
+ }
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void nullTokenFileTest() throws Exception {
+ new TokenStore(null, sessionTimeoutMsec, defaultFastSeed);
+ }
+}