OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """This is a python sync server used for testing Chrome Sync. | 6 """This is a python sync server used for testing Chrome Sync. |
7 | 7 |
8 By default, it listens on an ephemeral port and xmpp_port and sends the port | 8 By default, it listens on an ephemeral port and xmpp_port and sends the port |
9 numbers back to the originating process over a pipe. The originating process can | 9 numbers back to the originating process over a pipe. The originating process can |
10 specify an explicit port and xmpp_port if necessary. | 10 specify an explicit port and xmpp_port if necessary. |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 self.ChromiumSyncEnableNotificationsOpHandler, | 144 self.ChromiumSyncEnableNotificationsOpHandler, |
145 self.ChromiumSyncSendNotificationOpHandler, | 145 self.ChromiumSyncSendNotificationOpHandler, |
146 self.ChromiumSyncBirthdayErrorOpHandler, | 146 self.ChromiumSyncBirthdayErrorOpHandler, |
147 self.ChromiumSyncTransientErrorOpHandler, | 147 self.ChromiumSyncTransientErrorOpHandler, |
148 self.ChromiumSyncErrorOpHandler, | 148 self.ChromiumSyncErrorOpHandler, |
149 self.ChromiumSyncSyncTabFaviconsOpHandler, | 149 self.ChromiumSyncSyncTabFaviconsOpHandler, |
150 self.ChromiumSyncCreateSyncedBookmarksOpHandler, | 150 self.ChromiumSyncCreateSyncedBookmarksOpHandler, |
151 self.ChromiumSyncEnableKeystoreEncryptionOpHandler, | 151 self.ChromiumSyncEnableKeystoreEncryptionOpHandler, |
152 self.ChromiumSyncRotateKeystoreKeysOpHandler, | 152 self.ChromiumSyncRotateKeystoreKeysOpHandler, |
153 self.ChromiumSyncEnableManagedUserAcknowledgementHandler, | 153 self.ChromiumSyncEnableManagedUserAcknowledgementHandler, |
154 self.ChromiumSyncEnablePreCommitGetUpdateAvoidanceHandler] | 154 self.ChromiumSyncEnablePreCommitGetUpdateAvoidanceHandler, |
| 155 self.GaiaOAuth2TokenHandler, |
| 156 self.GaiaSetOAuth2TokenResponseHandler] |
155 | 157 |
156 post_handlers = [self.ChromiumSyncCommandHandler, | 158 post_handlers = [self.ChromiumSyncCommandHandler, |
157 self.ChromiumSyncTimeHandler] | 159 self.ChromiumSyncTimeHandler, |
| 160 self.GaiaOAuth2TokenHandler, |
| 161 self.GaiaSetOAuth2TokenResponseHandler] |
158 testserver_base.BasePageHandler.__init__(self, request, client_address, | 162 testserver_base.BasePageHandler.__init__(self, request, client_address, |
159 sync_http_server, [], get_handlers, | 163 sync_http_server, [], get_handlers, |
160 [], post_handlers, []) | 164 [], post_handlers, []) |
161 | 165 |
162 | 166 |
163 def ChromiumSyncTimeHandler(self): | 167 def ChromiumSyncTimeHandler(self): |
164 """Handle Chromium sync .../time requests. | 168 """Handle Chromium sync .../time requests. |
165 | 169 |
166 The syncer sometimes checks server reachability by examining /time. | 170 The syncer sometimes checks server reachability by examining /time. |
167 """ | 171 """ |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 return False | 438 return False |
435 result, raw_reply = ( | 439 result, raw_reply = ( |
436 self.server._sync_handler.HandleEnablePreCommitGetUpdateAvoidance()) | 440 self.server._sync_handler.HandleEnablePreCommitGetUpdateAvoidance()) |
437 self.send_response(result) | 441 self.send_response(result) |
438 self.send_header('Content-Type', 'text/html') | 442 self.send_header('Content-Type', 'text/html') |
439 self.send_header('Content-Length', len(raw_reply)) | 443 self.send_header('Content-Length', len(raw_reply)) |
440 self.end_headers() | 444 self.end_headers() |
441 self.wfile.write(raw_reply) | 445 self.wfile.write(raw_reply) |
442 return True | 446 return True |
443 | 447 |
| 448 def GaiaOAuth2TokenHandler(self): |
| 449 test_name = "/o/oauth2/token" |
| 450 if not self._ShouldHandleRequest(test_name): |
| 451 return False |
| 452 if self.headers.getheader('content-length'): |
| 453 length = int(self.headers.getheader('content-length')) |
| 454 _raw_request = self.rfile.read(length) |
| 455 result, raw_reply = ( |
| 456 self.server._sync_handler.HandleGetOauth2Token()) |
| 457 self.send_response(result) |
| 458 self.send_header('Content-Type', 'application/json') |
| 459 self.send_header('Content-Length', len(raw_reply)) |
| 460 self.end_headers() |
| 461 self.wfile.write(raw_reply) |
| 462 return True |
| 463 |
| 464 def GaiaSetOAuth2TokenResponseHandler(self): |
| 465 test_name = "/setfakeoauth2token" |
| 466 if not self._ShouldHandleRequest(test_name): |
| 467 return False |
| 468 |
| 469 # The index of 'query' is 4. |
| 470 # See http://docs.python.org/2/library/urlparse.html |
| 471 query = urlparse.urlparse(self.path)[4] |
| 472 query_params = urlparse.parse_qs(query) |
| 473 |
| 474 response_code = 0 |
| 475 request_token = '' |
| 476 access_token = '' |
| 477 expires_in = 0 |
| 478 token_type = '' |
| 479 |
| 480 if 'response_code' in query_params: |
| 481 response_code = query_params['response_code'][0] |
| 482 if 'request_token' in query_params: |
| 483 request_token = query_params['request_token'][0] |
| 484 if 'access_token' in query_params: |
| 485 access_token = query_params['access_token'][0] |
| 486 if 'expires_in' in query_params: |
| 487 expires_in = query_params['expires_in'][0] |
| 488 if 'token_type' in query_params: |
| 489 token_type = query_params['token_type'][0] |
| 490 |
| 491 result, raw_reply = ( |
| 492 self.server._sync_handler.HandleSetOauth2Token( |
| 493 response_code, request_token, access_token, expires_in, token_type)) |
| 494 self.send_response(result) |
| 495 self.send_header('Content-Type', 'text/html') |
| 496 self.send_header('Content-Length', len(raw_reply)) |
| 497 self.end_headers() |
| 498 self.wfile.write(raw_reply) |
| 499 return True |
| 500 |
| 501 |
444 class SyncServerRunner(testserver_base.TestServerRunner): | 502 class SyncServerRunner(testserver_base.TestServerRunner): |
445 """TestServerRunner for the net test servers.""" | 503 """TestServerRunner for the net test servers.""" |
446 | 504 |
447 def __init__(self): | 505 def __init__(self): |
448 super(SyncServerRunner, self).__init__() | 506 super(SyncServerRunner, self).__init__() |
449 | 507 |
450 def create_server(self, server_data): | 508 def create_server(self, server_data): |
451 port = self.options.port | 509 port = self.options.port |
452 host = self.options.host | 510 host = self.options.host |
453 xmpp_port = self.options.xmpp_port | 511 xmpp_port = self.options.xmpp_port |
454 server = SyncHTTPServer((host, port), xmpp_port, SyncPageHandler) | 512 server = SyncHTTPServer((host, port), xmpp_port, SyncPageHandler) |
455 print 'Sync HTTP server started on port %d...' % server.server_port | 513 print ('Sync HTTP server started at %s:%d/chromiumsync...' % |
456 print 'Sync XMPP server started on port %d...' % server.xmpp_port | 514 (host, server.server_port)) |
| 515 print ('Fake OAuth2 Token server started at %s:%d/o/oauth2/token...' % |
| 516 (host, server.server_port)) |
| 517 print ('Sync XMPP server started at %s:%d...' % |
| 518 (host, server.xmpp_port)) |
457 server_data['port'] = server.server_port | 519 server_data['port'] = server.server_port |
458 server_data['xmpp_port'] = server.xmpp_port | 520 server_data['xmpp_port'] = server.xmpp_port |
459 return server | 521 return server |
460 | 522 |
461 def run_server(self): | 523 def run_server(self): |
462 testserver_base.TestServerRunner.run_server(self) | 524 testserver_base.TestServerRunner.run_server(self) |
463 | 525 |
464 def add_options(self): | 526 def add_options(self): |
465 testserver_base.TestServerRunner.add_options(self) | 527 testserver_base.TestServerRunner.add_options(self) |
466 self.option_parser.add_option('--xmpp-port', default='0', type='int', | 528 self.option_parser.add_option('--xmpp-port', default='0', type='int', |
467 help='Port used by the XMPP server. If ' | 529 help='Port used by the XMPP server. If ' |
468 'unspecified, the XMPP server will listen on ' | 530 'unspecified, the XMPP server will listen on ' |
469 'an ephemeral port.') | 531 'an ephemeral port.') |
470 # Override the default logfile name used in testserver.py. | 532 # Override the default logfile name used in testserver.py. |
471 self.option_parser.set_defaults(log_file='sync_testserver.log') | 533 self.option_parser.set_defaults(log_file='sync_testserver.log') |
472 | 534 |
473 if __name__ == '__main__': | 535 if __name__ == '__main__': |
474 sys.exit(SyncServerRunner().main()) | 536 sys.exit(SyncServerRunner().main()) |
OLD | NEW |