def test_cacheUsed(self): delegator = yield self.directory.recordWithUID(u"__wsanchez1__") delegate1 = yield self.directory.recordWithUID(u"__sagen1__") # Patch transaction so we can monitor whether cache is being used original_delegates = CommonStoreTransaction.delegates delegates_query = [0] def _delegates(self, delegator, readWrite, expanded=False): delegates_query[0] += 1 return original_delegates(self, delegator, readWrite, expanded) self.patch(CommonStoreTransaction, "delegates", _delegates) original_delegators = CommonStoreTransaction.delegators delegators_query = [0] def _delegators(self, delegate, readWrite): delegators_query[0] += 1 return original_delegators(self, delegate, readWrite) self.patch(CommonStoreTransaction, "delegators", _delegators) # Not used yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, True, False) self.assertEqual(delegates_query[0], 1) # Used yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, True, False) self.assertEqual(delegates_query[0], 1) # Not used yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False, False) self.assertEqual(delegates_query[0], 2) # Used yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False, False) self.assertEqual(delegates_query[0], 2) # Not used yield Delegates.delegatedTo(self.transactionUnderTest(), delegate1, True) self.assertEqual(delegators_query[0], 1) # Used yield Delegates.delegatedTo(self.transactionUnderTest(), delegate1, True) self.assertEqual(delegators_query[0], 1) # Not used yield Delegates.delegatedTo(self.transactionUnderTest(), delegate1, False) self.assertEqual(delegators_query[0], 2) # Used yield Delegates.delegatedTo(self.transactionUnderTest(), delegate1, False) self.assertEqual(delegators_query[0], 2)
def test_cacheUsed(self): delegator = yield self.directory.recordWithUID(u"__wsanchez1__") delegate1 = yield self.directory.recordWithUID(u"__sagen1__") # Patch transaction so we can monitor whether cache is being used original_delegates = CommonStoreTransaction.delegates delegates_query = [0] def _delegates(self, delegator, readWrite, expanded=False): delegates_query[0] += 1 return original_delegates(self, delegator, readWrite, expanded) self.patch(CommonStoreTransaction, "delegates", _delegates) original_delegators = CommonStoreTransaction.delegators delegators_query = [0] def _delegators(self, delegate, readWrite): delegators_query[0] += 1 return original_delegators(self, delegate, readWrite) self.patch(CommonStoreTransaction, "delegators", _delegators) # Not used yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, True, False) self.assertEqual(delegates_query[0], 1) # Used yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, True, False) self.assertEqual(delegates_query[0], 1) # Not used yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False, False) self.assertEqual(delegates_query[0], 2) # Used yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False, False) self.assertEqual(delegates_query[0], 2) # Not used yield Delegates.delegatedTo(self.transactionUnderTest(), delegate1, True) self.assertEqual(delegators_query[0], 1) # Used yield Delegates.delegatedTo(self.transactionUnderTest(), delegate1, True) self.assertEqual(delegators_query[0], 1) # Not used yield Delegates.delegatedTo(self.transactionUnderTest(), delegate1, False) self.assertEqual(delegators_query[0], 2) # Used yield Delegates.delegatedTo(self.transactionUnderTest(), delegate1, False) self.assertEqual(delegators_query[0], 2)
def _delegatedToResults(self, delegate, readWrite, results): delegators = (yield Delegates.delegatedTo(self.transactionUnderTest(), delegate, readWrite)) self.assertEquals( set([d.uid for d in delegators]), set([delegator.uid for delegator in results]), msg="uid:{}, rw={}".format(delegate.uid, readWrite) )
def _delegatedToResults(self, delegate, readWrite, results): delegators = (yield Delegates.delegatedTo(self.transactionUnderTest(), delegate, readWrite)) self.assertEquals( set([d.uid for d in delegators]), set([delegator.uid for delegator in results]), msg="uid:{}, rw={}".format(delegate.uid, readWrite) )
def test_directDelegation(self): txn = self.store.newTransaction(label="test_directDelegation") delegator = yield self.directory.recordWithUID(u"__wsanchez1__") delegate1 = yield self.directory.recordWithUID(u"__sagen1__") delegate2 = yield self.directory.recordWithUID(u"__cdaboo1__") # Add 1 delegate yield Delegates.addDelegate(txn, delegator, delegate1, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals([u"__sagen1__"], [d.uid for d in delegates]) delegators = (yield Delegates.delegatedTo(txn, delegate1, True)) self.assertEquals([u"__wsanchez1__"], [d.uid for d in delegators]) yield txn.commit() # So delegateService will see the changes txn = self.store.newTransaction(label="test_directDelegation") # The "proxy-write" pseudoGroup will have one member pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.writeDelegateGroup, u"__wsanchez1__" ) self.assertEquals(pseudoGroup.uid, u"__wsanchez1__#calendar-proxy-write") self.assertEquals( [r.uid for r in (yield pseudoGroup.members())], [u"__sagen1__"] ) # The "proxy-read" pseudoGroup will have no members pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.readDelegateGroup, u"__wsanchez1__" ) self.assertEquals(pseudoGroup.uid, u"__wsanchez1__#calendar-proxy-read") self.assertEquals( [r.uid for r in (yield pseudoGroup.members())], [] ) # The "proxy-write-for" pseudoGroup will have one member pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.writeDelegatorGroup, u"__sagen1__" ) self.assertEquals(pseudoGroup.uid, u"__sagen1__#calendar-proxy-write-for") self.assertEquals( [r.uid for r in (yield pseudoGroup.members())], [u"__wsanchez1__"] ) # The "proxy-read-for" pseudoGroup will have no members pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.readDelegatorGroup, u"__sagen1__" ) self.assertEquals(pseudoGroup.uid, u"__sagen1__#calendar-proxy-read-for") self.assertEquals( [r.uid for r in (yield pseudoGroup.members())], [] ) # Add another delegate yield Delegates.addDelegate(txn, delegator, delegate2, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__"]), set([d.uid for d in delegates]) ) delegators = (yield Delegates.delegatedTo(txn, delegate2, True)) self.assertEquals([u"__wsanchez1__"], [d.uid for d in delegators]) # Remove 1 delegate yield Delegates.removeDelegate(txn, delegator, delegate1, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals([u"__cdaboo1__"], [d.uid for d in delegates]) delegators = (yield Delegates.delegatedTo(txn, delegate1, True)) self.assertEquals(0, len(delegators)) # Remove the other delegate yield Delegates.removeDelegate(txn, delegator, delegate2, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals(0, len(delegates)) delegators = (yield Delegates.delegatedTo(txn, delegate2, True)) self.assertEquals(0, len(delegators)) yield txn.commit() # So delegateService will see the changes # Now set delegate assignments by using pseudoGroup.setMembers() pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.writeDelegateGroup, u"__wsanchez1__" ) yield pseudoGroup.setMembers([delegate1, delegate2]) # Verify the assignments were made txn = self.store.newTransaction(label="test_directDelegation") delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__"]), set([d.uid for d in delegates]) ) yield txn.commit() # Set a different group of assignments: yield pseudoGroup.setMembers([delegate2]) # Verify the assignments were made txn = self.store.newTransaction(label="test_directDelegation") delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals( set([u"__cdaboo1__"]), set([d.uid for d in delegates]) ) yield txn.commit()
def test_directoryBasedDelegationChanges(self): groupCacher = GroupCacher(self.directory) delegator = yield self.directory.recordWithUID(u"__wsanchez1__") groupRecord1 = yield self.directory.recordWithUID(u"__top_group_1__") group1 = yield self.transactionUnderTest().groupByUID("__top_group_1__") groupRecord2 = yield self.directory.recordWithUID(u"__sub_group_1__") group2 = yield self.transactionUnderTest().groupByUID("__sub_group_1__") groupRecord3 = yield self.directory.recordWithUID(u"left_coast") group3 = yield self.transactionUnderTest().groupByUID("left_coast") delegate = yield self.directory.recordWithUID(u"__sagen1__") # No delegates delegates = yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False) self.assertEquals(len(delegates), 0) # No delegators to this group delegators = yield self.transactionUnderTest().delegatorsToGroup(group1.groupID, False) self.assertEquals(len(delegators), 0) # User is not a delegate delegators = yield Delegates.delegatedTo(self.transactionUnderTest(), delegate, True) self.assertEquals(len(delegators), 0) # Apply an external read-only assignment yield groupCacher.applyExternalAssignments( self.transactionUnderTest(), delegator.uid, groupRecord1.uid, None ) # Now there is a read-only delegate delegates = yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False) self.assertEquals(len(delegates), 1) # Now this group is read-only delegated to delegators = yield self.transactionUnderTest().delegatorsToGroup(group1.groupID, False) self.assertEquals(len(delegators), 1) # Apply an external read-write assignment yield groupCacher.applyExternalAssignments( self.transactionUnderTest(), delegator.uid, groupRecord1.uid, groupRecord2.uid ) # Now there are read-only and read-write delegates delegates = yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False) self.assertEquals(len(delegates), 1) self.assertEquals(delegates[0].uid, "__top_group_1__") delegates = yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, True) self.assertEquals(len(delegates), 1) self.assertEquals(delegates[0].uid, "__sub_group_1__") # Now both groups are delegated to delegators = yield self.transactionUnderTest().delegatorsToGroup(group1.groupID, False) self.assertEquals(len(delegators), 1) delegators = yield self.transactionUnderTest().delegatorsToGroup(group2.groupID, True) self.assertEquals(len(delegators), 1) # User is now a delegate (cache must have been invalidated properly) delegators = yield Delegates.delegatedTo(self.transactionUnderTest(), delegate, True) self.assertEquals(len(delegators), 1) # Change read-write assignment yield groupCacher.applyExternalAssignments( self.transactionUnderTest(), delegator.uid, groupRecord1.uid, groupRecord3.uid ) # Now this group is not delegated to delegators = yield self.transactionUnderTest().delegatorsToGroup(group2.groupID, True) self.assertEquals(len(delegators), 0) # ..but this group is delegated to delegators = yield self.transactionUnderTest().delegatorsToGroup(group3.groupID, True) self.assertEquals(len(delegators), 1) # Remove external read-write assignment yield groupCacher.applyExternalAssignments( self.transactionUnderTest(), delegator.uid, groupRecord1.uid, None ) # Now there is only a read-only delegate delegates = yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False) self.assertEquals(len(delegates), 1) self.assertEquals(delegates[0].uid, "__top_group_1__") delegates = yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, True) self.assertEquals(len(delegates), 0) # Now this group is read-only delegated to delegators = yield self.transactionUnderTest().delegatorsToGroup(group1.groupID, False) self.assertEquals(len(delegators), 1) # Now this group is not delegated to delegators = yield self.transactionUnderTest().delegatorsToGroup(group3.groupID, True) self.assertEquals(len(delegators), 0) # User is not a delegate anymore (cache must have been invalidated properly) delegators = yield Delegates.delegatedTo(self.transactionUnderTest(), delegate, True) self.assertEquals(len(delegators), 0) # Remove external assignments altogether yield groupCacher.applyExternalAssignments( self.transactionUnderTest(), delegator.uid, None, None ) # Now there are no delegates delegates = yield Delegates.delegatesOf(self.transactionUnderTest(), delegator, False) self.assertEquals(len(delegates), 0) # No groups are delegated to delegators = yield self.transactionUnderTest().delegatorsToGroup(group1.groupID, False) self.assertEquals(len(delegators), 0) delegators = yield self.transactionUnderTest().delegatorsToGroup(group2.groupID, True) self.assertEquals(len(delegators), 0) delegators = yield self.transactionUnderTest().delegatorsToGroup(group3.groupID, True) self.assertEquals(len(delegators), 0)
def test_indirectDelegation(self): txn = self.store.newTransaction(label="test_indirectDelegation") delegator = yield self.directory.recordWithUID(u"__wsanchez1__") delegate1 = yield self.directory.recordWithUID(u"__sagen1__") group1 = yield self.directory.recordWithUID(u"__top_group_1__") group2 = yield self.directory.recordWithUID(u"__sub_group_1__") # Add group delegate yield Delegates.addDelegate(txn, delegator, group1, True) # Passing expanded=False will return the group delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=False)) self.assertEquals(1, len(delegates)) self.assertEquals(delegates[0].uid, u"__top_group_1__") # Passing expanded=True will return not the group -- it only returns # non-groups delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__", u"__glyph1__"]), set([d.uid for d in delegates]) ) delegators = (yield Delegates.delegatedTo(txn, delegate1, True)) self.assertEquals([u"__wsanchez1__"], [d.uid for d in delegators]) # Verify we can ask for all delegated-to groups yield Delegates.addDelegate(txn, delegator, group2, True) groups = (yield txn.allGroupDelegates()) self.assertEquals( set([u'__sub_group_1__', u'__top_group_1__']), set(groups) ) # Delegate to a user who is already indirectly delegated-to yield Delegates.addDelegate(txn, delegator, delegate1, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__", u"__glyph1__"]), set([d.uid for d in delegates]) ) # Add a member to the group; they become a delegate newSet = set() for name in (u"wsanchez1", u"cdaboo1", u"sagen1", u"glyph1", u"dre1"): record = ( yield self.directory.recordWithShortName(RecordType.user, name) ) newSet.add(record.uid) group = yield txn.groupByUID(group1.uid) _ignore_added, _ignore_removed = ( yield self.groupCacher.synchronizeMembers(txn, group.groupID, newSet) ) delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__", u"__glyph1__", u"__dre1__"]), set([d.uid for d in delegates]) ) # Remove delegate access from the top group yield Delegates.removeDelegate(txn, delegator, group1, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__"]), set([d.uid for d in delegates]) ) # Remove delegate access from the sub group yield Delegates.removeDelegate(txn, delegator, group2, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__"]), set([d.uid for d in delegates]) ) yield txn.commit()
def test_directDelegation(self): txn = self.store.newTransaction(label="test_directDelegation") delegator = yield self.directory.recordWithUID(u"__wsanchez1__") delegate1 = yield self.directory.recordWithUID(u"__sagen1__") delegate2 = yield self.directory.recordWithUID(u"__cdaboo1__") # Add 1 delegate yield Delegates.addDelegate(txn, delegator, delegate1, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals([u"__sagen1__"], [d.uid for d in delegates]) delegators = (yield Delegates.delegatedTo(txn, delegate1, True)) self.assertEquals([u"__wsanchez1__"], [d.uid for d in delegators]) yield txn.commit() # So delegateService will see the changes txn = self.store.newTransaction(label="test_directDelegation") # The "proxy-write" pseudoGroup will have one member pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.writeDelegateGroup, u"__wsanchez1__" ) self.assertEquals(pseudoGroup.uid, u"__wsanchez1__#calendar-proxy-write") self.assertEquals( [r.uid for r in (yield pseudoGroup.members())], [u"__sagen1__"] ) # The "proxy-read" pseudoGroup will have no members pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.readDelegateGroup, u"__wsanchez1__" ) self.assertEquals(pseudoGroup.uid, u"__wsanchez1__#calendar-proxy-read") self.assertEquals( [r.uid for r in (yield pseudoGroup.members())], [] ) # The "proxy-write-for" pseudoGroup will have one member pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.writeDelegatorGroup, u"__sagen1__" ) self.assertEquals(pseudoGroup.uid, u"__sagen1__#calendar-proxy-write-for") self.assertEquals( [r.uid for r in (yield pseudoGroup.members())], [u"__wsanchez1__"] ) # The "proxy-read-for" pseudoGroup will have no members pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.readDelegatorGroup, u"__sagen1__" ) self.assertEquals(pseudoGroup.uid, u"__sagen1__#calendar-proxy-read-for") self.assertEquals( [r.uid for r in (yield pseudoGroup.members())], [] ) # Add another delegate yield Delegates.addDelegate(txn, delegator, delegate2, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__"]), set([d.uid for d in delegates]) ) delegators = (yield Delegates.delegatedTo(txn, delegate2, True)) self.assertEquals([u"__wsanchez1__"], [d.uid for d in delegators]) # Remove 1 delegate yield Delegates.removeDelegate(txn, delegator, delegate1, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals([u"__cdaboo1__"], [d.uid for d in delegates]) delegators = (yield Delegates.delegatedTo(txn, delegate1, True)) self.assertEquals(0, len(delegators)) # Remove the other delegate yield Delegates.removeDelegate(txn, delegator, delegate2, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals(0, len(delegates)) delegators = (yield Delegates.delegatedTo(txn, delegate2, True)) self.assertEquals(0, len(delegators)) yield txn.commit() # So delegateService will see the changes # Now set delegate assignments by using pseudoGroup.setMembers() pseudoGroup = yield self.directory.recordWithShortName( DelegateRecordType.writeDelegateGroup, u"__wsanchez1__" ) yield pseudoGroup.setMembers([delegate1, delegate2]) # Verify the assignments were made txn = self.store.newTransaction(label="test_directDelegation") delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__"]), set([d.uid for d in delegates]) ) yield txn.commit() # Set a different group of assignments: yield pseudoGroup.setMembers([delegate2]) # Verify the assignments were made txn = self.store.newTransaction(label="test_directDelegation") delegates = (yield Delegates.delegatesOf(txn, delegator, True)) self.assertEquals( set([u"__cdaboo1__"]), set([d.uid for d in delegates]) ) yield txn.commit()
def test_indirectDelegation(self): txn = self.store.newTransaction(label="test_indirectDelegation") delegator = yield self.directory.recordWithUID(u"__wsanchez1__") delegate1 = yield self.directory.recordWithUID(u"__sagen1__") group1 = yield self.directory.recordWithUID(u"__top_group_1__") group2 = yield self.directory.recordWithUID(u"__sub_group_1__") # Add group delegate yield Delegates.addDelegate(txn, delegator, group1, True) # Passing expanded=False will return the group delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=False)) self.assertEquals(1, len(delegates)) self.assertEquals(delegates[0].uid, u"__top_group_1__") # Passing expanded=True will return not the group -- it only returns # non-groups delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__", u"__glyph1__"]), set([d.uid for d in delegates]) ) delegators = (yield Delegates.delegatedTo(txn, delegate1, True)) self.assertEquals([u"__wsanchez1__"], [d.uid for d in delegators]) # Verify we can ask for all delegated-to groups yield Delegates.addDelegate(txn, delegator, group2, True) groups = (yield txn.allGroupDelegates()) self.assertEquals( set([u'__sub_group_1__', u'__top_group_1__']), set(groups) ) # Delegate to a user who is already indirectly delegated-to yield Delegates.addDelegate(txn, delegator, delegate1, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__", u"__glyph1__"]), set([d.uid for d in delegates]) ) # Add a member to the group; they become a delegate newSet = set() for name in (u"wsanchez1", u"cdaboo1", u"sagen1", u"glyph1", u"dre1"): record = ( yield self.directory.recordWithShortName(RecordType.user, name) ) newSet.add(record.uid) group = yield txn.groupByUID(group1.uid) _ignore_added, _ignore_removed = ( yield self.groupCacher.synchronizeMembers(txn, group.groupID, newSet) ) delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__", u"__glyph1__", u"__dre1__"]), set([d.uid for d in delegates]) ) # Remove delegate access from the top group yield Delegates.removeDelegate(txn, delegator, group1, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__", u"__cdaboo1__"]), set([d.uid for d in delegates]) ) # Remove delegate access from the sub group yield Delegates.removeDelegate(txn, delegator, group2, True) delegates = (yield Delegates.delegatesOf(txn, delegator, True, expanded=True)) self.assertEquals( set([u"__sagen1__"]), set([d.uid for d in delegates]) ) yield txn.commit()