Skip to content

Commit f5ec306

Browse files
committed
Merge pull request #182 from tseaver/132-enforce_int64_bounds_for_protobuf_values
Fix #132: enforce 64-bit ranges on long values for protobuf attrs.
2 parents b97ce73 + 68c0505 commit f5ec306

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

gcloud/datastore/helpers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
import calendar
33
from datetime import datetime, timedelta
44

5+
from google.protobuf.internal.type_checkers import Int64ValueChecker
56
import pytz
67

78
from gcloud.datastore.key import Key
89

910

11+
INT64 = Int64ValueChecker().CheckValue
12+
13+
1014
def get_protobuf_attribute_and_value(val):
1115
"""Given a value, return the protobuf attribute name and proper value.
1216
@@ -53,7 +57,7 @@ def get_protobuf_attribute_and_value(val):
5357
elif isinstance(val, float):
5458
name, value = 'double', val
5559
elif isinstance(val, (int, long)):
56-
name, value = 'integer', val
60+
name, value = 'integer', INT64(val)
5761
elif isinstance(val, basestring):
5862
name, value = 'string', val
5963

gcloud/datastore/test_helpers.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,19 @@ def test_int(self):
5656
self.assertEqual(value, 42)
5757

5858
def test_long(self):
59-
must_be_long = 1 << 63
59+
must_be_long = (1 << 63) - 1
6060
name, value = self._callFUT(must_be_long)
6161
self.assertEqual(name, 'integer_value')
6262
self.assertEqual(value, must_be_long)
6363

64+
def test_long_too_small(self):
65+
too_small = -(1 << 63) - 1
66+
self.assertRaises(ValueError, self._callFUT, too_small)
67+
68+
def test_long_too_large(self):
69+
too_large = 1 << 63
70+
self.assertRaises(ValueError, self._callFUT, too_large)
71+
6472
def test_native_str(self):
6573
name, value = self._callFUT('str')
6674
self.assertEqual(name, 'string_value')

0 commit comments

Comments
 (0)