You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ve...@apache.org on 2016/05/09 12:20:41 UTC

incubator-ranger git commit: RANGER-970 Adding ability to transform users and groups when using file source

Repository: incubator-ranger
Updated Branches:
  refs/heads/master 96dc7f4b0 -> ec749f09e


RANGER-970 Adding ability to transform users and groups when using file source

Signed-off-by: Velmurugan Periasamy <ve...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/ec749f09
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/ec749f09
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/ec749f09

Branch: refs/heads/master
Commit: ec749f09e0b1b88787690476ea1aca92e603bf32
Parents: 96dc7f4
Author: Bryan Bende <bb...@apache.org>
Authored: Thu May 5 13:11:43 2016 -0400
Committer: Velmurugan Periasamy <ve...@apache.org>
Committed: Mon May 9 08:20:28 2016 -0400

----------------------------------------------------------------------
 .../process/LdapUserGroupBuilder.java           |  47 +-----
 .../process/FileSourceUserGroupBuilder.java     |  23 ++-
 .../usergroupsync/AbstractUserGroupSource.java  |  70 ++++++++
 .../process/FileSourceUserGroupBuilderTest.java | 160 +++++++++++++++++++
 .../ranger/usergroupsync/LdapUserGroupTest.java |  34 +++-
 .../PolicyMgrUserGroupBuilderTest.java          |  18 ++-
 ugsync/src/test/resources/usergroups-dns.csv    |   4 +
 .../test/resources/usergroups-other-delim.csv   |   4 +
 ugsync/src/test/resources/usergroups.csv        |   4 +
 ugsync/src/test/resources/usergroups.json       |   6 +
 10 files changed, 316 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java
----------------------------------------------------------------------
diff --git a/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java b/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java
index b12d209..0b76883 100644
--- a/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java
+++ b/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java
@@ -47,17 +47,14 @@ import javax.naming.ldap.StartTlsResponse;
 
 import org.apache.log4j.Logger;
 import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
-import org.apache.ranger.usergroupsync.Mapper;
+import org.apache.ranger.usergroupsync.AbstractUserGroupSource;
 import org.apache.ranger.usergroupsync.UserGroupSink;
-import org.apache.ranger.usergroupsync.UserGroupSource;
 
