From d6c8a952eb033c2cc57a20fe8da02f58dc1e22ef Mon Sep 17 00:00:00 2001
From: Adrian Damian <Adrian.Damian@nrc.ca>
Date: Thu, 26 Jun 2014 09:21:42 -0700
Subject: [PATCH] Added the core authorization classes - code review changes

---
 projects/cadcUtil/doc/uml/UserAuth.png        | Bin 18018 -> 16427 bytes
 .../src/ca/nrc/cadc/auth/model/Group.java     |  81 +---------
 .../ca/nrc/cadc/auth/model/PosixDetails.java  |  15 --
 .../src/ca/nrc/cadc/auth/model/User.java      |  25 +--
 .../src/ca/nrc/cadc/auth/model/GroupTest.java |  63 ++++----
 .../src/ca/nrc/cadc/auth/model/UserTest.java  | 152 ++++++++++++++++--
 6 files changed, 175 insertions(+), 161 deletions(-)

diff --git a/projects/cadcUtil/doc/uml/UserAuth.png b/projects/cadcUtil/doc/uml/UserAuth.png
index 053d993747f04b238aa68e67445000713fca7e23..c36dfcc1fe9c2513edec0e715a4318b130ea89a2 100644
GIT binary patch
literal 16427
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
BrJeu)

literal 18018
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
E04{BtdjJ3c

diff --git a/projects/cadcUtil/src/ca/nrc/cadc/auth/model/Group.java b/projects/cadcUtil/src/ca/nrc/cadc/auth/model/Group.java
index 41e2b98d..30c155ce 100644
--- a/projects/cadcUtil/src/ca/nrc/cadc/auth/model/Group.java
+++ b/projects/cadcUtil/src/ca/nrc/cadc/auth/model/Group.java
@@ -170,88 +170,11 @@ public class Group
             return false;
         }
         Group other = (Group) obj;
-        if (description == null)
-        {
-            if (other.description != null)
-            {
-                return false;
-            }
-        }
-        else if (!description.equals(other.description))
-        {
-            return false;
-        }
-        if (groupRead == null)
-        {
-            if (other.groupRead != null)
-            {
-                return false;
-            }
-        }
-        else if (!groupRead.equals(other.groupRead))
-        {
-            return false;
-        }
-        if (groupWrite == null)
-        {
-            if (other.groupWrite != null)
-            {
-                return false;
-            }
-        }
-        else if (!groupWrite.equals(other.groupWrite))
-        {
-            return false;
-        }
-        if (groupID == null)
-        {
-            if (other.groupID != null)
-            {
-                return false;
-            }
-        }
-        else if (!groupID.equals(other.groupID))
-        {
-            return false;
-        }
-        if (groupMembers == null)
-        {
-            if (other.groupMembers != null)
-            {
-                return false;
-            }
-        }
-        else if (!groupMembers.equals(other.groupMembers))
-        {
-            return false;
-        }
-        if (!owner.equals(other.owner))
-        {
-            return false;
-        }
-        if (properties == null)
-        {
-            if (other.properties != null)
-            {
-                return false;
-            }
-        }
-        else if (!properties.equals(other.properties))
-        {
-            return false;
-        }
-        if (userMembers == null)
-        {
-            if (other.userMembers != null)
-            {
-                return false;
-            }
-        }
-        else if (!userMembers.equals(other.userMembers))
+        if (!groupID.equals(other.groupID))
         {
             return false;
         }
-        return (publicRead == other.publicRead);
+        return true;
     }
     
     @Override
diff --git a/projects/cadcUtil/src/ca/nrc/cadc/auth/model/PosixDetails.java b/projects/cadcUtil/src/ca/nrc/cadc/auth/model/PosixDetails.java
index dd8ea444..ba6cf69f 100644
--- a/projects/cadcUtil/src/ca/nrc/cadc/auth/model/PosixDetails.java
+++ b/projects/cadcUtil/src/ca/nrc/cadc/auth/model/PosixDetails.java
@@ -139,21 +139,6 @@ public class PosixDetails
         {
             return false;
         }
-        if (loginShell == null)
-        {
-            if (other.loginShell != null)
-            {
-                return false;
-            }
-        }
-        else if (!loginShell.equals(other.loginShell))
-        {
-            return false;
-        }
-        if (uid != other.uid)
-        {
-            return false;
-        }
         return true;
     }
 
