[CalendarServer-changes] [14070] CalDAVTester/trunk/src

source_changes at macosforge.org source_changes at macosforge.org
Fri Oct 10 13:30:54 PDT 2014


Revision: 14070
          http://trac.calendarserver.org//changeset/14070
Author:   cdaboo at apple.com
Date:     2014-10-10 13:30:54 -0700 (Fri, 10 Oct 2014)
Log Message:
-----------
Add a --debug option to help find async scheduling related problems.

Modified Paths:
--------------
    CalDAVTester/trunk/src/caldavtest.py
    CalDAVTester/trunk/src/manager.py
    CalDAVTester/trunk/src/serverinfo.py
    CalDAVTester/trunk/src/testsuite.py

Modified: CalDAVTester/trunk/src/caldavtest.py
===================================================================
--- CalDAVTester/trunk/src/caldavtest.py	2014-10-10 14:44:50 UTC (rev 14069)
+++ CalDAVTester/trunk/src/caldavtest.py	2014-10-10 20:30:54 UTC (rev 14070)
@@ -82,6 +82,7 @@
         self.suites = []
         self.grabbedlocation = None
         self.previously_found = set()
+        self.uidmaps = {}
 
 
     def missingFeatures(self):
@@ -101,7 +102,9 @@
             return 0, 0, 1
 
         # Always need a new set of UIDs for the entire test
-        self.manager.server_info.newUIDs()
+        uids = self.manager.server_info.newUIDs()
+        for uid, uidname in uids:
+            self.uidmaps[uid] = "{} - {}".format(uidname, self.name)
 
         self.only = any([suite.only for suite in self.suites])
         try:
@@ -157,7 +160,9 @@
             etags = {}
             only_tests = any([test.only for test in suite.tests])
             testsuite = self.manager.testSuite(testfile, result_name, "")
-            suite.aboutToRun()
+            uids = suite.aboutToRun()
+            for uid, uidname in uids:
+                self.uidmaps[uid] = "{} - {}".format(uidname, label)
             for test in suite.tests:
                 result = self.run_test(testsuite, test, etags, only_tests, label="%s | %s" % (label, test.name))
                 if result == "t":
@@ -244,6 +249,22 @@
         return result
 
 
+    def doget(self, resource, label=""):
+        req = request(self.manager)
+        req.method = "GET"
+        req.ruris.append(resource[0])
+        req.ruri = resource[0]
+        if len(resource[1]):
+            req.user = resource[1]
+        if len(resource[2]):
+            req.pswd = resource[2]
+        _ignore_result, _ignore_resulttxt, response, respdata = self.dorequest(req, False, False, label=label)
+        if response.status / 100 != 2:
+            return False, None
+
+        return True, respdata
+
+
     def dofindall(self, collection, label=""):
         hrefs = []
         req = request(self.manager)
@@ -398,6 +419,7 @@
 
     def dowaitcount(self, collection, count, label=""):
 
+        hrefs = []
         for _ignore in range(self.manager.server_info.waitcount):
             req = request(self.manager)
             req.method = "PROPFIND"