-public class LdapUserGroupBuilder implements UserGroupSource {
+public class LdapUserGroupBuilder extends AbstractUserGroupSource {
 	
 	private static final Logger LOG = Logger.getLogger(LdapUserGroupBuilder.class);
 	
 	private static final int PAGE_SIZE = 500;
-	
-	private UserGroupSyncConfig config = UserGroupSyncConfig.getInstance();
 
   private String ldapUrl;
   private String ldapBindDn;
@@ -100,9 +97,7 @@ public class LdapUserGroupBuilder implements UserGroupSource {
 	private boolean groupNameLowerCaseFlag = false ;
 
   private boolean  groupUserMapSyncEnabled = false;
-  
-  Mapper userNameRegExInst = null;
-  Mapper groupNameRegExInst = null;
+
   private Map<String, UserInfo> userGroupMap;
   
 	public static void main(String[] args) throws Throwable {
@@ -111,6 +106,7 @@ public class LdapUserGroupBuilder implements UserGroupSource {
 	}
 	
 	public LdapUserGroupBuilder() {
+		super();
 		LOG.info("LdapUserGroupBuilder created") ;
 		
 		String userNameCaseConversion = config.getUserNameCaseConversion() ;
@@ -132,41 +128,6 @@ public class LdapUserGroupBuilder implements UserGroupSource {
 		    groupNameCaseConversionFlag = true ;
 		    groupNameLowerCaseFlag = UserGroupSyncConfig.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(groupNameCaseConversion) ;
 		}
-		
-		String mappingUserNameHandler = config.getUserSyncMappingUserNameHandler();
-		try {
-			if (mappingUserNameHandler != null) {
-				Class<Mapper> regExClass = (Class<Mapper>)Class.forName(mappingUserNameHandler);
-				userNameRegExInst = regExClass.newInstance();
-				if (userNameRegExInst != null) {
-					userNameRegExInst.init(UserGroupSyncConfig.SYNC_MAPPING_USERNAME);
-				} else {
-					LOG.error("RegEx handler instance for username is null!");
-				}
-			}
-		} catch (ClassNotFoundException cne) {
-			LOG.error("Failed to load " + mappingUserNameHandler + " " + cne);
-		} catch (Throwable te) {
-			LOG.error("Failed to instantiate " + mappingUserNameHandler + " " + te);
-		}
-
-		String mappingGroupNameHandler = config.getUserSyncMappingGroupNameHandler();
-		try {
-			if (mappingGroupNameHandler != null) {
-				Class<Mapper> regExClass = (Class<Mapper>)Class.forName(mappingGroupNameHandler);
-				groupNameRegExInst = regExClass.newInstance();
-				if (groupNameRegExInst != null) {
-					groupNameRegExInst.init(UserGroupSyncConfig.SYNC_MAPPING_GROUPNAME);
-				} else {
-					LOG.error("RegEx handler instance for groupname is null!");
-				}
-			}
-		} catch (ClassNotFoundException cne) {
-			LOG.error("Failed to load " + mappingGroupNameHandler + " " + cne);
-		} catch (Throwable te) {
-			LOG.error("Failed to instantiate " + mappingGroupNameHandler + " " + te);
-		}
-		
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java
----------------------------------------------------------------------
diff --git a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java
index 312f383..54e47f6 100644
--- a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java
+++ b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java
@@ -32,6 +32,7 @@ import org.apache.commons.csv.CSVParser;
 import org.apache.commons.csv.CSVRecord;
 import org.apache.log4j.Logger;
 import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
+import org.apache.ranger.usergroupsync.AbstractUserGroupSource;
 import org.apache.ranger.usergroupsync.UserGroupSink;
 import org.apache.ranger.usergroupsync.UserGroupSource;
 
@@ -39,11 +40,10 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.stream.JsonReader;
 
-public class FileSourceUserGroupBuilder  implements UserGroupSource {
+public class FileSourceUserGroupBuilder extends AbstractUserGroupSource {
 	private static final Logger LOG = Logger.getLogger(FileSourceUserGroupBuilder.class) ;
 
 	private Map<String,List<String>> user2GroupListMap     = new HashMap<String,List<String>>();
-	private UserGroupSyncConfig      config                = UserGroupSyncConfig.getInstance();
 	private String                   userGroupFilename     = null;
 	private long                     usergroupFileModified = 0 ;
 
@@ -67,6 +67,10 @@ public class FileSourceUserGroupBuilder  implements UserGroupSource {
 			filesourceUGBuilder.print(); 
 		}
 	}
+
+	public FileSourceUserGroupBuilder() {
+		super();
+	}
 	
 	@Override
 	public void init() throws Throwable {
@@ -91,9 +95,22 @@ public class FileSourceUserGroupBuilder  implements UserGroupSource {
 		buildUserGroupInfo();
 
 		for (Map.Entry<String, List<String>> entry : user2GroupListMap.entrySet()) {
-		    String       user   = entry.getKey();
+		    String user = entry.getKey();
+
+			if (userNameRegExInst != null) {
+				user = userNameRegExInst.transform(user);
+			}
+
 		    List<String> groups = entry.getValue();
 
+			if (groupNameRegExInst != null) {
+				List<String> mappedGroups = new ArrayList<>();
+				for (String group : groups) {
+					mappedGroups.add(groupNameRegExInst.transform(group));
+				}
+				groups = mappedGroups;
+			}
+
 		    sink.addOrUpdateUser(user, groups);
 		}
 	}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java
----------------------------------------------------------------------
diff --git a/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java b/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java
new file mode 100644
index 0000000..4a54e57
--- /dev/null
+++ b/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ranger.usergroupsync;
+
+import org.apache.log4j.Logger;
+import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
+
+public abstract class AbstractUserGroupSource implements UserGroupSource {
+
+    private static final Logger LOG = Logger.getLogger(AbstractUserGroupSource.class);
+
+    protected UserGroupSyncConfig config = UserGroupSyncConfig.getInstance();
+
+    protected Mapper userNameRegExInst = null;
+    protected Mapper groupNameRegExInst = null;
+
+
+    public AbstractUserGroupSource() {
+        String mappingUserNameHandler = config.getUserSyncMappingUserNameHandler();
+        try {
+            if (mappingUserNameHandler != null) {
+                Class<Mapper> regExClass = (Class<Mapper>)Class.forName(mappingUserNameHandler);
+                userNameRegExInst = regExClass.newInstance();
+                if (userNameRegExInst != null) {
+                    userNameRegExInst.init(UserGroupSyncConfig.SYNC_MAPPING_USERNAME);
+                } else {
+                    LOG.error("RegEx handler instance for username is null!");
+                }
+            }
+        } catch (ClassNotFoundException cne) {
+            LOG.error("Failed to load " + mappingUserNameHandler + " " + cne);
+        } catch (Throwable te) {
+            LOG.error("Failed to instantiate " + mappingUserNameHandler + " " + te);
+        }
+
+        String mappingGroupNameHandler = config.getUserSyncMappingGroupNameHandler();
+        try {
+            if (mappingGroupNameHandler != null) {
+                Class<Mapper> regExClass = (Class<Mapper>)Class.forName(mappingGroupNameHandler);
+                groupNameRegExInst = regExClass.newInstance();
+                if (groupNameRegExInst != null) {
+                    groupNameRegExInst.init(UserGroupSyncConfig.SYNC_MAPPING_GROUPNAME);
+                } else {
+                    LOG.error("RegEx handler instance for groupname is null!");
+                }
+            }
+        } catch (ClassNotFoundException cne) {
+            LOG.error("Failed to load " + mappingGroupNameHandler + " " + cne);
+        } catch (Throwable te) {
+            LOG.error("Failed to instantiate " + mappingGroupNameHandler + " " + te);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/test/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilderTest.java
----------------------------------------------------------------------
diff --git a/ugsync/src/test/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilderTest.java b/ugsync/src/test/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilderTest.java
new file mode 100644
index 0000000..65a339c
--- /dev/null
+++ b/ugsync/src/test/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilderTest.java
@@ -0,0 +1,160 @@
+/*
+ * 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.ranger.unixusersync.process;
+
+import static org.junit.Assert.*;
+
+import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
+import org.apache.ranger.usergroupsync.PolicyMgrUserGroupBuilderTest;
+import org.junit.Test;
+
+public class FileSourceUserGroupBuilderTest {
+
+    private UserGroupSyncConfig config = UserGroupSyncConfig.getInstance();
+
+    @Test
+    public void testUpdateSinkFromCsvFile() throws Throwable {
+        config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_PROC, "src/test/resources/usergroups.csv");
+
+        FileSourceUserGroupBuilder fileBuilder = new FileSourceUserGroupBuilder();
+        fileBuilder.init();
+
+        PolicyMgrUserGroupBuilderTest sink = new PolicyMgrUserGroupBuilderTest();
+        sink.init();
+        fileBuilder.updateSink(sink);
+
+        assertEquals(4, sink.getTotalUsers());
+        assertEquals(2, sink.getTotalGroups());
+
+        assertTrue(sink.getAllUsers().contains("user1"));
+        assertTrue(sink.getAllUsers().contains("user2"));
+        assertTrue(sink.getAllUsers().contains("user3"));
+        assertTrue(sink.getAllUsers().contains("user4"));
+
+        assertTrue(sink.getAllGroups().contains("group1"));
+        assertTrue(sink.getAllGroups().contains("group2"));
+    }
+
+    @Test
+    public void testUpdateSinkFromCsvFileWithCustomDelimiter() throws Throwable {
+        config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_PROC,
+                "src/test/resources/usergroups-other-delim.csv");
+        config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_DELIMITER, "|");
+
+        FileSourceUserGroupBuilder fileBuilder = new FileSourceUserGroupBuilder();
+        fileBuilder.init();
+
+        PolicyMgrUserGroupBuilderTest sink = new PolicyMgrUserGroupBuilderTest();
+        sink.init();
+        fileBuilder.updateSink(sink);
+
+        assertEquals(4, sink.getTotalUsers());
+        assertEquals(2, sink.getTotalGroups());
+
+        assertTrue(sink.getAllUsers().contains("user1"));
+        assertTrue(sink.getAllUsers().contains("user2"));
+        assertTrue(sink.getAllUsers().contains("user3"));
+        assertTrue(sink.getAllUsers().contains("user4"));
+
+        assertTrue(sink.getAllGroups().contains("group1"));
+        assertTrue(sink.getAllGroups().contains("group2"));
+    }
+
+    @Test
+    public void testUpdateSinkFromCsvFileMisSpelledDelimiterProperty() throws Throwable {
+        config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_PROC,
+                "src/test/resources/usergroups-other-delim.csv");
+        config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_DELIMITERER, "|");
+
+        FileSourceUserGroupBuilder fileBuilder = new FileSourceUserGroupBuilder();
+        fileBuilder.init();
+
+        PolicyMgrUserGroupBuilderTest sink = new PolicyMgrUserGroupBuilderTest();
+        sink.init();
+        fileBuilder.updateSink(sink);
+
+        assertEquals(4, sink.getTotalUsers());
+        assertEquals(2, sink.getTotalGroups());
+
+        assertTrue(sink.getAllUsers().contains("user1"));
+        assertTrue(sink.getAllUsers().contains("user2"));
+        assertTrue(sink.getAllUsers().contains("user3"));
+        assertTrue(sink.getAllUsers().contains("user4"));
+
+        assertTrue(sink.getAllGroups().contains("group1"));
+        assertTrue(sink.getAllGroups().contains("group2"));
+    }
+
+    @Test
+    public void testUpdateSinkFromJsonFile() throws Throwable {
+        config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_PROC, "src/test/resources/usergroups.json");
+
+        FileSourceUserGroupBuilder fileBuilder = new FileSourceUserGroupBuilder();
+        fileBuilder.init();
+
+        PolicyMgrUserGroupBuilderTest sink = new PolicyMgrUserGroupBuilderTest();
+        sink.init();
+        fileBuilder.updateSink(sink);
+
+        assertEquals(4, sink.getTotalUsers());
+        assertEquals(7, sink.getTotalGroups());
+
+        assertTrue(sink.getAllUsers().contains("user1"));
+        assertTrue(sink.getAllUsers().contains("user2"));
+        assertTrue(sink.getAllUsers().contains("user3"));
+        assertTrue(sink.getAllUsers().contains("user4"));
+
+        assertTrue(sink.getAllGroups().contains("group1"));
+        assertTrue(sink.getAllGroups().contains("group2"));
+        assertTrue(sink.getAllGroups().contains("group3"));
+        assertTrue(sink.getAllGroups().contains("group4"));
+        assertTrue(sink.getAllGroups().contains("group5"));
+        assertTrue(sink.getAllGroups().contains("group6"));
+        assertTrue(sink.getAllGroups().contains("group7"));
+    }
+
+    @Test
+    public void testUpdateSinkWithUserAndGroupMapping() throws Throwable {
+        config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_PROC, "src/test/resources/usergroups-dns.csv");
+        config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_DELIMITERER, "|");
+
+        config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_USERNAME, "s/[=]/_/g");
+        config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_USERNAME + ".1", "s/[,]//g");
+
+        config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_GROUPNAME, "s/[=]//g");
+
+        FileSourceUserGroupBuilder fileBuilder = new FileSourceUserGroupBuilder();
+        fileBuilder.init();
+
+        PolicyMgrUserGroupBuilderTest sink = new PolicyMgrUserGroupBuilderTest();
+        sink.init();
+        fileBuilder.updateSink(sink);
+
+        assertEquals(4, sink.getTotalUsers());
+        assertEquals(2, sink.getTotalGroups());
+
+        assertTrue(sink.getAllUsers().contains("CN_User1 OU_Org1 O_Apache L_Santa Monica ST_CA C_US"));
+        assertTrue(sink.getAllUsers().contains("CN_User2 OU_Org1 O_Apache L_Santa Monica ST_CA C_US"));
+        assertTrue(sink.getAllUsers().contains("CN_User3 OU_Org1 O_Apache L_Santa Monica ST_CA C_US"));
+        assertTrue(sink.getAllUsers().contains("CN_User4 OU_Org1 O_Apache L_Santa Monica ST_CA C_US"));
+
+        assertTrue(sink.getAllGroups().contains("group1"));
+        assertTrue(sink.getAllGroups().contains("group2"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/test/java/org/apache/ranger/usergroupsync/LdapUserGroupTest.java
----------------------------------------------------------------------
diff --git a/ugsync/src/test/java/org/apache/ranger/usergroupsync/LdapUserGroupTest.java b/ugsync/src/test/java/org/apache/ranger/usergroupsync/LdapUserGroupTest.java
index b285e78..4355c4d 100644
--- a/ugsync/src/test/java/org/apache/ranger/usergroupsync/LdapUserGroupTest.java
+++ b/ugsync/src/test/java/org/apache/ranger/usergroupsync/LdapUserGroupTest.java
@@ -20,6 +20,7 @@
 package org.apache.ranger.usergroupsync;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 import org.apache.directory.server.annotations.CreateLdapConnectionPool;
 import org.apache.directory.server.core.annotations.ApplyLdifFiles;
@@ -39,7 +40,6 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import org.apache.directory.server.core.annotations.CreateIndex;
-import org.apache.ranger.usergroupsync.PolicyMgrUserGroupBuilderTest;
 
 @RunWith(FrameworkRunner.class)
 @CreateDS(name = "classDS",
@@ -484,6 +484,38 @@ public class LdapUserGroupTest extends AbstractLdapTestUnit{
 		assertEquals(3, sink.getTotalGroups());
 	}
 
+	@Test
+	public void testUpdateSinkWithUserGroupMapping() throws Throwable {
+		config.setUserSearchBase("cn=users,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+		config.setUserSearchFilter("");
+		config.setGroupSearchBase("OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+		config.setGroupSearchFilter("");
+		config.setUserGroupMemberAttributeName("member");
+		config.setUserObjectClass("organizationalPerson");
+		config.setGroupObjectClass("groupOfNames");
+		config.setGroupSearchEnabled(true);
+		config.setGroupSearchFirstEnabled(false);
+
+		config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_USERNAME, "s/[=]/_/g");
+		config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_GROUPNAME, "s/[=]/_/g");
+
+		ldapBuilder.init();
+		PolicyMgrUserGroupBuilderTest sink = new PolicyMgrUserGroupBuilderTest();
+		sink.init();
+		ldapBuilder.updateSink(sink);
+		assertEquals(10, sink.getTotalGroups());
+
+		// no user should have an = character because of the mapping
+		for (String user : sink.getAllUsers()) {
+			assertFalse(user.contains("="));
+		}
+
+		// no group should have an = character because of the mapping
+		for (String group : sink.getAllGroups()) {
+			assertFalse(group.contains("="));
+		}
+	}
+
 	@After
 	public void shutdown() throws Exception {
 		if (getService().isStarted()) {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java
----------------------------------------------------------------------
diff --git a/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java b/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java
index 0d817f6..2880bcb 100644
--- a/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java
+++ b/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java
@@ -26,32 +26,29 @@ import java.util.Set;
 import org.apache.ranger.unixusersync.process.PolicyMgrUserGroupBuilder;
 
 public class PolicyMgrUserGroupBuilderTest extends PolicyMgrUserGroupBuilder {
-        private static int totalUsers = 0;
-        //private static int totalGroups = 0;
         private Set<String> allGroups;
+        private Set<String> allUsers;
 
         @Override
         public void init() throws Throwable {
-                // TODO Auto-generated method stub
-                totalUsers = 0;
                 allGroups = new HashSet<>();
+                allUsers = new HashSet<>();
         }
 
         @Override
         public void addOrUpdateUser(String user, List<String> groups) {
-                totalUsers++;
                 allGroups.addAll(groups);
+                allUsers.add(user);
                 //System.out.println("Username: " + user + " and associated groups: " + groups);
         }
         
         @Override
         public void addOrUpdateGroup(String group) {
-                //totalGroups++;
                 allGroups.add(group);
         }
 
         public int getTotalUsers() {
-                return totalUsers;
+                return allUsers.size();
         }
 
         public int getTotalGroups() {
@@ -59,4 +56,11 @@ public class PolicyMgrUserGroupBuilderTest extends PolicyMgrUserGroupBuilder {
                 return allGroups.size();
         }
 
+        public Set<String> getAllGroups() {
+                return allGroups;
+        }
+
+        public Set<String> getAllUsers() {
+                return allUsers;
+        }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/test/resources/usergroups-dns.csv
----------------------------------------------------------------------
diff --git a/ugsync/src/test/resources/usergroups-dns.csv b/ugsync/src/test/resources/usergroups-dns.csv
new file mode 100644
index 0000000..d6fc5a8
--- /dev/null
+++ b/ugsync/src/test/resources/usergroups-dns.csv
@@ -0,0 +1,4 @@
+CN=User1, OU=Org1, O=Apache, L=Santa Monica, ST=CA, C=US|group=1
+CN=User2, OU=Org1, O=Apache, L=Santa Monica, ST=CA, C=US|group=2
+CN=User3, OU=Org1, O=Apache, L=Santa Monica, ST=CA, C=US|group=1|group=2
+CN=User4, OU=Org1, O=Apache, L=Santa Monica, ST=CA, C=US|
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/test/resources/usergroups-other-delim.csv
----------------------------------------------------------------------
diff --git a/ugsync/src/test/resources/usergroups-other-delim.csv b/ugsync/src/test/resources/usergroups-other-delim.csv
new file mode 100644
index 0000000..6a00ebf
--- /dev/null
+++ b/ugsync/src/test/resources/usergroups-other-delim.csv
@@ -0,0 +1,4 @@
+user1|group1
+user2|group2
+user3|group1|group2
+user4|
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/test/resources/usergroups.csv
----------------------------------------------------------------------
diff --git a/ugsync/src/test/resources/usergroups.csv b/ugsync/src/test/resources/usergroups.csv
new file mode 100644
index 0000000..27770cd
--- /dev/null
+++ b/ugsync/src/test/resources/usergroups.csv
@@ -0,0 +1,4 @@
+user1,group1
+user2,group2
+user3,group1,group2
+user4,
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ec749f09/ugsync/src/test/resources/usergroups.json
----------------------------------------------------------------------
diff --git a/ugsync/src/test/resources/usergroups.json b/ugsync/src/test/resources/usergroups.json
new file mode 100644
index 0000000..100b97a
--- /dev/null
+++ b/ugsync/src/test/resources/usergroups.json
@@ -0,0 +1,6 @@
+{
+  "user1":["group1","group2","group3","group4"],
+  "user2":["group5","group6","group7"],
+  "user3":[],
+  "user4":["group1","group6"]
+}
\ No newline at end of file