diff options
Diffstat (limited to 'searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp')
-rw-r--r-- | searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp new file mode 100644 index 00000000000..6509491d0ac --- /dev/null +++ b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp @@ -0,0 +1,125 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/vespalib/testkit/test_kit.h> +#include <vespa/searchsummary/docsummary/docsumwriter.h> +#include <vespa/searchsummary/docsummary/resultpacker.h> +#include <vespa/searchlib/util/rawbuf.h> +#include <vespa/vespalib/data/slime/slime.h> +#include <vespa/vespalib/data/slime/simple_buffer.h> +#include <vespa/vespalib/data/slime/json_format.h> +#include <vespa/vespalib/data/slime/binary_format.h> +#include <vespa/searchlib/util/slime_output_raw_buf_adapter.h> + +using namespace vespalib::slime::convenience; +using namespace search::docsummary; + +namespace { + +struct FieldBlock { + Slime slime; + search::RawBuf binary; + + explicit FieldBlock(const vespalib::string &jsonInput) + : slime(), binary(1024) + { + size_t used = vespalib::slime::JsonFormat::decode(jsonInput, slime); + EXPECT_EQUAL(jsonInput.size(), used); + search::SlimeOutputRawBufAdapter adapter(binary); + vespalib::slime::BinaryFormat::encode(slime, adapter); + } + const char *data() const { return binary.GetDrainPos(); } + size_t dataLen() const { return binary.GetUsedLen(); } +}; + +struct DocsumFixture : IDocsumStore, GetDocsumsStateCallback { + std::unique_ptr<DynamicDocsumWriter> writer; + std::unique_ptr<ResultPacker> packer; + GetDocsumsState state; + DocsumFixture() : writer(), packer(), state(*this) { + ResultConfig *config = new ResultConfig(); + ResultClass *cfg = config->AddResultClass("default", 0); + EXPECT_TRUE(cfg != 0); + EXPECT_TRUE(cfg->AddConfigEntry("int_field", RES_INT)); + EXPECT_TRUE(cfg->AddConfigEntry("short_field", RES_SHORT)); + EXPECT_TRUE(cfg->AddConfigEntry("byte_field", RES_BYTE)); + EXPECT_TRUE(cfg->AddConfigEntry("float_field", RES_FLOAT)); + EXPECT_TRUE(cfg->AddConfigEntry("double_field", RES_DOUBLE)); + EXPECT_TRUE(cfg->AddConfigEntry("int64_field", RES_INT64)); + EXPECT_TRUE(cfg->AddConfigEntry("string_field", RES_STRING)); + EXPECT_TRUE(cfg->AddConfigEntry("data_field", RES_DATA)); + EXPECT_TRUE(cfg->AddConfigEntry("longstring_field", RES_LONG_STRING)); + EXPECT_TRUE(cfg->AddConfigEntry("longdata_field", RES_LONG_DATA)); + EXPECT_TRUE(cfg->AddConfigEntry("xmlstring_field", RES_XMLSTRING)); + EXPECT_TRUE(cfg->AddConfigEntry("jsonstring_field", RES_JSONSTRING)); + EXPECT_TRUE(cfg->AddConfigEntry("bad_jsonstring_field", RES_JSONSTRING)); + config->CreateEnumMaps(); + writer.reset(new DynamicDocsumWriter(config, 0)); + packer.reset(new ResultPacker(writer->GetResultConfig())); + state._args.setFlags(search::fs4transport::GDFLAG_ALLOW_SLIME); + } + void getDocsum(Slime &slime) { + uint32_t classId; + search::RawBuf buf(4096); + writer->WriteDocsum(1u, &state, this, &buf); + ASSERT_GREATER(buf.GetUsedLen(), sizeof(classId)); + memcpy(&classId, buf.GetDrainPos(), sizeof(classId)); + buf.Drain(sizeof(classId)); + EXPECT_EQUAL(classId, ::search::fs4transport::SLIME_MAGIC_ID); + EXPECT_GREATER(vespalib::slime::BinaryFormat + ::decode(Memory(buf.GetDrainPos(), buf.GetUsedLen()), slime), 0u); + } + virtual uint32_t getNumDocs() { return 2; } + virtual DocsumStoreValue getMappedDocsum(uint32_t docid, bool useSlimeInsideFields) { + EXPECT_EQUAL(true, useSlimeInsideFields); + EXPECT_EQUAL(1u, docid); + EXPECT_TRUE(packer->Init(0)); + EXPECT_TRUE(packer->AddInteger(4)); + EXPECT_TRUE(packer->AddShort(2)); + EXPECT_TRUE(packer->AddByte(1)); + EXPECT_TRUE(packer->AddFloat(4.5)); + EXPECT_TRUE(packer->AddDouble(8.75)); + EXPECT_TRUE(packer->AddInt64(8)); + EXPECT_TRUE(packer->AddString( "string", + strlen("string"))); + EXPECT_TRUE(packer->AddData( "data", + strlen("data"))); + EXPECT_TRUE(packer->AddLongString( "long_string", + strlen("long_string"))); + EXPECT_TRUE(packer->AddLongData( "long_data", + strlen("long_data"))); + EXPECT_TRUE(packer->AddLongString( "xml_string", + strlen("xml_string"))); + FieldBlock jsf1("{foo:1, bar:2}"); + EXPECT_TRUE(packer->AddLongData(jsf1.data(), jsf1.dataLen())); + EXPECT_TRUE(packer->AddLongString("abc", 3)); + const char *buf; + uint32_t len; + EXPECT_TRUE(packer->GetDocsumBlob(&buf, &len)); + return DocsumStoreValue(buf, len); + } + uint32_t getSummaryClassId() const override { return 0; } + virtual void FillSummaryFeatures(GetDocsumsState *, IDocsumEnvironment *) {} + virtual void FillRankFeatures(GetDocsumsState *, IDocsumEnvironment *) {} + virtual void ParseLocation(GetDocsumsState *) {} +}; + +} // namespace <unnamed> + +TEST_FF("require that docsum can be written as slime", DocsumFixture(), Slime()) { + f1.getDocsum(f2); + EXPECT_EQUAL(f2.get()["int_field"].asLong(), 4u); + EXPECT_EQUAL(f2.get()["short_field"].asLong(), 2u); + EXPECT_EQUAL(f2.get()["byte_field"].asLong(), 1u); + EXPECT_EQUAL(f2.get()["float_field"].asDouble(), 4.5); + EXPECT_EQUAL(f2.get()["double_field"].asDouble(), 8.75); + EXPECT_EQUAL(f2.get()["int64_field"].asLong(), 8u); + EXPECT_EQUAL(f2.get()["string_field"].asString().make_string(), std::string("string")); + EXPECT_EQUAL(f2.get()["data_field"].asData().make_string(), std::string("data")); + EXPECT_EQUAL(f2.get()["longstring_field"].asString().make_string(), std::string("long_string")); + EXPECT_EQUAL(f2.get()["longdata_field"].asData().make_string(), std::string("long_data")); + EXPECT_EQUAL(f2.get()["xmlstring_field"].asString().make_string(), std::string("xml_string")); + EXPECT_EQUAL(f2.get()["jsonstring_field"]["foo"].asLong(), 1u); + EXPECT_EQUAL(f2.get()["jsonstring_field"]["bar"].asLong(), 2u); + EXPECT_EQUAL(f2.get()["bad_jsonstring_field"].type().getId(), 0u); +} + +TEST_MAIN() { TEST_RUN_ALL(); } |