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

Side by Side Diff: appengine/findit/model/test/versioned_model_test.py

Issue 2345093002: [Findit] Extending versioned_model.py to support versioning multiple entities of the same class. (Closed)
Patch Set: Ignore this patch, uploaded unrelated change to wrong branch Created 4 years, 2 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
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 from google.appengine.api import datastore_errors 5 from google.appengine.api import datastore_errors
6 from google.appengine.ext import ndb 6 from google.appengine.ext import ndb
7 7
8 from testing_utils import testing 8 from testing_utils import testing
9 9
10 from model.versioned_model import VersionedModel 10 from model.versioned_model import VersionedModel
11 11
12 12
13 class _Entity(VersionedModel): 13 class _Entity(VersionedModel):
14 value = ndb.IntegerProperty(indexed=False) 14 value = ndb.IntegerProperty(indexed=False)
15 15
16 16
17 class VersionedModelTest(testing.AppengineTestCase): 17 class VersionedModelTest(testing.AppengineTestCase):
18 18
19 def testGetRootModel(self): 19 def testGetRootModel(self):
20 root_model_class = _Entity._GetRootModel() 20 root_model_class = _Entity._GetRootModel()
21 self.assertEqual('_EntityRoot', root_model_class._get_kind()) 21 self.assertEqual('_EntityRoot', root_model_class._get_kind())
22 self.assertTrue(issubclass(root_model_class, ndb.Model)) 22 self.assertTrue(issubclass(root_model_class, ndb.Model))
23 self.assertEqual(3, root_model_class(current=3).current) 23 self.assertEqual(3, root_model_class(current=3).current)
24 24
25 def testDefaultVersionIsZero(self): 25 def testDefaultVersionIsZero(self):
26 entity = _Entity() 26 self.assertEqual(0, _Entity.Create().version)
27 self.assertEqual(0, entity.version) 27 self.assertEqual(0, _Entity.Create('m1').version)
28
29 def testRootId(self):
30 self.assertEqual(1, _Entity.Create()._root_id)
31 self.assertEqual(
32 1, _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 2))._root_id)
33 self.assertEqual('m1', _Entity.Create('m1')._root_id)
34
35 def testCreate(self):
36 self.assertEqual(_Entity(key=ndb.Key('_EntityRoot', 'm1', '_Entity', 0)),
37 _Entity.Create('m1'))
28 38
29 def testGetMostRecentVersionWhenNoData(self): 39 def testGetMostRecentVersionWhenNoData(self):
30 entity = _Entity.GetVersion() 40 self.assertIsNone(_Entity.GetVersion())
31 self.assertIsNone(entity) 41 self.assertIsNone(_Entity.GetVersion('m1'))
32 42
33 def testGetMostRecentVersionWhenDataExists(self): 43 def testGetMostRecentVersionWhenDataExists(self):
34 root_key = ndb.Key('_EntityRoot', 1) 44 entity = _Entity.Create()
35 _Entity._GetRootModel()(key=root_key, current=2).put() 45 entity.value = 1
36 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=1).put() 46 entity.Save()
37 _Entity(key=ndb.Key('_Entity', 2, parent=root_key), value=2).put() 47 entity.value = 2
48 entity.Save()
38 49
39 entity = _Entity.GetVersion() 50 entity = _Entity.GetVersion()
40 self.assertEqual(2, entity.version) 51 self.assertEqual(2, entity.version)
41 self.assertEqual(2, entity.value) 52 self.assertEqual(2, entity.value)
42 53
43 def testGetNextVersionWhenDataExists(self): 54 def testGetSpecificVersion(self):
44 root_key = ndb.Key('_EntityRoot', 1) 55 entity = _Entity.Create()
45 _Entity._GetRootModel()(key=root_key, current=2).put() 56 entity.value = 1
46 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=1).put() 57 entity.Save()
47 _Entity(key=ndb.Key('_Entity', 2, parent=root_key), value=2).put() 58 entity.value = 2
59 entity.Save()
48 60
49 entity = _Entity.GetVersion(2) 61 entity_version_2 = _Entity.GetVersion(version=2)
50 self.assertEqual(2, entity.version) 62 self.assertEqual(2, entity_version_2.version)
51 self.assertEqual(2, entity.value) 63 self.assertEqual(2, entity_version_2.value)
52 self.assertIsNone(_Entity.GetVersion(0)) 64 self.assertIsNone(_Entity.GetVersion(version=0))
53 self.assertIsNone(_Entity.GetVersion(3)) 65 self.assertIsNone(_Entity.GetVersion(version=3))
54 66
55 def testGetLatestVersionNumber(self): 67 def testGetLatestVersionNumber(self):
56 root_key = ndb.Key('_EntityRoot', 1) 68 entity = _Entity.Create()
57 _Entity._GetRootModel()(key=root_key, current=1).put() 69 entity.Save()
58 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=2).put() 70 self.assertEqual(1, _Entity.GetLatestVersionNumber())
59 71
60 self.assertEqual(1, _Entity.GetLatestVersionNumber()) 72 def testGetVersionForEntityWithKeyId(self):
73 entity = _Entity.Create('m1')
74 entity.value = 1
75 entity.Save()
76 entity.value = 2
77 entity.Save()
78
79 self.assertEqual(2, _Entity.GetVersion('m1').version)
80 self.assertEqual(2, _Entity.GetVersion('m1').value)
81 self.assertIsNone(_Entity.GetVersion('m1', version=0))
82 self.assertIsNone(_Entity.GetVersion('m1', version=3))
61 83
62 def testGetLatestVersionNumberWhenNoRecordYet(self): 84 def testGetLatestVersionNumberWhenNoRecordYet(self):
63 self.assertEqual(-1, _Entity.GetLatestVersionNumber()) 85 self.assertEqual(-1, _Entity.GetLatestVersionNumber())
86 self.assertEqual(-1, _Entity.GetLatestVersionNumber('m1'))
64 87
65 def testSaveNewVersion(self): 88 def testSaveNewVersion(self):
66 entity = _Entity() 89 entity = _Entity.Create()
67 entity.value = 1 90 entity.value = 1
68 key = entity.Save() 91 key, saved = entity.Save()
69 92
70 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1) 93 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
71 self.assertEqual(expected_key, key) 94 self.assertEqual(expected_key, key)
95 self.assertTrue(saved)
72 96
73 entity = _Entity.GetVersion() 97 entity = _Entity.GetVersion()
74 self.assertEqual(1, entity.version) 98 self.assertEqual(1, entity.version)
75 self.assertEqual(1, entity.value) 99 self.assertEqual(1, entity.value)
76 100
77 def testSaveNewVersionAlreadyExist(self): 101 def testSaveEntityWithRootId(self):
102 entity = _Entity.Create('m1')
103 entity.value = 1
104 entity.Save()
105 entity.value = 3
106 entity.Save()
107
108 self.assertEqual(entity.version, 2)
109 self.assertEqual(entity.value, 3)
110
111 def testSaveNewVersionOfEntityWithKeyId(self):
112 entity = _Entity.Create('m1')
113 entity.value = 1
114 key, saved = entity.Save()
115 expected_key = ndb.Key('_EntityRoot', 'm1', '_Entity', 1)
116 self.assertEqual(expected_key, key)
117 self.assertTrue(saved)
118
119 def testSaveNewVersionWithConflictRetry(self):
78 original_ndb_transaction = ndb.transaction 120 original_ndb_transaction = ndb.transaction
79 121
80 def MockNdbTransaction(func, **options): 122 def MockNdbTransaction(func, **options):
81 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 1), value=1).put() 123 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 1), value=1).put()
82 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 2), value=2).put() 124 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 2), value=2).put()
83 return original_ndb_transaction(func, **options) 125 return original_ndb_transaction(func, **options)
84 self.mock(ndb, 'transaction', MockNdbTransaction) 126 self.mock(ndb, 'transaction', MockNdbTransaction)
85 127
86 entity = _Entity() 128 entity = _Entity.Create()
87 key = entity.Save() 129 key, saved = entity.Save()
88 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 3) 130 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 3)
89 self.assertEqual(expected_key, key) 131 self.assertEqual(expected_key, key)
132 self.assertTrue(saved)
133
134 def testSaveNewVersionWithConflictBeforeTransactionNoRetry(self):
135 original_ndb_transaction = ndb.transaction
136
137 def MockNdbTransaction(func, **options):
138 # To simulate another transaction occuring before this one, write a new
139 # version first before the transaction is called.
140 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 1), value=1).put()
141 return original_ndb_transaction(func, **options)
142 self.mock(ndb, 'transaction', MockNdbTransaction)
143
144 entity = _Entity.Create()
145 key, saved = entity.Save(retry_on_conflict=False)
146 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
147 self.assertEqual(expected_key, key)
148 self.assertFalse(saved)
149
150 def testSaveNewVersionConflictBeforeSaving(self):
151 original_save = VersionedModel.Save
152
153 def MockSave(*args, **kwargs):
154 # Smulate another transaction beating this call to Save() to creating a
155 # new entity.
156 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 1), value=1).put()
157 return original_save(*args, **kwargs)
158 self.mock(VersionedModel, 'Save', MockSave)
159
160 entity = _Entity.Create()
161 key, saved = entity.Save(retry_on_conflict=False)
162 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
163 self.assertEqual(expected_key, key)
164 self.assertFalse(saved)
90 165
91 def testLikelyTransactionFailure(self): 166 def testLikelyTransactionFailure(self):
92 original_ndb_transaction = ndb.transaction 167 original_ndb_transaction = ndb.transaction
93 168
94 calls = [] 169 calls = []
95 def MockNdbTransaction(func, **options): 170 def MockNdbTransaction(func, **options):
96 if len(calls) < 1: 171 if len(calls) < 1:
97 calls.append(1) 172 calls.append(1)
98 raise datastore_errors.Timeout() 173 raise datastore_errors.Timeout()
99 return original_ndb_transaction(func, **options) 174 return original_ndb_transaction(func, **options)
100 self.mock(ndb, 'transaction', MockNdbTransaction) 175 self.mock(ndb, 'transaction', MockNdbTransaction)
101 176
102 entity = _Entity() 177 entity = _Entity.Create()
103 key = entity.Save() 178 key, saved = entity.Save()
104 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1) 179 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
105 self.assertEqual(expected_key, key) 180 self.assertEqual(expected_key, key)
181 self.assertTrue(saved)
106 self.assertEqual([1], calls) 182 self.assertEqual([1], calls)
107 183
108 def testTransactionFailure(self): 184 def testTransactionFailure(self):
109 original_ndb_transaction = ndb.transaction 185 original_ndb_transaction = ndb.transaction
110 186
111 calls = [] 187 calls = []
112 def MockNdbTransaction(func, **options): 188 def MockNdbTransaction(func, **options):
113 if len(calls) < 1: 189 if len(calls) < 1:
114 calls.append(1) 190 calls.append(1)
115 raise datastore_errors.BadRequestError() 191 raise datastore_errors.BadRequestError()
116 return original_ndb_transaction(func, **options) 192 return original_ndb_transaction(func, **options)
117 self.mock(ndb, 'transaction', MockNdbTransaction) 193 self.mock(ndb, 'transaction', MockNdbTransaction)
118 194
119 entity = _Entity() 195 entity = _Entity.Create()
120 key = entity.Save() 196 key, saved = entity.Save()
121 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1) 197 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
122 self.assertEqual(expected_key, key) 198 self.assertEqual(expected_key, key)
123 self.assertEqual([1], calls) 199 self.assertEqual([1], calls)
200 self.assertTrue(saved)
OLDNEW
« no previous file with comments | « appengine/findit/model/flake/test/flake_swarming_task_test.py ('k') | appengine/findit/model/versioned_config.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698