Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 1729

Show
Ignore:
Timestamp:
09/27/07 15:38:41
Author:
fumanchu
Message:

Porting some of [1711] to trunk.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cherrypy/test/test.py

    r1727 r1729  
    354354     
    355355    testList = [ 
    356         # Run refleak test ASAP to make debugging easier. 
    357         'test_refleaks', 
    358          
    359356        'test_proxy', 
    360357        'test_caching', 
     
    378375        'test_wsgiapps', 
    379376        'test_wsgi_ns', 
     377         
     378        # Run refleak test as late as possible to 
     379        # catch refleaks from all exercised tests. 
     380        'test_refleaks', 
    380381    ] 
    381382     
  • trunk/cherrypy/test/test_refleaks.py

    r1727 r1729  
    2424         
    2525        def gc_stats(self): 
    26             return "%s %s %s %s" % (gc.collect(), 
    27                                     len(get_instances(_cprequest.Request)), 
    28                                     len(get_instances(_cprequest.Response)), 
    29                                     len(gc.get_referrers(data))) 
     26            output = [] 
     27             
     28            # Uncollectable garbage 
     29             
     30            # gc_collect isn't perfectly synchronous, because it may 
     31            # break reference cycles that then take time to fully 
     32            # finalize. Call it twice and hope for the best. 
     33            gc.collect() 
     34            unreachable = gc.collect() 
     35            if unreachable: 
     36                output.append("\n%s unreachable objects:" % unreachable) 
     37                trash = {} 
     38                for x in gc.garbage: 
     39                    trash[type(x)] = trash.get(type(x), 0) + 1 
     40                trash = [(v, k) for k, v in trash.iteritems()] 
     41                trash.sort() 
     42                for pair in trash: 
     43                    output.append("    " + repr(pair)) 
     44             
     45            # Request references 
     46            reqs = get_instances(_cprequest.Request) 
     47            lenreqs = len(reqs) 
     48            if lenreqs < 2: 
     49                output.append("\nMissing Request reference. Should be 1 in " 
     50                              "this request thread and 1 in the main thread.") 
     51            elif lenreqs > 2: 
     52                output.append("\nToo many Request references (%r)." % lenreqs) 
     53                for req in reqs: 
     54                    output.append("Referrers for %s:" % repr(req)) 
     55                    for ref in gc.get_referrers(req): 
     56                        if ref is not reqs: 
     57                            output.append("    %s" % repr(ref)) 
     58             
     59            # Response references 
     60            resps = get_instances(_cprequest.Response) 
     61            lenresps = len(resps) 
     62            if lenresps < 2: 
     63                output.append("\nMissing Response reference. Should be 1 in " 
     64                              "this request thread and 1 in the main thread.") 
     65            elif lenresps > 2: 
     66                output.append("\nToo many Response references (%r)." % lenresps) 
     67                for resp in resps: 
     68                    output.append("Referrers for %s:" % repr(resp)) 
     69                    for ref in gc.get_referrers(resp): 
     70                        if ref is not resps: 
     71                            output.append("    %s" % repr(ref)) 
     72             
     73            return "\n".join(output) 
    3074        gc_stats.exposed = True 
    31          
    32         def gc_objtypes(self): 
    33             data = {} 
    34             for x in gc.get_objects(): 
    35                 data[type(x)] = data.get(type(x), 0) + 1 
    36              
    37             data = [(v, k) for k, v in data.iteritems()] 
    38             data.sort() 
    39             return "\n".join([repr(pair) for pair in data]) 
    40         gc_objtypes.exposed = True 
    4175     
    4276    cherrypy.tree.mount(Root()) 
     
    6498         
    6599        self.getPage("/gc_stats") 
    66         self.assertBody("0 1 1 1") 
    67          
    68         # If gc_stats fails, choose "ignore" to see the type counts for 
    69         # all the unreachable objects in this body. 
    70         self.getPage("/gc_objtypes") 
    71100        self.assertBody("") 
    72101 

Hosted by WebFaction

Log in as guest/cpguest to create tickets