Author: schultz
Date: Sun Jan 6 14:27:34 2019
New Revision: 1850560
URL: http://svn.apache.org/viewvc?rev=1850560&view=rev
Log:
Add unit test for MemoryUserDatabase.
Added:
tomcat/trunk/test/org/apache/catalina/users/
tomcat/trunk/test/org/apache/catalina/users/MemoryUserDatabaseTests.java
Added: tomcat/trunk/test/org/apache/catalina/users/MemoryUserDatabaseTests.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/users/MemoryUserDatabaseTests.java?rev=1850560&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/users/MemoryUserDatabaseTests.java
(added)
+++ tomcat/trunk/test/org/apache/catalina/users/MemoryUserDatabaseTests.java
Sun Jan 6 14:27:34 2019
@@ -0,0 +1,225 @@
+/*
+ * 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.catalina.users;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.URI;
+import java.security.Principal;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.catalina.User;
+import org.apache.tomcat.util.file.ConfigFileLoader;
+import org.apache.tomcat.util.file.ConfigurationSource;
+
+public class MemoryUserDatabaseTests {
+ private static File TEST_FILE = new
File(System.getProperty("java.io.tmpdir"), "tomcat-users.xml");
+
+ private static MemoryUserDatabase db;
+
+ @BeforeClass
+ public static void createSampleDB()
+ throws Exception {
+
+ try(BufferedWriter out = new BufferedWriter(new
FileWriter(TEST_FILE))) {
+ out.write("<?xml version=\"1.0\" ?>"
+ + "<tomcat-users xmlns=\"http://tomcat.apache.org/xml\""
+ + "
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+ + "
xsi:schemaLocation=\"http://tomcat.apache.org/xml/tomcat-users.xsd\""
+ + " version=\"1.0\">"
+ + "<role rolename=\"testrole\" />"
+ + "<group groupname=\"testgroup\" />"
+ + "<user username=\"admin\" password=\"sekr3t\"
roles=\"testrole, otherrole\" groups=\"testgroup, othergroup\" />"
+ + "</tomcat-users>");
+ }
+
+ // MemoryUserDatabase requires the use of
ConfigFileLoader/ConfigurationSource
+ ConfigFileLoader.setSource(new ConfigurationSource() {
+ protected final File userDir = new
File(System.getProperty("java.io.tmpdir"));
+ protected final URI userDirUri = userDir.toURI();
+ @Override
+ public Resource getResource(String name) throws IOException {
+ File f = new File(name);
+ if (!f.isAbsolute()) {
+ f = new File(userDir, name);
+ }
+ if (f.isFile()) {
+ return new Resource(new FileInputStream(f), f.toURI());
+ } else {
+ throw new FileNotFoundException(name);
+ }
+ }
+ @Override
+ public URI getURI(String name) {
+ File f = new File(name);
+ if (!f.isAbsolute()) {
+ f = new File(userDir, name);
+ }
+ if (f.isFile()) {
+ return f.toURI();
+ }
+ return userDirUri.resolve(name);
+ }
+ });
+
+ db = new MemoryUserDatabase();
+ db.setPathname(TEST_FILE.getAbsolutePath());
+ db.open();
+ }
+
+ @AfterClass
+ public static void cleanup() {
+ TEST_FILE.delete();
+ }
+
+ @Test
+ public void testLoadUserDatabase()
+ throws Exception {
+ assertPrincipalNames(new String[] { "testrole", "otherrole"},
db.getRoles());
+ assertPrincipalNames(new String[] { "testgroup", "othergroup"},
db.getGroups());
+
+ Iterator<User> users = db.getUsers();
+
+ Assert.assertTrue("No users found", users.hasNext());
+
+ User user = users.next();
+
+ Assert.assertEquals("admin", user.getName());
+ Assert.assertNull(user.getFullName());
+ Assert.assertEquals("sekr3t", user.getPassword());
+
+ assertPrincipalNames(new String[] { "testrole", "otherrole"},
user.getRoles());
+ assertPrincipalNames(new String[] { "testgroup", "othergroup"},
user.getGroups());
+ }
+
+ public void testReloadUserDatabase()
+ throws Exception {
+ // Change the database on the disk and reload
+
+ try(BufferedWriter out = new BufferedWriter(new
FileWriter(TEST_FILE))) {
+ out.write("<?xml version=\"1.0\" ?>"
+ + "<tomcat-users xmlns=\"http://tomcat.apache.org/xml\""
+ + "
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+ + "
xsi:schemaLocation=\"http://tomcat.apache.org/xml/tomcat-users.xsd\""
+ + " version=\"1.0\">"
+ + "<role rolename=\"foo\" />"
+ + "<group groupname=\"bar\" />"
+ + "<user username=\"root\" password=\"sup3Rsekr3t\"
roles=\"foo, bar\" groups=\"bar, foo\" />"
+ + "</tomcat-users>");
+
+ db.open();
+ }
+
+ assertPrincipalNames(new String[] { "foo", "bar"}, db.getRoles());
+ assertPrincipalNames(new String[] { "bar", "foo"}, db.getGroups());
+
+ Iterator<User> users = db.getUsers();
+
+ Assert.assertTrue("No users found", users.hasNext());
+
+ User user = users.next();
+
+ Assert.assertEquals("root", user.getName());
+ Assert.assertNull(user.getFullName());
+ Assert.assertEquals("sup3Rsekr3t", user.getPassword());
+
+ assertPrincipalNames(new String[] { "foo", "bar"}, user.getRoles());
+ assertPrincipalNames(new String[] { "bar", "foo"}, user.getGroups());
+ }
+
+ @Test
+ public void testMultithreadedMutateUserDatabase()
+ throws Exception {
+ // Generate lots of concurrent load on the user database
+ Runnable job = new Runnable() {
+ public void run() {
+ for(int i=0; i<10; ++i)
+ db.createUser("newUser-" +
Thread.currentThread().getName() + "-" + i, "x", null);
+ }
+ };
+
+ int numThreads = 100;
+ Thread[] threads = new Thread[numThreads + 1];
+ for(int i=0; i<numThreads; ++i)
+ threads[i] = new Thread(job);
+
+ // Let's
+ threads[numThreads] = new Thread(new Runnable() {
+ public void run() {
+ try { db.open(); }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+
+ ++numThreads;
+
+ for(int i=0; i<numThreads; ++i)
+ threads[i].start();
+
+ for(int i=0; i<numThreads; ++i)
+ threads[i].join();
+
+ // Remove all those extra users
+ Iterator<User> users = db.getUsers();
+ for(; users.hasNext();) {
+ User user = users.next();
+ if(user.getUsername().startsWith("newUser"))
+ db.removeUser(user);
+ }
+
+ users = db.getUsers();
+
+ Assert.assertTrue("No users found", users.hasNext());
+
+ User user = users.next();
+
+ Assert.assertEquals("admin", user.getName());
+ Assert.assertNull(user.getFullName());
+ Assert.assertEquals("sekr3t", user.getPassword());
+
+ assertPrincipalNames(new String[] { "testrole", "otherrole"},
user.getRoles());
+ assertPrincipalNames(new String[] { "testgroup", "othergroup"},
user.getGroups());
+ }
+
+ private void assertPrincipalNames(String[] expectedNames, Iterator<?
extends Principal> i)
+ {
+ HashSet<String> names = new HashSet<String>(expectedNames.length);
+ for(String name : expectedNames)
+ names.add(name);
+
+ int j=0;
+ while(i.hasNext()) {
+ Assert.assertTrue(names.contains(i.next().getName()));
+ j++;
+ }
+
+ Assert.assertEquals(expectedNames.length, j);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]