Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: net/tools/testserver/chromiumsync.py

Issue 7481009: Test birtday error. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Upload before commit. Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/test/live_sync/sync_errors_test.cc ('k') | net/tools/testserver/testserver.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python2.4 1 #!/usr/bin/python2.4
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 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 """An implementation of the server side of the Chromium sync protocol. 6 """An implementation of the server side of the Chromium sync protocol.
7 7
8 The details of the protocol are described mostly by comments in the protocol 8 The details of the protocol are described mostly by comments in the protocol
9 buffer definition at chrome/browser/sync/protocol/sync.proto. 9 buffer definition at chrome/browser/sync/protocol/sync.proto.
10 """ 10 """
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 400
401 def __init__(self): 401 def __init__(self):
402 # Monotonically increasing version number. The next object change will 402 # Monotonically increasing version number. The next object change will
403 # take on this value + 1. 403 # take on this value + 1.
404 self._version = 0 404 self._version = 0
405 405
406 # The definitive copy of this client's items: a map from ID string to a 406 # The definitive copy of this client's items: a map from ID string to a
407 # SyncEntity protocol buffer. 407 # SyncEntity protocol buffer.
408 self._entries = {} 408 self._entries = {}
409 409
410 # TODO(nick): uuid.uuid1() is better, but python 2.5 only. 410 self.ResetStoreBirthday()
411 self.store_birthday = '%0.30f' % random.random()
412 411
413 self.migration_history = MigrationHistory() 412 self.migration_history = MigrationHistory()
414 413
415 def _SaveEntry(self, entry): 414 def _SaveEntry(self, entry):
416 """Insert or update an entry in the change log, and give it a new version. 415 """Insert or update an entry in the change log, and give it a new version.
417 416
418 The ID fields of this entry are assumed to be valid server IDs. This 417 The ID fields of this entry are assumed to be valid server IDs. This
419 entry will be updated with a new version number and sync_timestamp. 418 entry will be updated with a new version number and sync_timestamp.
420 419
421 Args: 420 Args:
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 """Ensure creation of all permanent items for a given set of sync types. 552 """Ensure creation of all permanent items for a given set of sync types.
554 553
555 Args: 554 Args:
556 requested_types: A list of sync data types from ALL_TYPES. 555 requested_types: A list of sync data types from ALL_TYPES.
557 Permanent items of only these types will be created. 556 Permanent items of only these types will be created.
558 """ 557 """
559 for spec in self._PERMANENT_ITEM_SPECS: 558 for spec in self._PERMANENT_ITEM_SPECS:
560 if spec.sync_type in requested_types: 559 if spec.sync_type in requested_types:
561 self._CreatePermanentItem(spec) 560 self._CreatePermanentItem(spec)
562 561
562 def ResetStoreBirthday(self):
563 """Resets the store birthday to a random value."""
564 # TODO(nick): uuid.uuid1() is better, but python 2.5 only.
565 self.store_birthday = '%0.30f' % random.random()
566
567 def StoreBirthday(self):
568 """Gets the store birthday."""
569 return self.store_birthday
570
563 def GetChanges(self, sieve): 571 def GetChanges(self, sieve):
564 """Get entries which have changed, oldest first. 572 """Get entries which have changed, oldest first.
565 573
566 The returned entries are limited to being _BATCH_SIZE many. The entries 574 The returned entries are limited to being _BATCH_SIZE many. The entries
567 are returned in strict version order. 575 are returned in strict version order.
568 576
569 Args: 577 Args:
570 sieve: An update sieve to use to filter out updates the client 578 sieve: An update sieve to use to filter out updates the client
571 has already seen. 579 has already seen.
572 Returns: 580 Returns:
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 return '?' 885 return '?'
878 client_id = client_id[0] 886 client_id = client_id[0]
879 if client_id not in self.clients: 887 if client_id not in self.clients:
880 self.clients[client_id] = self.client_name_generator.next() 888 self.clients[client_id] = self.client_name_generator.next()
881 return self.clients[client_id] 889 return self.clients[client_id]
882 890
883 def CheckStoreBirthday(self, request): 891 def CheckStoreBirthday(self, request):
884 """Raises StoreBirthdayError if the request's birthday is a mismatch.""" 892 """Raises StoreBirthdayError if the request's birthday is a mismatch."""
885 if not request.HasField('store_birthday'): 893 if not request.HasField('store_birthday'):
886 return 894 return
887 if self.account.store_birthday != request.store_birthday: 895 if self.account.StoreBirthday() != request.store_birthday:
888 raise StoreBirthdayError 896 raise StoreBirthdayError
889 897
890 def HandleMigrate(self, path): 898 def HandleMigrate(self, path):
891 query = urlparse.urlparse(path)[4] 899 query = urlparse.urlparse(path)[4]
892 code = 200 900 code = 200
893 self.account_lock.acquire() 901 self.account_lock.acquire()
894 try: 902 try:
895 datatypes = [DataTypeStringToSyncTypeLoose(x) 903 datatypes = [DataTypeStringToSyncTypeLoose(x)
896 for x in urlparse.parse_qs(query).get('type',[])] 904 for x in urlparse.parse_qs(query).get('type',[])]
897 if datatypes: 905 if datatypes:
898 self.account.TriggerMigration(datatypes) 906 self.account.TriggerMigration(datatypes)
899 response = 'Migrated datatypes %s' % ( 907 response = 'Migrated datatypes %s' % (
900 ' and '.join(SyncTypeToString(x).upper() for x in datatypes)) 908 ' and '.join(SyncTypeToString(x).upper() for x in datatypes))
901 else: 909 else:
902 response = 'Please specify one or more <i>type=name</i> parameters' 910 response = 'Please specify one or more <i>type=name</i> parameters'
903 code = 400 911 code = 400
904 except DataTypeIdNotRecognized, error: 912 except DataTypeIdNotRecognized, error:
905 response = 'Could not interpret datatype name' 913 response = 'Could not interpret datatype name'
906 code = 400 914 code = 400
907 finally: 915 finally:
908 self.account_lock.release() 916 self.account_lock.release()
909 return (code, '<html><title>Migration: %d</title><H1>%d %s</H1></html>' % 917 return (code, '<html><title>Migration: %d</title><H1>%d %s</H1></html>' %
910 (code, code, response)) 918 (code, code, response))
911 919
920 def HandleCreateBirthdayError(self):
921 self.account.ResetStoreBirthday()
922 return (
923 200,
924 '<html><title>Birthday error</title><H1>Birthday error</H1></html>')
925
912 def HandleCommand(self, query, raw_request): 926 def HandleCommand(self, query, raw_request):
913 """Decode and handle a sync command from a raw input of bytes. 927 """Decode and handle a sync command from a raw input of bytes.
914 928
915 This is the main entry point for this class. It is safe to call this 929 This is the main entry point for this class. It is safe to call this
916 method from multiple threads. 930 method from multiple threads.
917 931
918 Args: 932 Args:
919 raw_request: An iterable byte sequence to be interpreted as a sync 933 raw_request: An iterable byte sequence to be interpreted as a sync
920 protocol command. 934 protocol command.
921 Returns: 935 Returns:
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1041 1055
1042 update_sieve.CheckMigrationState() 1056 update_sieve.CheckMigrationState()
1043 1057
1044 new_timestamp, entries, remaining = self.account.GetChanges(update_sieve) 1058 new_timestamp, entries, remaining = self.account.GetChanges(update_sieve)
1045 1059
1046 update_response.changes_remaining = remaining 1060 update_response.changes_remaining = remaining
1047 for entry in entries: 1061 for entry in entries:
1048 reply = update_response.entries.add() 1062 reply = update_response.entries.add()
1049 reply.CopyFrom(entry) 1063 reply.CopyFrom(entry)
1050 update_sieve.SaveProgress(new_timestamp, update_response) 1064 update_sieve.SaveProgress(new_timestamp, update_response)
OLDNEW
« no previous file with comments | « chrome/test/live_sync/sync_errors_test.cc ('k') | net/tools/testserver/testserver.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698