| 1 | 1 |  | import sys | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 | 1 |  | import time | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 | 1 |  | from ppp_libmodule.tests import PPPTestCase | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 | 1 |  | from ppp_libmodule.http import HttpRequestHandler | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 | 1 |  | from ppp_libmodule import shortcuts | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 | 1 |  | from ppp_datamodel.nodes import Triple as T | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 | 1 |  | from ppp_datamodel.nodes import Missing as M | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 | 1 |  | from ppp_datamodel.nodes import Missing as R | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 | 1 |  | from ppp_datamodel.nodes import List as L | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 | 1 |  | from ppp_datamodel.communication import Response, TraceItem | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 13 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 14 | 1 |  | def predicate(node): | 
            
                                                                        
                            
            
                                    
            
            
                | 15 | 1 |  |     if node == T(M(), M(), M()): | 
            
                                                                        
                            
            
                                    
            
            
                | 16 | 1 |  |         return R('foo') | 
            
                                                                        
                            
            
                                    
            
            
                | 17 | 1 |  |     elif node == R('foo'): | 
            
                                                                        
                            
            
                                    
            
            
                | 18 | 1 |  |         return R('bar') | 
            
                                                                        
                            
            
                                    
            
            
                | 19 | 1 |  |     elif node == M(): | 
            
                                                                        
                            
            
                                    
            
            
                | 20 |  |  |         return node | 
            
                                                                        
                            
            
                                    
            
            
                | 21 | 1 |  |     elif node == L([]): | 
            
                                                                        
                            
            
                                    
            
            
                | 22 | 1 |  |         return node | 
            
                                                                        
                            
            
                                    
            
            
                | 23 |  |  |     else: | 
            
                                                                        
                            
            
                                    
            
            
                | 24 |  |  |         assert False, node | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 | 1 |  | class RequestHandler: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 | 1 |  |     def __init__(self, request): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 | 1 |  |         self.request = request | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 | 1 |  |     def answer(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 | 1 |  |         tree = self.request.tree.traverse(predicate) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 | 1 |  |         if tree != self.request.tree: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  |             # If we have modified the tree, it is relevant to return it | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 | 1 |  |             return [shortcuts.build_answer(self.request, tree, {}, 'test')] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |         else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |             # Otherwise, we have nothing interesting to say. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |             return [] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 | 1 |  | def app(environ, start_response): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |     """Function called by the WSGI server.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 | 1 |  |     r = HttpRequestHandler(environ, start_response, RequestHandler).dispatch() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 | 1 |  |     return r | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 | 1 |  | class HttpTest(PPPTestCase(app)): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 | 1 |  |     def testWorking(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 | 1 |  |         t = T(M(), M(), M()) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 | 1 |  |         q = {'id': '1', 'language': 'en', 'tree': t.as_dict(), | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |               'measures': {}, 'trace': []} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 | 1 |  |         self.assertResponse(q, [Response('en', R('bar'), {}, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |             [TraceItem('test', R('bar'), {})])]) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 | 1 |  |     def _get_test_times_trace_item(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 | 1 |  |         t = T(M(), M(), M()) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 | 1 |  |         q = {'id': '1', 'language': 'en', 'tree': t.as_dict(), | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |               'measures': {}, 'trace': []} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 | 1 |  |         responses = self.request(q) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 | 1 |  |         self.assertEqual(len(responses), 1, responses) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 | 1 |  |         response = responses[0] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 | 1 |  |         self.assertEqual(len(response.trace), 1, response.trace) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 | 1 |  |         return response.trace[0] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 | 1 |  |     if sys.version_info >= (3, 3): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 | 1 |  |         def testTimes(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 | 1 |  |             trace_item = self._get_test_times_trace_item() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 | 1 |  |             self.assertEqual(set(trace_item.times), {'start', 'end', 'cpu'}) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 | 1 |  |             self.assertGreater(trace_item.times['cpu'], 0.) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 |  |  |             # The following may fail on a very slow system. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 | 1 |  |             self.assertLess(trace_item.times['cpu'], 1.) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 | 1 |  |             self.assertAlmostEqual(trace_item.times['start'], time.time(), delta=1.) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 | 1 |  |             self.assertAlmostEqual(trace_item.times['end'], time.time(), delta=1.) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 |  |  |     else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |         def testTimes(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 |  |  |             trace_item = self._get_test_times_trace_item() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 |  |  |             self.assertEqual(set(trace_item.times), {'start', 'end'}) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 |  |  |             # The following may fail on a very slow system. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 |  |  |             self.assertAlmostEqual(trace_item.times['start'], time.time(), delta=1.) | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 81 |  |  |             self.assertAlmostEqual(trace_item.times['end'], time.time(), delta=1.) | 
            
                                                        
            
                                    
            
            
                | 82 |  |  |  |