summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahoo-inc.com>2018-01-02 18:24:17 +0000
committerTor Brede Vekterli <vekterli@yahoo-inc.com>2018-01-03 10:36:08 +0000
commitf95d6e159d7e588668680585f3ca38f4295fee7d (patch)
treedda5d5f3d4ebfc733b7a7266b6740d01c3ea0cca /document
parent9967338b1a3514830e92924d868046ee2cfc97db (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.cpp28
-rw-r--r--document/src/vespa/document/serialization/vespadocumentdeserializer.cpp1
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);