diff --git a/projects/cadcUtil/src/ca/nrc/cadc/auth/model/User.java b/projects/cadcUtil/src/ca/nrc/cadc/auth/model/User.java
index f455ad98..74ab9ad6 100644
--- a/projects/cadcUtil/src/ca/nrc/cadc/auth/model/User.java
+++ b/projects/cadcUtil/src/ca/nrc/cadc/auth/model/User.java
@@ -108,30 +108,7 @@ public class User<T extends Principal>
         {
             return false;
         }
-        if (userDetails == null)
-        {
-            if (other.userDetails != null)
-            {
-                return false;
-            }
-        }
-        else if (!userDetails.equals(other.userDetails))
-        {
-            return false;
-        }
-        if (posixDetails == null)
-        {
-            if (other.posixDetails != null)
-            {
-                return false;
-            }
-        }
-        else if (!posixDetails.equals(other.posixDetails))
-        {
-            return false;
-        }
-        return this.getPrincipals().equals(other.getPrincipals());
-
+        return true;
     }
     
     @Override
diff --git a/projects/cadcUtil/test/src/ca/nrc/cadc/auth/model/GroupTest.java b/projects/cadcUtil/test/src/ca/nrc/cadc/auth/model/GroupTest.java
index 2fb6f9ce..85c45dcb 100644
--- a/projects/cadcUtil/test/src/ca/nrc/cadc/auth/model/GroupTest.java
+++ b/projects/cadcUtil/test/src/ca/nrc/cadc/auth/model/GroupTest.java
@@ -64,53 +64,33 @@ public class GroupTest
         
         group2 = new Group("TestGroup", owner);
         assertEquals(group1.hashCode(), group2.hashCode());
-        assertFalse(group1.equals(group2));
+        assertEquals(group1,group2);
         
         group2.getUserMembers().add(user);
         assertEquals(group1.hashCode(), group2.hashCode());
-        assertEquals(group1, group2);
+        assertEquals(group1,group2);
         
         group1.getGroupMembers().add(group2);
         assertEquals(group1.hashCode(), group2.hashCode());
-        assertFalse(group1.equals(group2));
-        
-        group2.getGroupMembers().add(group2);
-        assertEquals(group1.hashCode(), group2.hashCode());
-        assertEquals(group1, group2);
+        assertEquals(group1,group2);
         
         group1.description = "Test group";
         assertEquals(group1.hashCode(), group2.hashCode());
-        assertFalse(group1.equals(group2));
-        
-        group2.description = "Test group";
-        assertEquals(group1.hashCode(), group2.hashCode());
-        assertEquals(group1, group2);
+        assertEquals(group1,group2);
         
         // group read and write equality tests     
         group1.groupRead = group2;
         assertEquals(group1.hashCode(), group2.hashCode());
-        assertFalse(group1.equals(group2));
-        
-        group2.groupRead = group2;
-        assertEquals(group1.hashCode(), group2.hashCode());
-        assertEquals(group1, group2);
+        assertEquals(group1,group2);
         
         // group write equality tests
         group1.groupWrite = group2;
         assertEquals(group1.hashCode(), group2.hashCode());
-        assertFalse(group1.equals(group2));
-        
-        group2.groupWrite = group2;
-        assertEquals(group1.hashCode(), group2.hashCode());
-        assertEquals(group1, group2);
-        
+        assertEquals(group1,group2);
+
         group1.publicRead = true;
         assertEquals(group1.hashCode(), group2.hashCode());
-        assertFalse(group1.equals(group2));
-        
-        group2.publicRead = true;
-        assertEquals(group1.hashCode(), group2.hashCode());
-        assertEquals(group1, group2);
+        assertEquals(group1,group2);
         
         group2 = new Group("NewTestGroup", owner);
         assertFalse(group1.hashCode() == group2.hashCode());
@@ -119,4 +99,31 @@ public class GroupTest
         // test toString
         System.out.println(group1);
     }
