Revision: 1458 http://trac.macosforge.org/projects/calendarserver/changeset/1458 Author: dreid@apple.com Date: 2007-04-06 19:11:55 -0700 (Fri, 06 Apr 2007) Log Message: ----------- Fix tests broken by adding support for multiple vhosts in multiple records in multiple nodes. And add tests for prefering vhosts based on node location. Modified Paths: -------------- CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryschema.py Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryschema.py =================================================================== --- CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryschema.py 2007-04-07 00:41:52 UTC (rev 1457) +++ CalendarServer/trunk/twistedcaldav/directory/test/test_opendirectoryschema.py 2007-04-07 02:11:55 UTC (rev 1458) @@ -30,7 +30,7 @@ """ Test Open Directory service schema. """ - + plist_nomacosxserver_key = """<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> @@ -186,7 +186,7 @@ </dict> </dict> </dict> - + <key>C18C34AC-3D9E-403C-8A33-BFC303F3840E</key> <dict> <key>hostname</key> @@ -301,7 +301,7 @@ </dict> </dict> </dict> - + <key>C18C34AC-3D9E-403C-8A33-BFC303F3840E</key> <dict> <key>hostname</key> @@ -425,7 +425,7 @@ </dict> </dict> </dict> - + <key>C18C34AC-3D9E-403C-8A33-BFC303F3840E</key> <dict> <key>hostDetails</key> @@ -544,7 +544,7 @@ </dict> </dict> </dict> - + <key>C18C34AC-3D9E-403C-8A33-BFC303F3840E</key> <dict> <key>hostname</key> @@ -647,7 +647,7 @@ </dict> </dict> </dict> - + <key>C18C34AC-3D9E-403C-8A33-BFC303F3840E</key> <dict> <key>hostname</key> @@ -769,7 +769,7 @@ </dict> </dict> </dict> - + <key>C18C34AC-3D9E-403C-8A33-BFC303F3840E</key> <dict> <key>hostname</key> @@ -828,7 +828,7 @@ service = OpenDirectoryService(node="/Search", dosetup=False) if service._parseXMLPlist("calendar.apple.com", "recordit", plist, "GUIDIFY"): self.fail(msg="Plist parse should have failed: %s" % (title,)) - + plists = ( (PlistParse.plist_nomacosxserver_key, "nomacosxserver_key"), (PlistParse.plist_nocalendarservice, "nocalendarservice"), @@ -855,10 +855,10 @@ self.fail(msg="Plist parse should not have failed: %s" % (recordName,)) else: expanded = service._getCalendarUserAddresses(DirectoryService.recordType_users, recordName, record) - + # Verify that we extracted the proper items self.assertEqual(expanded, result, msg=title % (expanded, result,)) - + data = ( ( "user01", @@ -892,27 +892,36 @@ "User with no email addresses, %s != %s", ), ) - + for recordName, record, result, title in data: _doTest(recordName, record, result, title) class ODRecordsParse (twisted.trial.unittest.TestCase): record_good = ("computer1.apple.com", { - dsattributes.kDS1AttrGeneratedUID : "GUID1", - dsattributes.kDSNAttrRecordName : "computer1.apple.com", - dsattributes.kDS1AttrXMLPlist : PlistParse.plist_good, - }) + dsattributes.kDS1AttrGeneratedUID : "GUID1", + dsattributes.kDSNAttrRecordName : "computer1.apple.com", + dsattributes.kDS1AttrXMLPlist : PlistParse.plist_good, + dsattributes.kDSNAttrMetaNodeLocation : "/LDAPv3/127.0.0.1", + }) record_good_other = ("computer2.apple.com", { - dsattributes.kDS1AttrGeneratedUID : "GUID1", - dsattributes.kDSNAttrRecordName : "computer2.apple.com", - dsattributes.kDS1AttrXMLPlist : PlistParse.plist_good_other, + dsattributes.kDS1AttrGeneratedUID : "GUID1", + dsattributes.kDSNAttrRecordName : "computer2.apple.com", + dsattributes.kDS1AttrXMLPlist : PlistParse.plist_good_other, + dsattributes.kDSNAttrMetaNodeLocation : "/LDAPv3/127.0.0.1", }) - record_good_duplicate = ("computer2.apple.com", { - dsattributes.kDS1AttrGeneratedUID : "GUID1", - dsattributes.kDSNAttrRecordName : "computer2.apple.com", - dsattributes.kDS1AttrXMLPlist : PlistParse.plist_good, + record_good_duplicate = ("computer3.apple.com", { + dsattributes.kDS1AttrGeneratedUID : "GUID2", + dsattributes.kDSNAttrRecordName : "computer2.apple.com", + dsattributes.kDS1AttrXMLPlist : PlistParse.plist_good, + dsattributes.kDSNAttrMetaNodeLocation : "/LDAPv3/directory.apple.com", }) + record_good_local_duplicate = ("ServiceInformation", { + dsattributes.kDS1AttrGeneratedUID : "GUID3", + dsattributes.kDSNAttrRecordName : "computer2.apple.com", + dsattributes.kDS1AttrXMLPlist : PlistParse.plist_good, + dsattributes.kDSNAttrMetaNodeLocation : "/Local/Default", + }) def test_odrecords_error(self): def _doParseRecords(recordlist, title): @@ -922,14 +931,10 @@ self.fail(msg="Record parse should have failed: %s" % (title,)) except OpenDirectoryInitError: pass - + records = ( ({}, "no records found"), ({ - ODRecordsParse.record_good[0] : ODRecordsParse.record_good[1], - ODRecordsParse.record_good_duplicate[0] : ODRecordsParse.record_good_duplicate[1], - }, "duplicate records found"), - ({ ODRecordsParse.record_good_other[0] : ODRecordsParse.record_good_other[1], }, "non-matching record found"), ) @@ -944,7 +949,7 @@ service._parseComputersRecords(recordlist, "calendar.apple.com") except OpenDirectoryInitError, ex: self.fail(msg="Record parse should not have failed: \"%s\" with error: %s" % (title, ex)) - + records = ( ({ ODRecordsParse.record_good[0] : ODRecordsParse.record_good[1], @@ -958,3 +963,29 @@ for recordlist, title in records: _doParseRecords(recordlist, title) + def test_odrecords_multiple(self): + def _doParseRecords(recordlist, title, guid): + service = OpenDirectoryService(node="/Search", dosetup=False) + service._parseComputersRecords(recordlist, "calendar.apple.com") + gotGuid = service.servicetag.split(':', 1)[0] + + self.assertEquals(guid, gotGuid, + "Got wrong guid, %s: Expected %s not %s" % (title, guid, gotGuid)) + + records = ( + ({ODRecordsParse.record_good_other[0] : ODRecordsParse.record_good_other[1], + ODRecordsParse.record_good_duplicate[0] : ODRecordsParse.record_good_duplicate[1], + ODRecordsParse.record_good_local_duplicate[0] : + ODRecordsParse.record_good_local_duplicate[1]}, + "Remote Record Preferred", "GUID2"), + ({ODRecordsParse.record_good[0] : ODRecordsParse.record_good[1], + ODRecordsParse.record_good_local_duplicate[0] : + ODRecordsParse.record_good_local_duplicate[1]}, + "Local OD Preferred", "GUID1"), + ({ODRecordsParse.record_good_local_duplicate[0] : + ODRecordsParse.record_good_local_duplicate[1]}, + "Local Node Preferred", "GUID3"), + ) + + for recordlist, title, guid in records: + _doParseRecords(recordlist, title, guid)