| /** |
| * 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.hadoop.mapred.gridmix; |
| |
| import java.io.IOException; |
| import java.net.URI; |
| |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| import static org.junit.Assert.*; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.fs.FSDataOutputStream; |
| import org.apache.hadoop.fs.FileSystem; |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.security.UserGroupInformation; |
| |
| public class TestUserResolve { |
| |
| private static Path rootDir = null; |
| private static Configuration conf = null; |
| private static FileSystem fs = null; |
| |
| @BeforeClass |
| public static void createRootDir() throws IOException { |
| conf = new Configuration(); |
| fs = FileSystem.getLocal(conf); |
| rootDir = new Path(new Path(System.getProperty("test.build.data", "/tmp")) |
| .makeQualified(fs), "gridmixUserResolve"); |
| } |
| |
| /** |
| * Creates users file with the content as the String usersFileContent. |
| * @param usersFilePath the path to the file that is to be created |
| * @param usersFileContent Content of users file |
| * @throws IOException |
| */ |
| private static void writeUserList(Path usersFilePath, String usersFileContent) |
| throws IOException { |
| |
| FSDataOutputStream out = null; |
| try { |
| out = fs.create(usersFilePath, true); |
| out.writeBytes(usersFileContent); |
| } finally { |
| if (out != null) { |
| out.close(); |
| } |
| } |
| } |
| |
| /** |
| * Validate RoundRobinUserResolver's behavior for bad user resource file. |
| * RoundRobinUserResolver.setTargetUsers() should throw proper Exception for |
| * the cases like |
| * <li> non existent user resource file and |
| * <li> empty user resource file |
| * |
| * @param rslv The RoundRobinUserResolver object |
| * @param userRsrc users file |
| * @param expectedErrorMsg expected error message |
| */ |
| private void validateBadUsersFile(UserResolver rslv, URI userRsrc, |
| String expectedErrorMsg) { |
| boolean fail = false; |
| try { |
| rslv.setTargetUsers(userRsrc, conf); |
| } catch (IOException e) { |
| assertTrue("Exception message from RoundRobinUserResolver is wrong", |
| e.getMessage().equals(expectedErrorMsg)); |
| fail = true; |
| } |
| assertTrue("User list required for RoundRobinUserResolver", fail); |
| } |
| |
| /** |
| * Validate the behavior of {@link RoundRobinUserResolver} for different |
| * user resource files like |
| * <li> Empty user resource file |
| * <li> Non existent user resource file |
| * <li> User resource file with valid content |
| * @throws Exception |
| */ |
| @Test |
| public void testRoundRobinResolver() throws Exception { |
| |
| final UserResolver rslv = new RoundRobinUserResolver(); |
| Path usersFilePath = new Path(rootDir, "users"); |
| URI userRsrc = new URI(usersFilePath.toString()); |
| |
| // Check if the error message is as expected for non existent |
| // user resource file. |
| fs.delete(usersFilePath, false); |
| String expectedErrorMsg = "File " + userRsrc + " does not exist."; |
| validateBadUsersFile(rslv, userRsrc, expectedErrorMsg); |
| |
| // Check if the error message is as expected for empty user resource file |
| writeUserList(usersFilePath, "");// creates empty users file |
| expectedErrorMsg = |
| RoundRobinUserResolver.buildEmptyUsersErrorMsg(userRsrc); |
| validateBadUsersFile(rslv, userRsrc, expectedErrorMsg); |
| |
| // Create user resource file with valid content like older users list file |
| // with usernames and groups |
| writeUserList(usersFilePath, |
| "user0,groupA,groupB,groupC\nuser1,groupA,groupC\n"); |
| validateValidUsersFile(rslv, userRsrc); |
| |
| // Create user resource file with valid content with |
| // usernames with groups and without groups |
| writeUserList(usersFilePath, "user0,groupA,groupB\nuser1,"); |
| validateValidUsersFile(rslv, userRsrc); |
| |
| // Create user resource file with valid content with |
| // usernames without groups |
| writeUserList(usersFilePath, "user0\nuser1"); |
| validateValidUsersFile(rslv, userRsrc); |
| } |
| |
| // Validate RoundRobinUserResolver for the case of |
| // user resource file with valid content. |
| private void validateValidUsersFile(UserResolver rslv, URI userRsrc) |
| throws IOException { |
| assertTrue(rslv.setTargetUsers(userRsrc, conf)); |
| UserGroupInformation ugi1 = UserGroupInformation.createRemoteUser("hfre0"); |
| assertEquals("user0", rslv.getTargetUgi(ugi1).getUserName()); |
| assertEquals("user1", |
| rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre1")) |
| .getUserName()); |
| assertEquals("user0", |
| rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre2")) |
| .getUserName()); |
| assertEquals("user0", rslv.getTargetUgi(ugi1).getUserName()); |
| assertEquals("user1", |
| rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre3")) |
| .getUserName()); |
| |
| // Verify if same user comes again, its mapped user name should be |
| // correct even though UGI is constructed again. |
| assertEquals("user0", rslv.getTargetUgi( |
| UserGroupInformation.createRemoteUser("hfre0")).getUserName()); |
| assertEquals("user0", |
| rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre5")) |
| .getUserName()); |
| assertEquals("user0", |
| rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre0")) |
| .getUserName()); |
| } |
| |
| @Test |
| public void testSubmitterResolver() throws Exception { |
| final UserResolver rslv = new SubmitterUserResolver(); |
| assertFalse(rslv.needsTargetUsersList()); |
| UserGroupInformation ugi = UserGroupInformation.getCurrentUser(); |
| assertEquals(ugi, rslv.getTargetUgi((UserGroupInformation)null)); |
| } |
| } |