aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/core/test
diff options
context:
space:
mode:
authorGravatar rsgowman <rgowman@google.com>2018-05-09 12:23:34 -0400
committerGravatar GitHub <noreply@github.com>2018-05-09 12:23:34 -0400
commitaf955682f92baf4fce134dc72a0d2b1564562973 (patch)
tree5455da697ca0f3a1aa3950625a19445bbb53d52d /Firestore/core/test
parent01ed7b20aec82163defd3e370e82ee9a83fbb951 (diff)
[De]serialize Timestamps via the remote Serializer (#1233)
Diffstat (limited to 'Firestore/core/test')
-rw-r--r--Firestore/core/test/firebase/firestore/remote/serializer_test.cc52
1 files changed, 52 insertions, 0 deletions
diff --git a/Firestore/core/test/firebase/firestore/remote/serializer_test.cc b/Firestore/core/test/firebase/firestore/remote/serializer_test.cc
index 1dded05..38277e2 100644
--- a/Firestore/core/test/firebase/firestore/remote/serializer_test.cc
+++ b/Firestore/core/test/firebase/firestore/remote/serializer_test.cc
@@ -34,7 +34,9 @@
#include "Firestore/Protos/cpp/google/firestore/v1beta1/document.pb.h"
#include "Firestore/core/include/firebase/firestore/firestore_errors.h"
+#include "Firestore/core/include/firebase/firestore/timestamp.h"
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
+#include "Firestore/core/src/firebase/firestore/timestamp_internal.h"
#include "Firestore/core/src/firebase/firestore/util/status.h"
#include "Firestore/core/src/firebase/firestore/util/statusor.h"
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
@@ -42,6 +44,8 @@
#include "google/protobuf/util/message_differencer.h"
#include "gtest/gtest.h"
+using firebase::Timestamp;
+using firebase::TimestampInternal;
using firebase::firestore::FirestoreErrorCode;
using firebase::firestore::model::DatabaseId;
using firebase::firestore::model::FieldValue;
@@ -179,6 +183,15 @@ class SerializerTest : public ::testing::Test {
return proto;
}
+ google::firestore::v1beta1::Value ValueProto(const Timestamp& ts) {
+ std::vector<uint8_t> bytes =
+ EncodeFieldValue(&serializer, FieldValue::TimestampValue(ts));
+ google::firestore::v1beta1::Value proto;
+ bool ok = proto.ParseFromArray(bytes.data(), bytes.size());
+ EXPECT_TRUE(ok);
+ return proto;
+ }
+
private:
void ExpectSerializationRoundTrip(
const FieldValue& model,
@@ -259,6 +272,23 @@ TEST_F(SerializerTest, EncodesString) {
}
}
+TEST_F(SerializerTest, EncodesTimestamps) {
+ std::vector<Timestamp> cases{
+ {}, // epoch
+ {1234, 0},
+ {1234, 999999999},
+ {-1234, 0},
+ {-1234, 999999999},
+ TimestampInternal::Max(),
+ TimestampInternal::Min(),
+ };
+
+ for (const Timestamp& ts_value : cases) {
+ FieldValue model = FieldValue::TimestampValue(ts_value);
+ ExpectRoundTrip(model, ValueProto(ts_value), FieldValue::Type::Timestamp);
+ }
+}
+
TEST_F(SerializerTest, EncodesEmptyMap) {
FieldValue model = FieldValue::ObjectValueFromMap({});
@@ -366,6 +396,28 @@ TEST_F(SerializerTest, BadStringValue) {
Status(FirestoreErrorCode::DataLoss, "ignored"), bytes);
}
+TEST_F(SerializerTest, BadTimestampValue_TooLarge) {
+ std::vector<uint8_t> bytes = EncodeFieldValue(
+ &serializer, FieldValue::TimestampValue(TimestampInternal::Max()));
+
+ // Add some time, which should push us above the maximum allowed timestamp.
+ Mutate(&bytes[4], 0x82, 0x83);
+
+ ExpectFailedStatusDuringDecode(
+ Status(FirestoreErrorCode::DataLoss, "ignored"), bytes);
+}
+
+TEST_F(SerializerTest, BadTimestampValue_TooSmall) {
+ std::vector<uint8_t> bytes = EncodeFieldValue(
+ &serializer, FieldValue::TimestampValue(TimestampInternal::Min()));
+
+ // Remove some time, which should push us below the minimum allowed timestamp.
+ Mutate(&bytes[4], 0x92, 0x91);
+
+ ExpectFailedStatusDuringDecode(
+ Status(FirestoreErrorCode::DataLoss, "ignored"), bytes);
+}
+
TEST_F(SerializerTest, BadTag) {
std::vector<uint8_t> bytes =
EncodeFieldValue(&serializer, FieldValue::NullValue());