diff options
author | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2018-01-02 18:24:17 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2018-01-03 10:36:08 +0000 |
commit | f95d6e159d7e588668680585f3ca38f4295fee7d (patch) | |
tree | dda5d5f3d4ebfc733b7a7266b6740d01c3ea0cca /document | |
parent | 9967338b1a3514830e92924d868046ee2cfc97db (diff) |
Always set document type repo during deserialization
Avoids edge case where repo is not set after deserializing
an empty document.
Diffstat (limited to 'document')
-rw-r--r-- | document/src/tests/serialization/vespadocumentserializer_test.cpp | 28 | ||||
-rw-r--r-- | document/src/vespa/document/serialization/vespadocumentdeserializer.cpp | 1 |
2 files changed, 29 insertions, 0 deletions
diff --git a/document/src/tests/serialization/vespadocumentserializer_test.cpp b/document/src/tests/serialization/vespadocumentserializer_test.cpp index 9da20e5a84c..57481666f28 100644 --- a/document/src/tests/serialization/vespadocumentserializer_test.cpp +++ b/document/src/tests/serialization/vespadocumentserializer_test.cpp @@ -956,6 +956,34 @@ TEST_F("ReferenceFieldValue with ID serialization matches Java", RefFixture) { f.verify_cross_language_serialization("reference_with_id", value); } +struct AssociatedDocumentRepoFixture { + const DocumentType& doc_type{repo.getDocumentType()}; + DocumentId doc_id{"doc::testdoc"}; + Document source_doc{doc_type, doc_id}; + + std::unique_ptr<Document> roundtrip_serialize_source_document() { + nbostream stream; + VespaDocumentSerializer serializer(stream); + serializer.write(source_doc); + + auto deserialized_doc = std::make_unique<Document>(); + VespaDocumentDeserializer deserializer(repo, stream, serialization_version); + deserializer.read(*deserialized_doc); + return deserialized_doc; + } +}; + +TEST_F("Deserializing non-empty document associates correct repo with document instance", AssociatedDocumentRepoFixture) { + f.source_doc.setValue(f.doc_type.getField("header field"), IntFieldValue(42)); + auto deserialized_doc = f.roundtrip_serialize_source_document(); + EXPECT_EQUAL(&doc_repo, deserialized_doc->getRepo()); +} + +TEST_F("Deserializing empty document associates correct repo with document instance", AssociatedDocumentRepoFixture) { + auto deserialized_doc = f.roundtrip_serialize_source_document(); + EXPECT_EQUAL(&doc_repo, deserialized_doc->getRepo()); +} + } // namespace TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/document/src/vespa/document/serialization/vespadocumentdeserializer.cpp b/document/src/vespa/document/serialization/vespadocumentdeserializer.cpp index 2b45e8a298c..0439d16c25d 100644 --- a/document/src/vespa/document/serialization/vespadocumentdeserializer.cpp +++ b/document/src/vespa/document/serialization/vespadocumentdeserializer.cpp @@ -85,6 +85,7 @@ void VespaDocumentDeserializer::readDocument(Document &value) { Document newDoc(*type, value.getId(), true); value.swap(newDoc); } + value.setRepo(_repo.getDocumentTypeRepo()); FixedTypeRepo repo(_repo.getDocumentTypeRepo(), value.getType()); VarScope<FixedTypeRepo> repo_scope(_repo, repo); |