From af955682f92baf4fce134dc72a0d2b1564562973 Mon Sep 17 00:00:00 2001 From: rsgowman Date: Wed, 9 May 2018 12:23:34 -0400 Subject: [De]serialize Timestamps via the remote Serializer (#1233) --- .../firebase/firestore/remote/serializer_test.cc | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'Firestore/core/test') 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 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 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 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 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 bytes = EncodeFieldValue(&serializer, FieldValue::NullValue()); -- cgit v1.2.3