diff options
Diffstat (limited to 'documentapi/src/tests')
-rw-r--r-- | documentapi/src/tests/messages/messages60test.cpp | 42 | ||||
-rw-r--r-- | documentapi/src/tests/messages/testbase.cpp | 24 | ||||
-rw-r--r-- | documentapi/src/tests/messages/testbase.h | 9 |
3 files changed, 67 insertions, 8 deletions
diff --git a/documentapi/src/tests/messages/messages60test.cpp b/documentapi/src/tests/messages/messages60test.cpp index 258e8821e0c..93c7b5ef7cb 100644 --- a/documentapi/src/tests/messages/messages60test.cpp +++ b/documentapi/src/tests/messages/messages60test.cpp @@ -15,6 +15,17 @@ using document::DataType; using document::DocumentTypeRepo; +template <typename T> +struct Unwrap { + mbus::Routable::UP value; + const T *ptr = nullptr; + explicit Unwrap(mbus::Routable::UP value_in) : value(std::move(value_in)) { + ptr = dynamic_cast<T*>(value.get()); + ASSERT_TRUE(ptr != nullptr); + } + const T *operator->() const noexcept { return ptr; } +}; + /////////////////////////////////////////////////////////////////////////////// // // Setup @@ -399,10 +410,12 @@ Messages60Test::testPutDocumentMessage() EXPECT_EQUAL(sizeof(vespalib::string), sizeof(TestAndSetCondition)); EXPECT_EQUAL(112u, sizeof(DocumentMessage)); EXPECT_EQUAL(sizeof(TestAndSetCondition) + sizeof(DocumentMessage), sizeof(TestAndSetMessage)); - EXPECT_EQUAL(sizeof(TestAndSetMessage) + 24, sizeof(PutDocumentMessage)); + EXPECT_EQUAL(sizeof(TestAndSetMessage) + 32, sizeof(PutDocumentMessage)); + int size_of_create_if_non_existent_flag = 1; EXPECT_EQUAL(MESSAGE_BASE_LENGTH + 45u + - serializedLength(msg.getCondition().getSelection()), + serializedLength(msg.getCondition().getSelection()) + + size_of_create_if_non_existent_flag, serialize("PutDocumentMessage", msg)); for (uint32_t lang = 0; lang < NUM_LANGUAGES; ++lang) { @@ -413,11 +426,34 @@ Messages60Test::testPutDocumentMessage() EXPECT_EQUAL(msg.getDocument().getType().getName(), deserializedMsg.getDocument().getType().getName()); EXPECT_EQUAL(msg.getDocument().getId().toString(), deserializedMsg.getDocument().getId().toString()); EXPECT_EQUAL(msg.getTimestamp(), deserializedMsg.getTimestamp()); - EXPECT_EQUAL(71u, deserializedMsg.getApproxSize()); + EXPECT_EQUAL(72u, deserializedMsg.getApproxSize()); EXPECT_EQUAL(msg.getCondition().getSelection(), deserializedMsg.getCondition().getSelection()); + EXPECT_EQUAL(false, deserializedMsg.get_create_if_non_existent()); } } + //------------------------------------------------------------------------- + + PutDocumentMessage msg2(createDoc(getTypeRepo(), "testdoc", "id:ns:testdoc::")); + msg2.set_create_if_non_existent(true); + uint32_t expected_message_size = MESSAGE_BASE_LENGTH + 45u + + serializedLength(msg2.getCondition().getSelection()) + + size_of_create_if_non_existent_flag; + auto trunc1 = [](mbus::Blob x) noexcept { return truncate(std::move(x), 1); }; + auto pad1 = [](mbus::Blob x) noexcept { return pad(std::move(x), 1); }; + EXPECT_EQUAL(expected_message_size, serialize("PutDocumentMessage-create", msg2)); + EXPECT_EQUAL(expected_message_size - 1, serialize("PutDocumentMessage-create-truncate", msg2, trunc1)); + EXPECT_EQUAL(expected_message_size + 1, serialize("PutDocumentMessage-create-pad", msg2, pad1)); + + for (uint32_t lang = 0; lang < NUM_LANGUAGES; ++lang) { + auto decoded = Unwrap<PutDocumentMessage>(deserialize("PutDocumentMessage-create", DocumentProtocol::MESSAGE_PUTDOCUMENT, lang)); + auto decoded_trunc = Unwrap<PutDocumentMessage>(deserialize("PutDocumentMessage-create-truncate", DocumentProtocol::MESSAGE_PUTDOCUMENT, lang)); + auto decoded_pad = Unwrap<PutDocumentMessage>(deserialize("PutDocumentMessage-create-pad", DocumentProtocol::MESSAGE_PUTDOCUMENT, lang)); + EXPECT_EQUAL(true, decoded->get_create_if_non_existent()); + EXPECT_EQUAL(false, decoded_trunc->get_create_if_non_existent()); + EXPECT_EQUAL(true, decoded_pad->get_create_if_non_existent()); + } + return true; } diff --git a/documentapi/src/tests/messages/testbase.cpp b/documentapi/src/tests/messages/testbase.cpp index db2c08704e1..ddce9f82a5d 100644 --- a/documentapi/src/tests/messages/testbase.cpp +++ b/documentapi/src/tests/messages/testbase.cpp @@ -76,6 +76,24 @@ TestBase::putTest(uint32_t type, TEST_METHOD_PT test) return *this; } +mbus::Blob +TestBase::truncate(mbus::Blob data, size_t bytes) +{ + ASSERT_GREATER(data.size(), bytes); + mbus::Blob res(data.size() - bytes); + memcpy(res.data(), data.data(), res.size()); + return res; +} + +mbus::Blob +TestBase::pad(mbus::Blob data, size_t bytes) +{ + mbus::Blob res(data.size() + bytes); + memset(res.data(), 0, res.size()); + memcpy(res.data(), data.data(), data.size()); + return res; +} + bool TestBase::testCoverage(const std::vector<uint32_t> &expected, const std::vector<uint32_t> &actual, bool report) const { @@ -119,13 +137,13 @@ bool TestBase::file_content_is_unchanged(const string& filename, const mbus::Blo } uint32_t -TestBase::serialize(const string &filename, const mbus::Routable &routable) +TestBase::serialize(const string &filename, const mbus::Routable &routable, Tamper tamper) { const vespalib::Version version = getVersion(); string path = getPath(version.toString() + "-cpp-" + filename + ".dat"); LOG(info, "Serializing to '%s'..", path.c_str()); - mbus::Blob blob = _protocol.encode(version, routable); + mbus::Blob blob = tamper(_protocol.encode(version, routable)); if (file_content_is_unchanged(path, blob)) { LOG(info, "Serialization for '%s' is unchanged; not overwriting it", path.c_str()); } else if (!EXPECT_TRUE(writeFile(path, blob))) { @@ -213,5 +231,3 @@ TestBase::readFile(const string &filename) const return blob; } - - diff --git a/documentapi/src/tests/messages/testbase.h b/documentapi/src/tests/messages/testbase.h index bf384fc2fb9..a2cd5ee5649 100644 --- a/documentapi/src/tests/messages/testbase.h +++ b/documentapi/src/tests/messages/testbase.h @@ -43,13 +43,20 @@ protected: int Main() override; public: + using Tamper = std::function<mbus::Blob(mbus::Blob)>; + static mbus::Blob truncate(mbus::Blob data, size_t bytes); + static mbus::Blob pad(mbus::Blob data, size_t bytes); + const document::DocumentTypeRepo &getTypeRepo() { return *_repo; } std::shared_ptr<const document::DocumentTypeRepo> &getTypeRepoSp() { return _repo; } bool testCoverage(const std::vector<uint32_t> &expected, const std::vector<uint32_t> &actual, bool report = false) const; bool writeFile(const string &filename, const mbus::Blob& blob) const; mbus::Blob readFile(const string &filename) const; - uint32_t serialize(const string &filename, const mbus::Routable &routable); + uint32_t serialize(const string &filename, const mbus::Routable &routable, Tamper tamper); + uint32_t serialize(const string &filename, const mbus::Routable &routable) { + return serialize(filename, routable, [](auto x)noexcept{ return x; }); + } mbus::Routable::UP deserialize(const string &filename, uint32_t classId, uint32_t lang); void dump(const mbus::Blob &blob) const; |