@@ -924,6 +924,142 @@ TEST_F(ParallelUploadTest, CleanupFailureIsNotIgnored) {
924924 ASSERT_FALSE (object_metadata);
925925}
926926
927+ TEST (ParallelUploadPersistentState, NotJson) {
928+ auto res = ParallelUploadPersistentState::FromString (" blah" );
929+ EXPECT_FALSE (res);
930+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
931+ EXPECT_THAT (res.status ().message (), HasSubstr (" not a valid JSON" ));
932+ }
933+
934+ TEST (ParallelUploadPersistentState, RootNotOject) {
935+ auto res = ParallelUploadPersistentState::FromString (" \" blah\" " );
936+ EXPECT_FALSE (res);
937+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
938+ EXPECT_THAT (res.status ().message (), HasSubstr (" not a JSON object" ));
939+ }
940+
941+ TEST (ParallelUploadPersistentState, NoDestination) {
942+ auto res = ParallelUploadPersistentState::FromString (
943+ internal::nl::json{{" a" , " b" }}.dump ());
944+ EXPECT_FALSE (res);
945+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
946+ EXPECT_THAT (res.status ().message (),
947+ HasSubstr (" doesn't contain a 'destination'" ));
948+ }
949+
950+ TEST (ParallelUploadPersistentState, DestinationNotAString) {
951+ auto res = ParallelUploadPersistentState::FromString (
952+ internal::nl::json{{" destination" , 2 }}.dump ());
953+ EXPECT_FALSE (res);
954+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
955+ EXPECT_THAT (res.status ().message (),
956+ HasSubstr (" 'destination' is not a string" ));
957+ }
958+
959+ TEST (ParallelUploadPersistentState, NoGeneration) {
960+ auto res = ParallelUploadPersistentState::FromString (
961+ internal::nl::json{{" destination" , " b" }}.dump ());
962+ EXPECT_FALSE (res);
963+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
964+ EXPECT_THAT (res.status ().message (),
965+ HasSubstr (" doesn't contain a 'expected_generation'" ));
966+ }
967+
968+ TEST (ParallelUploadPersistentState, GenerationNotAString) {
969+ auto res = ParallelUploadPersistentState::FromString (internal::nl::json{
970+ {" destination" , " dest" }, {" expected_generation" , " blah" }}
971+ .dump ());
972+ EXPECT_FALSE (res);
973+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
974+ EXPECT_THAT (res.status ().message (),
975+ HasSubstr (" 'expected_generation' is not a number" ));
976+ }
977+
978+ TEST (ParallelUploadPersistentState, NoStreams) {
979+ auto res = ParallelUploadPersistentState::FromString (
980+ internal::nl::json{{" destination" , " dest" }, {" expected_generation" , 1 }}
981+ .dump ());
982+ EXPECT_FALSE (res);
983+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
984+ EXPECT_THAT (res.status ().message (), HasSubstr (" doesn't contain 'streams'" ));
985+ }
986+
987+ TEST (ParallelUploadPersistentState, StreamsNotArray) {
988+ auto res = ParallelUploadPersistentState::FromString (internal::nl::json{
989+ {" destination" , " dest" }, {" expected_generation" , 1 }, {" streams" , 5 }}
990+ .dump ());
991+ EXPECT_FALSE (res);
992+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
993+ EXPECT_THAT (res.status ().message (), HasSubstr (" is not an array" ));
994+ }
995+
996+ TEST (ParallelUploadPersistentState, StreamNotObject) {
997+ auto res = ParallelUploadPersistentState::FromString (internal::nl::json{
998+ {" destination" , " dest" }, {" expected_generation" , 1 }, {" streams" , {5 }}}
999+ .dump ());
1000+ EXPECT_FALSE (res);
1001+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
1002+ EXPECT_THAT (res.status ().message (), HasSubstr (" 'stream' is not an object" ));
1003+ }
1004+
1005+ TEST (ParallelUploadPersistentState, StreamHasNoName) {
1006+ auto res = ParallelUploadPersistentState::FromString (
1007+ internal::nl::json{{" destination" , " dest" },
1008+ {" expected_generation" , 1 },
1009+ {" streams" , {internal::nl::json::object ()}}}
1010+ .dump ());
1011+ EXPECT_FALSE (res);
1012+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
1013+ EXPECT_THAT (res.status ().message (),
1014+ HasSubstr (" stream doesn't contain a 'name'" ));
1015+ }
1016+
1017+ TEST (ParallelUploadPersistentState, StreamNameNotString) {
1018+ auto res = ParallelUploadPersistentState::FromString (
1019+ internal::nl::json{{" destination" , " dest" },
1020+ {" expected_generation" , 1 },
1021+ {" streams" , {{{" name" , 1 }}}}}
1022+ .dump ());
1023+ EXPECT_FALSE (res);
1024+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
1025+ EXPECT_THAT (res.status ().message (),
1026+ HasSubstr (" stream 'name' is not a string" ));
1027+ }
1028+
1029+ TEST (ParallelUploadPersistentState, StreamHasNoSessionId) {
1030+ auto res = ParallelUploadPersistentState::FromString (
1031+ internal::nl::json{{" destination" , " dest" },
1032+ {" expected_generation" , 1 },
1033+ {" streams" , {{{" name" , " abc" }}}}}
1034+ .dump ());
1035+ EXPECT_FALSE (res);
1036+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
1037+ EXPECT_THAT (res.status ().message (),
1038+ HasSubstr (" stream doesn't contain a 'resumable_session_id'" ));
1039+ }
1040+
1041+ TEST (ParallelUploadPersistentState, StreamSessionIdNotString) {
1042+ auto res = ParallelUploadPersistentState::FromString (internal::nl::json{
1043+ {" destination" , " dest" },
1044+ {" expected_generation" , 1 },
1045+ {" streams" , {{{" name" , " abc" }, {" resumable_session_id" , 123 }}}}}
1046+ .dump ());
1047+ EXPECT_FALSE (res);
1048+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
1049+ EXPECT_THAT (res.status ().message (),
1050+ HasSubstr (" 'resumable_session_id' is not a string" ));
1051+ }
1052+
1053+ TEST (ParallelUploadPersistentState, StreamsEmpty) {
1054+ auto res = ParallelUploadPersistentState::FromString (
1055+ internal::nl::json{{" destination" , " dest" },
1056+ {" expected_generation" , 1 },
1057+ {" streams" , internal::nl::json::array ()}}
1058+ .dump ());
1059+ EXPECT_FALSE (res);
1060+ EXPECT_EQ (StatusCode::kInternal , res.status ().code ());
1061+ EXPECT_THAT (res.status ().message (), HasSubstr (" doesn't contain any streams" ));
1062+ }
9271063} // namespace
9281064} // namespace internal
9291065} // namespace STORAGE_CLIENT_NS
0 commit comments