@@ -418,21 +440,39 @@
 """
             req.data.content_type = "text/xml"
             result, _ignore_resulttxt, response, respdata = self.dorequest(req, False, False, label="%s | %s %d" % (label, "WAITCOUNT", count))
-            ctr = 0
+            hrefs = []
             if result and (response is not None) and (response.status == 207) and (respdata is not None):
                 tree = ElementTree(file=StringIO(respdata))
 
                 for response in tree.findall("{DAV:}response"):
-                    ctr += 1
+                    href = response.findall("{DAV:}href")[0]
+                    if href.text.rstrip("/") != collection[0].rstrip("/"):
+                        hrefs.append(href.text)
 
-                if ctr - 1 == count:
-                    return None
+                if len(hrefs) == count:
+                    return True, None
             delay = self.manager.server_info.waitdelay
             starttime = time.time()
             while (time.time() < starttime + delay):
                 pass
+
+        if self.manager.debug:
+            # Get the content of each resource
+            rdata = ""
+            for href in hrefs:
+                result, respdata = self.doget((href, collection[1], collection[2],), label)
+                if respdata.startswith("BEGIN:VCALENDAR"):
+                    uid = respdata.find("UID:")
+                    if uid != -1:
+                        uid = respdata[uid + 4:uid + respdata[uid:].find("\r\n")]
+                        test = self.uidmaps.get(uid, "unknown")
+                    else:
+                        test = "unknown"
+                rdata += "\n\nhref: {}\ntest: {}\n\n{}\n".format(href, test, respdata)
+
+            return False, rdata
         else:
-            return ctr - 1
+            return False, len(hrefs)
 
 
     def dowaitchanged(self, uri, etag, user, pswd, label=""):
@@ -547,9 +587,9 @@
             count = int(req.method[10:])
             for ruri in req.ruris:
                 collection = (ruri, req.user, req.pswd)
-                waitcount = self.dowaitcount(collection, count, label=label)
-                if waitcount is not None:
-                    return False, "Count did not change: {}".format(waitcount), None, None
+                waitresult, waitdetails = self.dowaitcount(collection, count, label=label)
+                if not waitresult:
+                    return False, "Count did not change: {}".format(waitdetails), None, None
             else:
                 return True, "", None, None
 
@@ -558,12 +598,12 @@
             count = int(req.method[len("WAITDELETEALL"):])
             for ruri in req.ruris:
                 collection = (ruri, req.user, req.pswd)
-                waitcount = self.dowaitcount(collection, count, label=label)
-                if waitcount is None:
+                waitresult, waitdetails = self.dowaitcount(collection, count, label=label)
+                if waitresult:
                     hrefs = self.dofindall(collection, label="%s | %s" % (label, "DELETEALL"))
                     self.dodeleteall(hrefs, label="%s | %s" % (label, "DELETEALL"))
                 else:
-                    return False, "Count did not change: {}".format(waitcount), None, None
+                    return False, "Count did not change: {}".format(waitdetails), None, None
             else:
                 return True, "", None, None
 

Modified: CalDAVTester/trunk/src/manager.py
===================================================================
--- CalDAVTester/trunk/src/manager.py	2014-10-10 14:44:50 UTC (rev 14069)
+++ CalDAVTester/trunk/src/manager.py	2014-10-10 20:30:54 UTC (rev 14070)
@@ -62,6 +62,7 @@
         self.print_request = False
         self.print_response = False
         self.print_request_response_on_error = False
+        self.debug = False
 
         self.results = []
         self.totals = {
@@ -238,6 +239,7 @@
                 "print-details-onfail",
                 "always-print-request",
                 "always-print-response",
+                "debug"
             ],
         )
 
@@ -281,6 +283,8 @@
                 random_order = True
             elif option == "--random-seed":
                 random_seed = value
+            elif option == "--debug":
+                self.debug = True
 
         if all:
             files = []

Modified: CalDAVTester/trunk/src/serverinfo.py
===================================================================
--- CalDAVTester/trunk/src/serverinfo.py	2014-10-10 14:44:50 UTC (rev 14069)
+++ CalDAVTester/trunk/src/serverinfo.py	2014-10-10 20:30:54 UTC (rev 14070)
@@ -152,6 +152,7 @@
         uidsubs = dict([("$uid{}:".format(i), str(uuid4())) for i in range(1, 21)])
         self.subsdict.update(uidsubs)
         self.extrasubsdict.update(uidsubs)
+        return set([(v, k) for k, v in uidsubs.items()])
 
 
     def parseXML(self, node):

Modified: CalDAVTester/trunk/src/testsuite.py
===================================================================
--- CalDAVTester/trunk/src/testsuite.py	2014-10-10 14:44:50 UTC (rev 14069)
+++ CalDAVTester/trunk/src/testsuite.py	2014-10-10 20:30:54 UTC (rev 14070)
@@ -45,8 +45,7 @@
         a test file we also need test suites to have unique UIDs. The "change-uid" attribute
         can be used to reset the active UIDs for a test suite.
         """
-        if self.changeuid:
-            self.manager.server_info.newUIDs()
+        return self.manager.server_info.newUIDs() if self.changeuid else set()
 
 
     def missingFeatures(self):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20141010/6fe4c6b7/attachment.html>


More information about the calendarserver-changes mailing list