+    
+    @Test
+    public void exceptionTests()
+    {
+        boolean thrown = false;
+        try
+        {
+            new Group(null, new User<HttpPrincipal>(new HttpPrincipal("owner")));
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        
+        thrown = false;
+        try
+        {
+            new Group("NewTestGroup", null);
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+    }
 }
diff --git a/projects/cadcUtil/test/src/ca/nrc/cadc/auth/model/UserTest.java b/projects/cadcUtil/test/src/ca/nrc/cadc/auth/model/UserTest.java
index c87163ed..547b37d4 100644
--- a/projects/cadcUtil/test/src/ca/nrc/cadc/auth/model/UserTest.java
+++ b/projects/cadcUtil/test/src/ca/nrc/cadc/auth/model/UserTest.java
@@ -36,7 +36,7 @@ package ca.nrc.cadc.auth.model;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
 
 import javax.security.auth.x500.X500Principal;
 
@@ -45,6 +45,7 @@ import org.junit.Test;
 
 import ca.nrc.cadc.auth.HttpPrincipal;
 import ca.nrc.cadc.auth.NumericPrincipal;
+import ca.nrc.cadc.auth.OpenIdPrincipal;
 
 public class UserTest
 {
@@ -66,13 +67,10 @@ public class UserTest
 
         user1.userDetails = new UserDetails("Joe", "Raymond",
                 "jr@email.com", "123 Street", "CADC", "Victoria", "CA");
-        assertFalse(user1.equals(user2));
-        assertEquals(user1.hashCode(), user2.hashCode());
-
-        user2.userDetails = user1.userDetails;
         assertEquals(user1, user2);
         assertEquals(user1.hashCode(), user2.hashCode());
 
+
         User<X500Principal> user3 = new User<X500Principal>(
                 new X500Principal("cn=aaa,ou=ca"));
         User<HttpPrincipal> user4 = new User<HttpPrincipal>(
@@ -81,20 +79,12 @@ public class UserTest
         assertFalse(user3.hashCode() == user4.hashCode());
 
         user1.getPrincipals().add(new X500Principal("cn=aaa,ou=ca"));
-        assertFalse(user1.equals(user2));
-        assertEquals(user1.hashCode(), user2.hashCode());
-
-        user2.getPrincipals().add(new X500Principal("cn=aaa,ou=ca"));
-        assertEquals(user1, user1);
+        assertEquals(user1, user2);
         assertEquals(user1.hashCode(), user2.hashCode());
 
         user1.posixDetails = new PosixDetails(12, 23,
                 "/home/myhome");
-        assertFalse(user1.equals(user2));
-        assertEquals(user1.hashCode(), user2.hashCode());
-
-        user2.getPrincipals().add(new X500Principal("cn=aaa,ou=ca"));
-        assertEquals(user1, user1);
+        assertEquals(user1, user2);
         assertEquals(user1.hashCode(), user2.hashCode());
 
         User<NumericPrincipal> user5 = new User<NumericPrincipal>(
@@ -107,4 +97,136 @@ public class UserTest
         System.out.println(user1.posixDetails);
         
     }
+    
+    @Test
+    public void exceptionTests()
+    {
+        boolean thrown = false;
+        try
+        {
+            new User<NumericPrincipal>(null);
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new UserDetails(null, "Raymond",
+                    "jr@email.com", "123 Street", "CADC", "Victoria", "CA");
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new UserDetails("Joe", null,
+                    "jr@email.com", "123 Street", "CADC", "Victoria", "CA");
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new UserDetails("Joe", "Raymond",
+                    null, "123 Street", "CADC", "Victoria", "CA");
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new UserDetails("Joe", "Raymond",
+                    "jr@email.com", null, "CADC", "Victoria", "CA");
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new UserDetails("Joe", "Raymond",
+                    "jr@email.com", "123 Street", null, "Victoria", "CA");
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new UserDetails("Joe", "Raymond",
+                    "jr@email.com", "123 Street", "CADC", null, "CA");
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new UserDetails("Joe", "Raymond",
+                    "jr@email.com", "123 Street", "CADC", "Victoria", null);
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new PosixDetails(11, 22, null);
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new HttpPrincipal(null);
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+        
+        thrown = false;
+        try
+        {
+            new OpenIdPrincipal(null);
+        }
+        catch(IllegalArgumentException e)
+        {
+            thrown = true;
+        }
+        assertTrue(thrown);
+    }
 }
-- 
GitLab