From 0efafa6c47071bc320be2130412c4eccdbfdf8ff Mon Sep 17 00:00:00 2001 From: Adrian Damian <Adrian.Damian@nrc.ca> Date: Thu, 18 Jun 2015 14:13:30 -0700 Subject: [PATCH] Fixed unit tests for user listing --- ...NamesAction.java => GetUserIDsAction.java} | 21 +-- .../cadc/ac/server/web/users/UserLogInfo.java | 6 +- .../cadc/ac/server/web/users/UsersAction.java | 10 +- .../server/web/users/UsersActionFactory.java | 86 ++------- .../ac/server/web/users/UsersServlet.java | 12 +- .../cadc/ac/server/ldap/LdapUserDAOTest.java | 2 +- .../web/users/GetUserIDsActionTest.java | 164 ++++++++++++++++++ 7 files changed, 206 insertions(+), 95 deletions(-) rename projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/{GetUserNamesAction.java => GetUserIDsAction.java} (88%) create mode 100644 projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/GetUserIDsActionTest.java diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserNamesAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserIDsAction.java similarity index 88% rename from projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserNamesAction.java rename to projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserIDsAction.java index a29e5fcf..c8ac096d 100644 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserNamesAction.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserIDsAction.java @@ -67,21 +67,22 @@ ************************************************************************ */ -package ca.nrc.cadc.ac.server.web; +package ca.nrc.cadc.ac.server.web.users; import java.io.Writer; import java.util.Collection; import org.apache.log4j.Logger; -import ca.nrc.cadc.ac.server.GroupPersistence; +import ca.nrc.cadc.ac.server.UserPersistence; +import ca.nrc.cadc.auth.HttpPrincipal; -public class GetGroupNamesAction extends GroupsAction +public class GetUserIDsAction extends UsersAction { - private static final Logger log = Logger.getLogger(GetGroupNamesAction.class); + private static final Logger log = Logger.getLogger(GetUserIDsAction.class); - GetGroupNamesAction(GroupLogInfo logInfo) + GetUserIDsAction(UserLogInfo logInfo) { super(logInfo); } @@ -89,20 +90,20 @@ public class GetGroupNamesAction extends GroupsAction public Object run() throws Exception { - GroupPersistence groupPersistence = getGroupPersistence(); - Collection<String> groups = groupPersistence.getGroupNames(); - log.debug("Found " + groups.size() + " group names"); + UserPersistence userPersistence = getUserPersistence(); + Collection<HttpPrincipal> userIDs = userPersistence.getCadcIDs(); + log.debug("Found " + userIDs.size() + " user IDs"); response.setContentType("text/plain"); log.debug("Set content-type to text/plain"); Writer writer = response.getWriter(); boolean start = true; - for (final String group : groups) + for (final HttpPrincipal userID : userIDs) { if (!start) { writer.write("\r\n"); } - writer.write(group); + writer.write(userID.getName()); start = false; } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserLogInfo.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserLogInfo.java index 51261011..65baaa02 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserLogInfo.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UserLogInfo.java @@ -66,19 +66,19 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web; +package ca.nrc.cadc.ac.server.web.users; import ca.nrc.cadc.log.ServletLogInfo; import java.util.List; import javax.servlet.http.HttpServletRequest; -public class GroupLogInfo extends ServletLogInfo +public class UserLogInfo extends ServletLogInfo { public String groupID; public List<String> addedMembers; public List<String> deletedMembers; - public GroupLogInfo(HttpServletRequest request) + public UserLogInfo(HttpServletRequest request) { super(request); } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersAction.java index 42c0ac3c..66bffc4c 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersAction.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersAction.java @@ -66,7 +66,7 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web; +package ca.nrc.cadc.ac.server.web.users; import java.io.IOException; import java.security.AccessControlException; @@ -90,14 +90,14 @@ import ca.nrc.cadc.ac.server.PluginFactory; import ca.nrc.cadc.ac.server.UserPersistence; import ca.nrc.cadc.net.TransientException; -public abstract class GroupsAction +public abstract class UsersAction implements PrivilegedExceptionAction<Object> { - private static final Logger log = Logger.getLogger(GroupsAction.class); - protected GroupLogInfo logInfo; + private static final Logger log = Logger.getLogger(UsersAction.class); + protected UserLogInfo logInfo; protected HttpServletResponse response; - GroupsAction(GroupLogInfo logInfo) + UsersAction(UserLogInfo logInfo) { this.logInfo = logInfo; } diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersActionFactory.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersActionFactory.java index 9263dde6..684fc8e4 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersActionFactory.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersActionFactory.java @@ -66,7 +66,7 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web; +package ca.nrc.cadc.ac.server.web.users; import java.io.IOException; import java.net.URL; @@ -76,16 +76,23 @@ import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; +import ca.nrc.cadc.ac.server.web.AddGroupMemberAction; +import ca.nrc.cadc.ac.server.web.AddUserMemberAction; +import ca.nrc.cadc.ac.server.web.DeleteGroupAction; +import ca.nrc.cadc.ac.server.web.GetGroupAction; +import ca.nrc.cadc.ac.server.web.ModifyGroupAction; +import ca.nrc.cadc.ac.server.web.RemoveGroupMemberAction; +import ca.nrc.cadc.ac.server.web.RemoveUserMemberAction; import ca.nrc.cadc.util.StringUtil; -public class GroupsActionFactory +public class UsersActionFactory { - private static final Logger log = Logger.getLogger(GroupsActionFactory.class); + private static final Logger log = Logger.getLogger(UsersActionFactory.class); - static GroupsAction getGroupsAction(HttpServletRequest request, GroupLogInfo logInfo) + static UsersAction getUsersAction(HttpServletRequest request, UserLogInfo logInfo) throws IOException { - GroupsAction action = null; + UsersAction action = null; String method = request.getMethod(); String path = request.getPathInfo(); log.debug("method: " + method); @@ -116,78 +123,17 @@ public class GroupsActionFactory { if (method.equals("GET")) { - action = new GetGroupNamesAction(logInfo); + action = new GetUserIDsAction(logInfo); } else if (method.equals("PUT")) { - action = new CreateGroupAction(logInfo, request.getInputStream()); + throw new UnsupportedOperationException("TODO"); } } - else if (segments.length == 1) + else { - String groupName = segments[0]; - if (method.equals("GET")) - { - action = new GetGroupAction(logInfo, groupName); - } - else if (method.equals("DELETE")) - { - action = new DeleteGroupAction(logInfo, groupName); - } - else if (method.equals("POST")) - { - final URL requestURL = new URL(request.getRequestURL().toString()); - final StringBuilder sb = new StringBuilder(); - sb.append(requestURL.getProtocol()); - sb.append("://"); - sb.append(requestURL.getHost()); - if (requestURL.getPort() > 0) - { - sb.append(":"); - sb.append(requestURL.getPort()); - } - sb.append(request.getContextPath()); - sb.append(request.getServletPath()); - sb.append("/"); - sb.append(path); - - action = new ModifyGroupAction(logInfo, groupName, sb.toString(), - request.getInputStream()); - } - } - else if (segments.length == 3) - { - String groupName = segments[0]; - String memberCategory = segments[1]; - if (method.equals("PUT")) - { - if (memberCategory.equals("groupMembers")) - { - String groupMemberName = segments[2]; - action = new AddGroupMemberAction(logInfo, groupName, groupMemberName); - } - else if (memberCategory.equals("userMembers")) - { - String userMemberID = URLDecoder.decode(segments[2], "UTF-8"); - String userMemberIDType = request.getParameter("idType"); - action = new AddUserMemberAction(logInfo, groupName, userMemberID, userMemberIDType); - } - } - else if (method.equals("DELETE")) - { - if (memberCategory.equals("groupMembers")) - { - String groupMemberName = segments[2]; - action = new RemoveGroupMemberAction(logInfo, groupName, groupMemberName); - } - else if (memberCategory.equals("userMembers")) - { - String memberUserID = URLDecoder.decode(segments[2], "UTF-8"); - String memberUserIDType = request.getParameter("idType"); - action = new RemoveUserMemberAction(logInfo, groupName, memberUserID, memberUserIDType); - } - } + throw new UnsupportedOperationException("TODO"); } if (action != null) diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersServlet.java index dd62ed5c..37f09e37 100755 --- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersServlet.java +++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/UsersServlet.java @@ -66,7 +66,7 @@ * ************************************************************************ */ -package ca.nrc.cadc.ac.server.web; +package ca.nrc.cadc.ac.server.web.users; import java.io.IOException; @@ -79,24 +79,24 @@ import org.apache.log4j.Logger; import ca.nrc.cadc.auth.AuthenticationUtil; -public class GroupsServlet extends HttpServlet +public class UsersServlet extends HttpServlet { - private static final Logger log = Logger.getLogger(GroupsServlet.class); + private static final Logger log = Logger.getLogger(UsersServlet.class); /** - * Create a GroupAction and run the action safely. + * Create a UserAction and run the action safely. */ private void doAction(HttpServletRequest request, HttpServletResponse response) throws IOException { long start = System.currentTimeMillis(); - GroupLogInfo logInfo = new GroupLogInfo(request); + UserLogInfo logInfo = new UserLogInfo(request); try { log.info(logInfo.start()); Subject subject = AuthenticationUtil.getSubject(request); logInfo.setSubject(subject); - GroupsAction action = GroupsActionFactory.getGroupsAction(request, logInfo); + UsersAction action = UsersActionFactory.getUsersAction(request, logInfo); action.doAction(subject, response); } catch (IllegalArgumentException e) diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java index 017fa228..513658f0 100644 --- a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java +++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java @@ -270,7 +270,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest catch (Exception e) { throw new Exception("Problems", e); - } + } } }); } diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/GetUserIDsActionTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/GetUserIDsActionTest.java new file mode 100644 index 00000000..386148bb --- /dev/null +++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/users/GetUserIDsActionTest.java @@ -0,0 +1,164 @@ +/* + ************************************************************************ + ******************* CANADIAN ASTRONOMY DATA CENTRE ******************* + ************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES ************** + * + * (c) 2014. (c) 2014. + * Government of Canada Gouvernement du Canada + * National Research Council Conseil national de recherches + * Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6 + * All rights reserved Tous droits réservés + * + * NRC disclaims any warranties, Le CNRC dénie toute garantie + * expressed, implied, or énoncée, implicite ou légale, + * statutory, of any kind with de quelque nature que ce + * respect to the software, soit, concernant le logiciel, + * including without limitation y compris sans restriction + * any warranty of merchantability toute garantie de valeur + * or fitness for a particular marchande ou de pertinence + * purpose. NRC shall not be pour un usage particulier. + * liable in any event for any Le CNRC ne pourra en aucun cas + * damages, whether direct or être tenu responsable de tout + * indirect, special or general, dommage, direct ou indirect, + * consequential or incidental, particulier ou général, + * arising from the use of the accessoire ou fortuit, résultant + * software. Neither the name de l'utilisation du logiciel. Ni + * of the National Research le nom du Conseil National de + * Council of Canada nor the Recherches du Canada ni les noms + * names of its contributors may de ses participants ne peuvent + * be used to endorse or promote être utilisés pour approuver ou + * products derived from this promouvoir les produits dérivés + * software without specific prior de ce logiciel sans autorisation + * written permission. préalable et particulière + * par écrit. + * + * This file is part of the Ce fichier fait partie du projet + * OpenCADC project. OpenCADC. + * + * OpenCADC is free software: OpenCADC est un logiciel libre ; + * you can redistribute it and/or vous pouvez le redistribuer ou le + * modify it under the terms of modifier suivant les termes de + * the GNU Affero General Public la “GNU Affero General Public + * License as published by the License” telle que publiée + * Free Software Foundation, par la Free Software Foundation + * either version 3 of the : soit la version 3 de cette + * License, or (at your option) licence, soit (à votre gré) + * any later version. toute version ultérieure. + * + * OpenCADC is distributed in the OpenCADC est distribué + * hope that it will be useful, dans l’espoir qu’il vous + * but WITHOUT ANY WARRANTY; sera utile, mais SANS AUCUNE + * without even the implied GARANTIE : sans même la garantie + * warranty of MERCHANTABILITY implicite de COMMERCIALISABILITÉ + * or FITNESS FOR A PARTICULAR ni d’ADÉQUATION À UN OBJECTIF + * PURPOSE. See the GNU Affero PARTICULIER. Consultez la Licence + * General Public License for Générale Publique GNU Affero + * more details. pour plus de détails. + * + * You should have received Vous devriez avoir reçu une + * a copy of the GNU Affero copie de la Licence Générale + * General Public License along Publique GNU Affero avec + * with OpenCADC. If not, see OpenCADC ; si ce n’est + * <http://www.gnu.org/licenses/>. pas le cas, consultez : + * <http://www.gnu.org/licenses/>. + * + * $Revision: 4 $ + * + ************************************************************************ + */ +package ca.nrc.cadc.ac.server.web.users; + +import static org.junit.Assert.fail; + +import java.io.PrintWriter; +import java.security.Principal; +import java.util.ArrayList; +import java.util.Collection; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.easymock.EasyMock; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; + +import ca.nrc.cadc.ac.server.GroupPersistence; +import ca.nrc.cadc.ac.server.UserPersistence; +import ca.nrc.cadc.ac.server.web.GetGroupNamesAction; +import ca.nrc.cadc.ac.server.web.GroupLogInfo; +import ca.nrc.cadc.auth.HttpPrincipal; +import ca.nrc.cadc.util.Log4jInit; +import ca.nrc.cadc.uws.server.SyncOutput; + +/** + * + * @author adriand + */ +public class GetUserIDsActionTest +{ + private final static Logger log = Logger.getLogger(GetUserIDsActionTest.class); + + @BeforeClass + public static void setUpClass() + { + Log4jInit.setLevel("ca.nrc.cadc.ac", Level.INFO); + } + + @Test + @Ignore + public void testRun() throws Exception + { + try + { + Collection<HttpPrincipal> userIDs = new ArrayList<HttpPrincipal>(); + userIDs.add(new HttpPrincipal("foo")); + userIDs.add(new HttpPrincipal("bar")); + + final UserPersistence mockPersistence = EasyMock.createMock(UserPersistence.class); + EasyMock.expect(mockPersistence.getCadcIDs()).andReturn(userIDs).once(); + + final PrintWriter mockWriter = EasyMock.createMock(PrintWriter.class); + mockWriter.write("foo", 0, 3); + EasyMock.expectLastCall(); + mockWriter.write(44); + EasyMock.expectLastCall(); + mockWriter.write("bar", 0, 3); + EasyMock.expectLastCall(); + mockWriter.write("\n"); + EasyMock.expectLastCall(); + + final SyncOutput mockSyncOutput = + EasyMock.createMock(SyncOutput.class); + + mockSyncOutput.setHeader("Content-Type", "text/csv"); + + final HttpServletResponse mockResponse = EasyMock.createMock(HttpServletResponse.class); + mockResponse.setContentType("text/csv"); + EasyMock.expectLastCall(); + EasyMock.expect(mockResponse.getWriter()).andReturn(mockWriter).once(); + + UserLogInfo mockLog = EasyMock.createMock(UserLogInfo.class); + + EasyMock.replay(mockPersistence, mockWriter, mockResponse, mockLog); + + GetUserIDsAction action = new GetUserIDsAction(mockLog) + { + @Override + <T extends Principal> UserPersistence<T> getUserPersistence() + { + return mockPersistence; + }; + }; + + action.run(); + } + catch (Throwable t) + { + log.error(t.getMessage(), t); + fail("unexpected error: " + t.getMessage()); + } + } + +} -- GitLab