@@ -341,6 +341,44 @@ TEST_F(ReflectionTest, Duration_Dynamic) {
341341 StatusIs (absl::StatusCode::kInvalidArgument ));
342342}
343343
344+ TEST_F (ReflectionTest, Duration_ToAbslDuration) {
345+ auto * value = MakeDynamic<google::protobuf::Duration>();
346+ ASSERT_OK_AND_ASSIGN (
347+ auto reflection,
348+ GetDurationReflection (ABSL_DIE_IF_NULL (value->GetDescriptor ())));
349+
350+ reflection.SetSeconds (value, 1 );
351+ reflection.SetNanos (value, 1 );
352+ EXPECT_THAT (reflection.ToAbslDuration (*value),
353+ IsOkAndHolds (absl::Seconds (1 ) + absl::Nanoseconds (1 )));
354+ EXPECT_EQ (reflection.UnsafeToAbslDuration (*value),
355+ absl::Seconds (1 ) + absl::Nanoseconds (1 ));
356+
357+ reflection.SetSeconds (value, 0x7fffffffffffffff );
358+ reflection.SetNanos (value, 1 );
359+ EXPECT_THAT (reflection.ToAbslDuration (*value),
360+ StatusIs (absl::StatusCode::kInvalidArgument ,
361+ HasSubstr (" invalid duration seconds: " )));
362+ EXPECT_EQ (reflection.UnsafeToAbslDuration (*value),
363+ absl::Seconds (0x7fffffffffffffff ) + absl::Nanoseconds (1 ));
364+
365+ reflection.SetSeconds (value, 1 );
366+ reflection.SetNanos (value, 0x7fffffff );
367+ EXPECT_THAT (reflection.ToAbslDuration (*value),
368+ StatusIs (absl::StatusCode::kInvalidArgument ,
369+ HasSubstr (" invalid duration nanoseconds: " )));
370+ EXPECT_EQ (reflection.UnsafeToAbslDuration (*value),
371+ absl::Seconds (1 ) + absl::Nanoseconds (0x7fffffff ));
372+
373+ reflection.SetSeconds (value, -1 );
374+ reflection.SetNanos (value, 1 );
375+ EXPECT_THAT (reflection.ToAbslDuration (*value),
376+ StatusIs (absl::StatusCode::kInvalidArgument ,
377+ HasSubstr (" duration sign mismatch: " )));
378+ EXPECT_EQ (reflection.UnsafeToAbslDuration (*value),
379+ absl::Seconds (-1 ) + absl::Nanoseconds (1 ));
380+ }
381+
344382TEST_F (ReflectionTest, Timestamp_Generated) {
345383 auto * value = MakeGenerated<google::protobuf::Timestamp>();
346384 EXPECT_EQ (TimestampReflection::GetSeconds (*value), 0 );
@@ -389,6 +427,39 @@ TEST_F(ReflectionTest, Timestamp_Dynamic) {
389427 StatusIs (absl::StatusCode::kInvalidArgument ));
390428}
391429
430+ TEST_F (ReflectionTest, Timestamp_ToAbslTime) {
431+ auto * value = MakeDynamic<google::protobuf::Timestamp>();
432+ ASSERT_OK_AND_ASSIGN (
433+ auto reflection,
434+ GetTimestampReflection (ABSL_DIE_IF_NULL (value->GetDescriptor ())));
435+
436+ reflection.SetSeconds (value, 1 );
437+ reflection.SetNanos (value, 1 );
438+ EXPECT_THAT (reflection.ToAbslTime (*value),
439+ IsOkAndHolds (absl::UnixEpoch () + absl::Seconds (1 ) +
440+ absl::Nanoseconds (1 )));
441+ EXPECT_EQ (reflection.UnsafeToAbslTime (*value),
442+ absl::UnixEpoch () + absl::Seconds (1 ) + absl::Nanoseconds (1 ));
443+
444+ reflection.SetSeconds (value, 0x7fffffffffffffff );
445+ reflection.SetNanos (value, 1 );
446+ EXPECT_THAT (reflection.ToAbslTime (*value),
447+ StatusIs (absl::StatusCode::kInvalidArgument ,
448+ HasSubstr (" invalid timestamp seconds: " )));
449+ EXPECT_EQ (reflection.UnsafeToAbslTime (*value),
450+ absl::UnixEpoch () + absl::Seconds (0x7fffffffffffffff ) +
451+ absl::Nanoseconds (1 ));
452+
453+ reflection.SetSeconds (value, 1 );
454+ reflection.SetNanos (value, 0x7fffffff );
455+ EXPECT_THAT (reflection.ToAbslTime (*value),
456+ StatusIs (absl::StatusCode::kInvalidArgument ,
457+ HasSubstr (" invalid timestamp nanoseconds: " )));
458+ EXPECT_EQ (
459+ reflection.UnsafeToAbslTime (*value),
460+ absl::UnixEpoch () + absl::Seconds (1 ) + absl::Nanoseconds (0x7fffffff ));
461+ }
462+
392463TEST_F (ReflectionTest, Value_Generated) {
393464 auto * value = MakeGenerated<google::protobuf::Value>();
394465 EXPECT_EQ (ValueReflection::GetKindCase (*value),
@@ -698,25 +769,25 @@ TEST_F(AdaptFromMessageTest, Duration_SecondsOutOfRange) {
698769 auto message = DynamicParseTextProto<google::protobuf::Duration>(
699770 R"pb( seconds: 0x7fffffffffffffff nanos: 1)pb" );
700771 EXPECT_THAT (AdaptFromMessage (*message),
701- StatusIs ( absl::StatusCode:: kInvalidArgument ,
702- HasSubstr ( " invalid duration seconds: " )));
772+ IsOkAndHolds (VariantWith< absl::Duration>(
773+ absl::Seconds ( 0x7fffffffffffffff ) + absl::Nanoseconds ( 1 ) )));
703774}
704775
705776TEST_F (AdaptFromMessageTest, Duration_NanosOutOfRange) {
706777 auto message = DynamicParseTextProto<google::protobuf::Duration>(
707778 R"pb( seconds: 1 nanos: 0x7fffffff)pb" );
708779 EXPECT_THAT (AdaptFromMessage (*message),
709- StatusIs ( absl::StatusCode:: kInvalidArgument ,
710- HasSubstr ( " invalid duration nanoseconds: " )));
780+ IsOkAndHolds (VariantWith< absl::Duration>(
781+ absl::Seconds ( 1 ) + absl::Nanoseconds ( 0x7fffffff ) )));
711782}
712783
713784TEST_F (AdaptFromMessageTest, Duration_SignMismatch) {
714785 auto message =
715786 DynamicParseTextProto<google::protobuf::Duration>(R"pb( seconds: -1
716787 nanos: 1)pb" );
717788 EXPECT_THAT (AdaptFromMessage (*message),
718- StatusIs ( absl::StatusCode:: kInvalidArgument ,
719- HasSubstr ( " duration sign mismatch: " )));
789+ IsOkAndHolds (VariantWith< absl::Duration>( absl::Seconds (- 1 ) +
790+ absl::Nanoseconds ( 1 ) )));
720791}
721792
722793TEST_F (AdaptFromMessageTest, Timestamp) {
@@ -733,16 +804,18 @@ TEST_F(AdaptFromMessageTest, Timestamp_SecondsOutOfRange) {
733804 auto message = DynamicParseTextProto<google::protobuf::Timestamp>(
734805 R"pb( seconds: 0x7fffffffffffffff nanos: 1)pb" );
735806 EXPECT_THAT (AdaptFromMessage (*message),
736- StatusIs (absl::StatusCode::kInvalidArgument ,
737- HasSubstr (" invalid timestamp seconds: " )));
807+ IsOkAndHolds (VariantWith<absl::Time>(
808+ absl::UnixEpoch () + absl::Seconds (0x7fffffffffffffff ) +
809+ absl::Nanoseconds (1 ))));
738810}
739811
740812TEST_F (AdaptFromMessageTest, Timestamp_NanosOutOfRange) {
741813 auto message = DynamicParseTextProto<google::protobuf::Timestamp>(
742814 R"pb( seconds: 1 nanos: 0x7fffffff)pb" );
743815 EXPECT_THAT (AdaptFromMessage (*message),
744- StatusIs (absl::StatusCode::kInvalidArgument ,
745- HasSubstr (" invalid timestamp nanoseconds: " )));
816+ IsOkAndHolds (
817+ VariantWith<absl::Time>(absl::UnixEpoch () + absl::Seconds (1 ) +
818+ absl::Nanoseconds (0x7fffffff ))));
746819}
747820
748821TEST_F (AdaptFromMessageTest, Value_NullValue) {
0 commit comments