/* * Copyright 2014 LinkedIn Corp. * * 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 azkaban.user; import java.util.HashSet; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.fail; import azkaban.utils.Props; import azkaban.utils.UndefinedPropertyException; public class XmlUserManagerTest { private Props baseProps = new Props(); @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } /** * Testing for when the xml path isn't set in properties. * * @throws Exception */ @Test public void testFilePropNotSet() throws Exception { Props props = new Props(baseProps); // Should throw try { @SuppressWarnings("unused") XmlUserManager manager = new XmlUserManager(props); } catch (UndefinedPropertyException e) { return; } fail("XmlUserManager should throw an exception when the file property isn't set"); } /** * Testing for when the xml path doesn't exist. * * @throws Exception */ @Ignore @Test public void testDoNotExist() throws Exception { Props props = new Props(baseProps); props.put(XmlUserManager.XML_FILE_PARAM, "unit/test-conf/doNotExist.xml"); try { @SuppressWarnings("unused") UserManager manager = new XmlUserManager(props); } catch (RuntimeException e) { return; } fail("XmlUserManager should throw an exception when the file doesn't exist"); } @Ignore @Test public void testBasicLoad() throws Exception { Props props = new Props(baseProps); props.put(XmlUserManager.XML_FILE_PARAM, "unit/test-conf/azkaban-users-test1.xml"); UserManager manager = null; try { manager = new XmlUserManager(props); } catch (RuntimeException e) { e.printStackTrace(); fail("XmlUserManager should've found file azkaban-users.xml"); } try { manager.getUser("user0", null); } catch (UserManagerException e) { System.out.println("Exception handled correctly: " + e.getMessage()); } try { manager.getUser(null, "etw"); } catch (UserManagerException e) { System.out.println("Exception handled correctly: " + e.getMessage()); } try { manager.getUser("user0", "user0"); } catch (UserManagerException e) { System.out.println("Exception handled correctly: " + e.getMessage()); } try { manager.getUser("user0", "password0"); } catch (UserManagerException e) { e.printStackTrace(); fail("XmlUserManager should've returned a user."); } User user0 = manager.getUser("user0", "password0"); checkUser(user0, "role0", "group0"); User user1 = manager.getUser("user1", "password1"); checkUser(user1, "role0,role1", "group1,group2"); User user2 = manager.getUser("user2", "password2"); checkUser(user2, "role0,role1,role2", "group1,group2,group3"); User user3 = manager.getUser("user3", "password3"); checkUser(user3, "role1,role2", "group1,group2"); User user4 = manager.getUser("user4", "password4"); checkUser(user4, "role1,role2", "group1,group2"); User user5 = manager.getUser("user5", "password5"); checkUser(user5, "role1,role2", "group1,group2"); User user6 = manager.getUser("user6", "password6"); checkUser(user6, "role3,role2", "group1,group2"); User user7 = manager.getUser("user7", "password7"); checkUser(user7, "", "group1"); User user8 = manager.getUser("user8", "password8"); checkUser(user8, "role3", ""); User user9 = manager.getUser("user9", "password9"); checkUser(user9, "", ""); } private void checkUser(User user, String rolesStr, String groupsStr) { // Validating roles HashSet<String> roleSet = new HashSet<String>(user.getRoles()); if (rolesStr.isEmpty()) { if (!roleSet.isEmpty()) { String outputRoleStr = ""; for (String role : roleSet) { outputRoleStr += role + ","; } throw new RuntimeException("Roles mismatch for " + user.getUserId() + ". Expected roles to be empty but got " + outputRoleStr); } } else { String outputRoleStr = ""; for (String role : roleSet) { outputRoleStr += role + ","; } String[] splitRoles = rolesStr.split(","); HashSet<String> expectedRoles = new HashSet<String>(); for (String role : splitRoles) { if (!roleSet.contains(role)) { throw new RuntimeException("Roles mismatch for user " + user.getUserId() + " role " + role + ". Expected roles to " + rolesStr + " but got " + outputRoleStr); } expectedRoles.add(role); } for (String role : roleSet) { if (!expectedRoles.contains(role)) { throw new RuntimeException("Roles mismatch for user " + user.getUserId() + " role " + role + ". Expected roles to " + rolesStr + " but got " + outputRoleStr); } } } HashSet<String> groupSet = new HashSet<String>(user.getGroups()); if (groupsStr.isEmpty()) { if (!groupSet.isEmpty()) { String outputGroupStr = ""; for (String role : roleSet) { outputGroupStr += role + ","; } throw new RuntimeException("Roles mismatch for " + user.getUserId() + ". Expected roles to be empty but got " + outputGroupStr); } } else { String outputGroupStr = ""; for (String group : groupSet) { outputGroupStr += group + ","; } String[] splitGroups = groupsStr.split(","); HashSet<String> expectedGroups = new HashSet<String>(); for (String group : splitGroups) { if (!groupSet.contains(group)) { throw new RuntimeException("Groups mismatch for user " + user.getUserId() + " group " + group + ". Expected groups to " + groupsStr + " but got " + outputGroupStr); } expectedGroups.add(group); } for (String group : groupSet) { if (!expectedGroups.contains(group)) { throw new RuntimeException("Groups mismatch for user " + user.getUserId() + " group " + group + ". Expected groups to " + groupsStr + " but got " + outputGroupStr); } } } } }