You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2021/09/01 11:01:33 UTC
[tomcat] 12/13: Add first pass at tests for the DataSource
UserDatabase
This is an automated email from the ASF dual-hosted git repository.
remm pushed a commit to branch 10.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit e9945ac5892088bd1c463ff4c68b64842b60b9cd
Author: remm <re...@apache.org>
AuthorDate: Tue Aug 31 21:37:47 2021 +0200
Add first pass at tests for the DataSource UserDatabase
Use a shortcut to allow independent testing without a real DataSource.
Test both the DataSourceRealm schema as well as the full schema with
groups.
Only glitch is that Derby leaves a derby.log, I haven't found how to
configure it away.
---
.../users/DataSourceUserDatabaseTests.java | 228 +++++++++++++++++++++
1 file changed, 228 insertions(+)
diff --git a/test/org/apache/catalina/users/DataSourceUserDatabaseTests.java b/test/org/apache/catalina/users/DataSourceUserDatabaseTests.java
new file mode 100644
index 0000000..5529917
--- /dev/null
+++ b/test/org/apache/catalina/users/DataSourceUserDatabaseTests.java
@@ -0,0 +1,228 @@
+/*
+ * 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.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.Iterator;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.catalina.Group;
+import org.apache.catalina.Role;
+import org.apache.catalina.User;
+import org.apache.catalina.startup.LoggingBaseTest;
+
+public class DataSourceUserDatabaseTests extends LoggingBaseTest {
+
+ public static final String SIMPLE_SCHEMA =
+ "create table users (\n"
+ + " user_name varchar(15) not null primary key,\n"
+ + " user_pass varchar(15) not null\n"
+ + ");\n"
+ + "create table user_roles (\n"
+ + " user_name varchar(15) not null,\n"
+ + " role_name varchar(15) not null,\n"
+ + " primary key (user_name, role_name)\n"
+ + ");";
+
+ public static final String FULL_SCHEMA =
+ "create table users (\n"
+ + " user_name varchar(15) not null primary key,\n"
+ + " user_pass varchar(15) not null,\n"
+ + " user_fullname varchar(128)\n"
+ + " -- Add more attributes as needed\n"
+ + ");\n"
+ + "create table roles (\n"
+ + " role_name varchar(15) not null primary key,\n"
+ + " role_description varchar(128)\n"
+ + ");\n"
+ + "create table groups (\n"
+ + " group_name varchar(15) not null primary key,\n"
+ + " group_description varchar(128)\n"
+ + ");\n"
+ + "create table user_roles (\n"
+ + " user_name varchar(15) references users(user_name),\n"
+ + " role_name varchar(15) references roles(role_name),\n"
+ + " primary key (user_name, role_name)\n"
+ + ");\n"
+ + "create table user_groups (\n"
+ + " user_name varchar(15) references users(user_name),\n"
+ + " group_name varchar(15) references groups(group_name),\n"
+ + " primary key (user_name, group_name)\n"
+ + ");\n"
+ + "create table group_roles (\n"
+ + " group_name varchar(15) references groups(group_name),\n"
+ + " role_name varchar(15) references roles(role_name),\n"
+ + " primary key (group_name, role_name)\n"
+ + ");";
+
+ protected class DerbyUserDatabase extends DataSourceUserDatabase {
+ protected final String name;
+ protected Connection connection = null;
+ public DerbyUserDatabase(String name) {
+ super(null, "tomcat");
+ this.name = "/" + name;
+ }
+ @Override
+ protected Connection openConnection() {
+ // Replace DataSource use and JNDI access with direct Derby
+ // connection
+ return connection;
+ }
+ @Override
+ protected void close(Connection dbConnection) {
+ }
+ @Override
+ public void close() throws Exception {
+ if (connection != null) {
+ connection.close();
+ }
+ }
+ @Override
+ public void open() throws Exception {
+ super.open();
+ Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
+ connection = DriverManager.getConnection("jdbc:derby:" + getTemporaryDirectory().getAbsolutePath()
+ + name + ";create=true");
+ }
+ public Connection getConnection() {
+ return connection;
+ }
+ }
+
+ private DerbyUserDatabase db;
+
+ @Test
+ public void testBasicUserRoleDatabase()
+ throws Exception {
+ // Test functionality with the DataSourceRealm schema
+
+ db = new DerbyUserDatabase("simple");
+ db.setReadonly(false);
+ db.setUserTable("users");
+ db.setUserNameCol("user_name");
+ db.setUserCredCol("user_pass");
+ db.setUserRoleTable("user_roles");
+ db.setRoleNameCol("role_name");
+ db.open();
+ // First create the DB tables
+ Connection connection = db.getConnection();
+ for (String sql: SIMPLE_SCHEMA.split(";")) {
+ try (Statement statement = connection.createStatement()) {
+ statement.execute(sql);
+ }
+ }
+
+ Iterator<User> users = db.getUsers();
+ Assert.assertFalse("Some users found", users.hasNext());
+
+ User tomcatUser = db.createUser("tomcat", "password", "A new user");
+ Role adminRole = db.createRole("admin", "Admin role");
+ Role managerRole = db.createRole("manager", "Manager role");
+ Role userRole = db.createRole("user", "User role");
+ tomcatUser.addRole(adminRole);
+ tomcatUser.addRole(userRole);
+ db.save();
+
+ users = db.getUsers();
+ Assert.assertTrue("No users found", users.hasNext());
+ tomcatUser = users.next();
+ Assert.assertTrue("Wrong user", tomcatUser.getUsername().equals("tomcat"));
+ Assert.assertTrue("Wrong password", tomcatUser.getPassword().equals("password"));
+ // Cannot save the user full name
+ Assert.assertNull("Wrong user fullname", tomcatUser.getFullName());
+ adminRole = db.findRole("admin");
+ Assert.assertNotNull("No admin role", adminRole);
+ Assert.assertTrue("No role for user", tomcatUser.isInRole(adminRole));
+ // Manager role cannot be saved, but remains valid in memory
+ managerRole = db.findRole("manager");
+ Assert.assertFalse("Unexpected role for user", tomcatUser.isInRole(managerRole));
+
+ db.close();
+ }
+
+ @Test
+ public void testUserDatabase()
+ throws Exception {
+
+ db = new DerbyUserDatabase("full");
+ db.setReadonly(false);
+ db.setUserTable("users");
+ db.setUserNameCol("user_name");
+ db.setUserCredCol("user_pass");
+ db.setUserRoleTable("user_roles");
+ db.setUserGroupTable("user_groups");
+ db.setRoleTable("roles");
+ db.setRoleNameCol("role_name");
+ db.setGroupTable("groups");
+ db.setGroupNameCol("group_name");
+ db.setGroupRoleTable("group_roles");
+ // Not setting the description or full name since it allows checking persistence,
+ // as any modification is kept in memory until save()
+ db.open();
+ // First create the DB tables
+ Connection connection = db.getConnection();
+ for (String sql: FULL_SCHEMA.split(";")) {
+ try (Statement statement = connection.createStatement()) {
+ statement.execute(sql);
+ }
+ }
+
+ Iterator<User> users = db.getUsers();
+ Assert.assertFalse("Some users found", users.hasNext());
+
+ User tomcatUser = db.createUser("tomcat", "password", "A new user");
+ User randomUser = db.createUser("random", "password", "Another new user");
+ Role adminRole = db.createRole("admin", "Admin role");
+ Role managerRole = db.createRole("manager", "Manager role");
+ Role userRole = db.createRole("user", "User role");
+ Group userGroup = db.createGroup("users", "All users");
+ userGroup.addRole(userRole);
+ tomcatUser.addRole(adminRole);
+ tomcatUser.addGroup(userGroup);
+ randomUser.addGroup(userGroup);
+ db.save();
+
+ users = db.getUsers();
+ Assert.assertTrue("No users found", users.hasNext());
+ tomcatUser = users.next();
+ if (!tomcatUser.getUsername().equals("tomcat")) {
+ tomcatUser = users.next();
+ }
+ Assert.assertTrue("Wrong user", tomcatUser.getUsername().equals("tomcat"));
+ Assert.assertTrue("Wrong password", tomcatUser.getPassword().equals("password"));
+ // Cannot save the user full name
+ Assert.assertNull("Wrong user fullname", tomcatUser.getFullName());
+ adminRole = db.findRole("admin");
+ Assert.assertNotNull("No admin role", adminRole);
+ Assert.assertNull("Wrong admin role", adminRole.getDescription());
+ Assert.assertTrue("No role for user", tomcatUser.isInRole(adminRole));
+ managerRole = db.findRole("manager");
+ Assert.assertFalse("Unexpected role for user", tomcatUser.isInRole(managerRole));
+ userRole = db.findRole("user");
+ userGroup = db.findGroup("users");
+ Assert.assertNull("Wrong users group", userGroup.getDescription());
+ Assert.assertTrue("No role for group", userGroup.isInRole(userRole));
+ randomUser = db.findUser("random");
+ Assert.assertTrue("No group for user", randomUser.isInGroup(userGroup));
+
+ db.close();
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org