View Javadoc
1   package org.melati.poem.test;
2   
3   import java.util.Enumeration;
4   
5   import org.melati.poem.AccessToken;
6   import org.melati.poem.CachedCount;
7   import org.melati.poem.Capability;
8   import org.melati.poem.DeletionIntegrityPoemException;
9   import org.melati.poem.Field;
10  import org.melati.poem.Group;
11  import org.melati.poem.GroupCapability;
12  import org.melati.poem.GroupMembership;
13  import org.melati.poem.NonRootSetAccessTokenPoemException;
14  import org.melati.poem.Persistent;
15  import org.melati.poem.PoemThread;
16  import org.melati.poem.ReadPersistentAccessPoemException;
17  import org.melati.poem.test.User;
18  import org.melati.poem.util.StringUtils;
19  
20  /**
21   * @author timp
22   * @since 26 Jan 2007
23   *
24   */
25  public class ProtectedPersistentTest extends PersistentTest {
26  
27    public ProtectedPersistentTest(String name) {
28      super(name);
29    }
30  
31    protected void setUp() throws Exception {
32      super.setUp();
33    }
34  
35    protected void tearDown() throws Exception {
36      super.tearDown();
37    }
38  
39    protected void databaseUnchanged() { 
40      deleteUser("moneypenny");
41      deleteUser("smiley");
42      deleteUser("bond");
43      deleteGroup("officeWorkers");
44      deleteGroup("spyMasters");
45      deleteCapability("monitor");
46      deleteCapability("commission");
47      getDb().getUserTable().getTableInfo().setDefaultcanread(null);
48      super.databaseUnchanged();
49    } 
50    private void deleteCapability(String name) {
51      Capability c = (Capability)getDb().getCapabilityTable().getNameColumn().firstWhereEq(name);
52      
53      if (c != null) { 
54        System.err.println("Cleaning up: " + c);      
55        c.delete();      
56      } else { 
57        System.err.println("Nothing to clean up");            
58      }
59    }
60  
61    private void deleteUser(String name) {
62      User u = (User)getDb().getUserTable().getLoginColumn().firstWhereEq(name);
63      if (u != null) { 
64        System.err.println("Cleaning up: " + u);      
65        u.delete();
66      } else 
67        System.err.println("Nothing to clean up");      
68    }
69    private void deleteGroup(String group) {
70      Group g = (Group)getDb().getGroupTable().getNameColumn().firstWhereEq(group);
71      if (g != null) { 
72        System.err.println("Cleaning up: " + g);
73        Enumeration<Persistent> gcs = getDb().getGroupCapabilityTable().getGroupColumn().selectionWhereEq(g.getTroid());
74        while(gcs.hasMoreElements()) { 
75          GroupCapability gc = (GroupCapability)gcs.nextElement();
76          System.err.println("Cleaning up: " + gc);
77          gc.delete();
78        }
79        Enumeration<Persistent> gms = getDb().getGroupMembershipTable().getGroupColumn().
80                              selectionWhereEq(g.getTroid());
81        while (gms.hasMoreElements()) { 
82          GroupMembership gm = (GroupMembership)gms.nextElement();
83          System.err.println("Cleaning up: " + gm);
84          gm.delete();
85        }
86        try {
87          g.delete();
88        } catch (DeletionIntegrityPoemException e) {
89          Enumeration<Persistent> refs = e.references;
90          while (refs.hasMoreElements()) { 
91            Object o = refs.nextElement();
92            System.err.println("Failed to delete " + g + " due to " +o);
93          }
94        }
95      }
96      
97    }
98  
99    /** 
100    * {@inheritDoc}
101    * @see org.melati.poem.test.PersistentTest#testDelete()
102    */
103   public void testDelete() {
104     if (!getDb().getDbms().canDropColumns()) {
105       return;
106     }
107     super.testDelete();
108   }
109 
110   /** 
111    * {@inheritDoc}
112    * @see org.melati.poem.test.PersistentTest#testDeleteAndCommit()
113    */
114   public void testDeleteAndCommit() {
115     if (!getDb().getDbms().canDropColumns()) {
116       return;
117     }
118     super.testDeleteAndCommit();
119   }
120 
121   /**
122    * @see org.melati.poem.Persistent#assertCanRead(AccessToken)
123    */
124   public void testAssertCanReadAccessToken() {
125     Persistent admin = getDb().getUserTable().administratorUser();
126     AccessToken guest  = getDb().getUserTable().guestUser();
127     if (admin.getTable().getTableInfo().getDefaultcanread() == null) // May be set from previous run
128       admin.assertCanRead(guest);
129     admin.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
130     try {
131       admin.assertCanRead(guest);
132       System.err.println("WTF:" + guest.givesCapability(getDb().administerCapability()));
133       fail("Should have bombed");
134     } catch (ReadPersistentAccessPoemException e) {
135       e = null;
136     }
137     AccessToken a  = getDb().getUserTable().administratorUser();
138     admin.assertCanRead(a);
139     admin.getTable().getTableInfo().setDefaultcanread(null);
140   }
141 
142   /**
143    * @see org.melati.poem.Persistent#assertCanRead()
144    */
145   public void testAssertCanRead() {
146     Persistent p = getDb().getUserTable().administratorUser();
147     p.assertCanRead();
148     p.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
149     AccessToken g  = getDb().getUserTable().guestUser();
150     PoemThread.setAccessToken(g);
151     try {
152       p.assertCanRead();
153       fail("Should have bombed");
154     } catch (ReadPersistentAccessPoemException e) {
155       e = null;
156     }
157     AccessToken a  = getDb().getUserTable().administratorUser();
158     try { 
159       PoemThread.setAccessToken(a);
160       fail("Should have bombed");
161     } catch (NonRootSetAccessTokenPoemException e) {
162       e = null;
163     }
164     /** @see #everythingDatabaseUnchanged() */
165     //p.getTable().getTableInfo().setDefaultcanread(null);
166   }
167 
168   /**
169    * @see org.melati.poem.Persistent#getReadable()
170    */
171   public void testGetReadable() {
172     Persistent p = getDb().getUserTable().administratorUser();
173     assertTrue(p.getReadable());
174     p.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
175     AccessToken g  = getDb().getUserTable().guestUser();
176     PoemThread.setAccessToken(g);
177     assertFalse(p.getReadable());
178     /** @see #everythingDatabaseUnchanged() */
179     //p.getTable().getTableInfo().setDefaultcanread(null);
180   }
181 
182   /**
183    * @see org.melati.poem.Persistent#getPrimaryDisplayField()
184    */
185   public void testGetPrimaryDisplayField() {
186     Persistent p = getDb().getGroupMembershipTable().getObject(0);
187     Field<?> f = p.getPrimaryDisplayField();
188     assertEquals("id: 0", f.toString());
189   }
190 
191 
192   /**
193    * @see org.melati.poem.Table#cachedCount(String, boolean, boolean)
194    */
195   public void testCachedCountStringBooleanBoolean() {
196     EverythingDatabase db = (EverythingDatabase)getDb();
197     Capability commission = db.getCapabilityTable().ensure("commission");
198     Capability monitor = db.getCapabilityTable().ensure("monitor");
199     
200     User spy = ensureUser("bond");
201     User smiley = ensureUser("smiley");
202     User moneypenny = ensureUser("moneypenny");
203 
204     Protected spyMission = (Protected)db.getProtectedTable().newPersistent();
205     spyMission.setCanRead(monitor);
206     spyMission.setCanSelect(monitor);
207     spyMission.setCanWrite(monitor);
208     spyMission.setCanDelete(commission);
209     spyMission.setSpy(spy);
210     spyMission.setMission("impossible");
211     spyMission.setDeleted(false);
212     spyMission.makePersistent();
213 
214     Group officeWorkers = db.getGroupTable().ensure("officeWorkers");
215     GroupMembership inOfficeWorkersMoneyPenny = (GroupMembership)db.getGroupMembershipTable().newPersistent();
216     inOfficeWorkersMoneyPenny.setGroup(officeWorkers);
217     inOfficeWorkersMoneyPenny.setUser(moneypenny);
218     inOfficeWorkersMoneyPenny.makePersistent();
219     //GroupCapability officeWorkersMonitor = db.getGroupCapabilityTable().ensure(officeWorkers, monitor);
220     
221     Group spyMasters = db.getGroupTable().ensure("spyMasters");
222     GroupMembership inSpyMastersSmiley = (GroupMembership)db.getGroupMembershipTable().newPersistent();
223     inSpyMastersSmiley.setGroup(spyMasters);
224     inSpyMastersSmiley.setUser(smiley);
225     inSpyMastersSmiley.makePersistent();
226     
227     db.getGroupCapabilityTable().ensure(spyMasters, commission);
228     db.getGroupCapabilityTable().ensure(spyMasters, monitor);
229     
230     PoemThread.setAccessToken(smiley);
231     spyMission.assertCanRead();
232     String query = db.getProtectedTable().getMissionColumn().fullQuotedName() + "='impossible'";
233     CachedCount cached = db.getProtectedTable().
234       cachedCount(query,false,true); 
235     assertEquals(1, cached.count());
236     
237     spyMission.delete();
238 
239     
240     // Deletion performed above
241   }
242   
243   private User ensureUser(String name) {
244     User u = (User)((EverythingDatabase)getDb()).getUserTable().newPersistent();
245     u.setLogin(name);
246     u.setName(StringUtils.capitalised(name));
247     u.setPassword(name);
248     u.makePersistent();
249     return u;
250   }
251 }