diff options
Diffstat (limited to 'config/src/tests/frt')
-rw-r--r-- | config/src/tests/frt/frt.cpp | 190 |
1 files changed, 179 insertions, 11 deletions
diff --git a/config/src/tests/frt/frt.cpp b/config/src/tests/frt/frt.cpp index 5f4b7dee215..1fe91af885b 100644 --- a/config/src/tests/frt/frt.cpp +++ b/config/src/tests/frt/frt.cpp @@ -6,6 +6,10 @@ #include <vespa/config/common/configdefinition.h> #include <vespa/config/frt/connection.h> #include <vespa/config/frt/frtsource.h> +#include <vespa/config/frt/frtconfigresponse.h> +#include <vespa/config/frt/frtconfigrequest.h> +#include <vespa/config/frt/frtconfigrequestv2.h> +#include <vespa/config/frt/frtconfigresponsev2.h> #include <vespa/config/frt/frtconfigrequestv3.h> #include <vespa/config/frt/frtconfigresponsev3.h> #include <vespa/vespalib/data/slime/slime.h> @@ -228,27 +232,107 @@ namespace { TEST_F("require that empty config response does not validate", RPCFixture()) { - FRTConfigResponseV3 fail1(f1.createEmptyRequest()); + FRTConfigResponseV1 fail1(f1.createEmptyRequest()); ASSERT_FALSE(fail1.validateResponse()); ASSERT_FALSE(fail1.hasValidResponse()); ASSERT_TRUE(fail1.isError()); } TEST_F("require that response containing errors does not validate", RPCFixture()) { - FRTConfigResponseV3 fail1(f1.createErrorRequest()); + FRTConfigResponseV1 fail1(f1.createErrorRequest()); ASSERT_FALSE(fail1.validateResponse()); ASSERT_FALSE(fail1.hasValidResponse()); ASSERT_TRUE(fail1.isError()); ASSERT_TRUE(fail1.errorCode() != 0); } +TEST_F("require that valid response validates", RPCFixture()) { + std::vector<vespalib::string> vec; + vec.push_back("bar \"foo\""); + FRTConfigResponseV1 ok(f1.createOKResponse("foo", "baz", "bim", "boo", 12, 15, vec, "mn")); + ASSERT_TRUE(ok.validateResponse()); + ASSERT_TRUE(ok.hasValidResponse()); +} + TEST_F("require that response contains all values", RPCFixture()) { - FRTConfigResponseV3 ok(f1.createOKResponse("foo", "baz", "bim", "boo", 12, 15)); + FRTConfigResponseV1 ok(f1.createOKResponse("foo", "baz", "bim", "boo", 12, 15)); ASSERT_FALSE(ok.validateResponse()); ASSERT_FALSE(ok.hasValidResponse()); } -TEST_FF("require that request is config task is scheduled", SourceFixture(), FRTFixture(f1)) +TEST_F("require that valid response returns values after fill", RPCFixture()) { + std::vector<vespalib::string> vec; + vec.push_back("bar \"foo\""); + FRTConfigResponseV1 ok(f1.createOKResponse("foo", "baz", "bim", "boo", 12, 15, vec, "mn")); + ASSERT_TRUE(ok.validateResponse()); + ASSERT_TRUE(ok.hasValidResponse()); + + // Should not be valid + ASSERT_TRUE(ConfigKey() == ok.getKey()); + ASSERT_TRUE(ConfigValue() == ok.getValue()); + + ok.fill(); + ConfigKey key(ok.getKey()); + ASSERT_EQUAL("foo", key.getDefName()); + ASSERT_EQUAL("baz", key.getDefMd5()); + ASSERT_EQUAL("bim", key.getConfigId()); + ASSERT_EQUAL("mn", key.getDefNamespace()); + + ConfigValue value(ok.getValue()); + ASSERT_TRUE(vec == value.getLines()); +} + +TEST("require that request parameters are correctly initialized") { + ConnectionMock conn; + std::vector<vespalib::string> schema; + schema.push_back("foo"); + schema.push_back("bar"); + ConfigKey key("foo", "bar", "bim", "boo", schema); + FRTConfigRequestV1 frtReq(key, &conn, "mymd5", 1337, 8); + + FRT_RPCRequest * req = frtReq.getRequest(); + FRT_Values & params(*req->GetParams()); + ASSERT_EQUAL("bar", std::string(params[0]._string._str)); + ASSERT_EQUAL("", std::string(params[1]._string._str)); + ASSERT_EQUAL("boo", std::string(params[2]._string._str)); + ASSERT_EQUAL("foo", std::string(params[3]._string._str)); + ASSERT_EQUAL("mymd5", std::string(params[4]._string._str)); + ASSERT_EQUAL(1337u, params[5]._intval64); + ASSERT_EQUAL(8u, params[6]._intval64); + ASSERT_EQUAL("bim", std::string(params[7]._string._str)); + ASSERT_EQUAL(2u, params[8]._string_array._len); + ASSERT_EQUAL("foo", std::string(params[8]._string_array._pt[0]._str)); + ASSERT_EQUAL("bar", std::string(params[8]._string_array._pt[1]._str)); + ASSERT_EQUAL(1u, params[9]._intval32); +} + +TEST("require that request is aborted") { + MyAbortHandler handler; + ConnectionMock conn; + ConfigKey key("foo", "bar", "bim", "boo"); + FRTConfigRequestV1 frtReq(key, &conn, "mymd5", 1337, 8); + frtReq.getRequest()->SetAbortHandler(&handler); + ASSERT_FALSE(frtReq.isAborted()); + ASSERT_TRUE(frtReq.abort()); +} + +TEST_FF("require that request is invoked", SourceFixture(), + FRTFixture(f1)) +{ + f2.result.state = ConfigState("foo", 3); + f2.src.getConfig(); + ASSERT_TRUE(f2.src.getCurrentRequest().verifyKey(f1.key)); + ASSERT_FALSE(f2.src.getCurrentRequest().verifyKey(ConfigKey("foo", "bal", "bim", "boo", std::vector<vespalib::string>()))); + ASSERT_FALSE(f2.src.getCurrentRequest().verifyState(ConfigState("foo", 0))); + ASSERT_FALSE(f2.src.getCurrentRequest().verifyState(ConfigState("foo", 1))); + ASSERT_FALSE(f2.src.getCurrentRequest().verifyState(ConfigState("bar", 1))); + ASSERT_TRUE(f2.src.getCurrentRequest().verifyState(ConfigState("foo", 3))); + ASSERT_TRUE(f2.result.notified); + f2.src.close(); +} + +TEST_FF("require that request is config task is scheduled", SourceFixture(), + FRTFixture(f1)) { f2.src.getConfig(); ASSERT_TRUE(f2.result.notified); @@ -265,7 +349,7 @@ TEST_FF("require that request is config task is scheduled", SourceFixture(), FRT f2.src.close(); } -TEST("require that v3 request is correctly initialized") { +TEST("require that v2 request is correctly initialized") { ConnectionMock conn; ConfigKey key = ConfigKey::create<MyConfig>("foobi"); vespalib::string md5 = "mymd5"; @@ -275,13 +359,97 @@ TEST("require that v3 request is correctly initialized") { int64_t timeout = 3000; Trace traceIn(3); traceIn.trace(2, "Hei"); - FRTConfigRequestV3 v3req(&conn, key, md5, currentGeneration, wantedGeneration, hostName, - timeout, traceIn, VespaVersion::fromString("1.2.3"), CompressionType::LZ4); - ASSERT_TRUE(v3req.verifyState(ConfigState(md5, 3))); - ASSERT_FALSE(v3req.verifyState(ConfigState(md5, 2))); - ASSERT_FALSE(v3req.verifyState(ConfigState("xxx", 3))); - ASSERT_FALSE(v3req.verifyState(ConfigState("xxx", 2))); + FRTConfigRequestV2 v2req(&conn, key, md5, currentGeneration, wantedGeneration, hostName, timeout, traceIn); + ConfigDefinition origDef(MyConfig::CONFIG_DEF_SCHEMA); + FRT_RPCRequest * req = v2req.getRequest(); + ASSERT_TRUE(req != NULL); + FRT_Values & params(*req->GetParams()); + std::string json(params[0]._string._str); + Slime slime; + JsonFormat::decode(Memory(json), slime); + Inspector & root(slime.get()); + EXPECT_EQUAL(2, root[REQUEST_VERSION].asLong()); + EXPECT_EQUAL(key.getDefName(), root[REQUEST_DEF_NAME].asString().make_string()); + EXPECT_EQUAL(key.getDefNamespace(), root[REQUEST_DEF_NAMESPACE].asString().make_string()); + EXPECT_EQUAL(key.getDefMd5(), root[REQUEST_DEF_MD5].asString().make_string()); + EXPECT_EQUAL(key.getConfigId(), root[REQUEST_CLIENT_CONFIGID].asString().make_string()); + EXPECT_EQUAL(hostName, root[REQUEST_CLIENT_HOSTNAME].asString().make_string()); + EXPECT_EQUAL(currentGeneration, root[REQUEST_CURRENT_GENERATION].asLong()); + EXPECT_EQUAL(wantedGeneration, root[REQUEST_WANTED_GENERATION].asLong()); + EXPECT_EQUAL(md5, root[REQUEST_CONFIG_MD5].asString().make_string()); + EXPECT_EQUAL(timeout, root[REQUEST_TIMEOUT].asLong()); + Trace trace; + trace.deserialize(root[REQUEST_TRACE]); + EXPECT_TRUE(trace.shouldTrace(2)); + EXPECT_TRUE(trace.shouldTrace(3)); + EXPECT_FALSE(trace.shouldTrace(4)); + EXPECT_EQUAL(timeout, root[REQUEST_TIMEOUT].asLong()); + ConfigDefinition def; + def.deserialize(root[REQUEST_DEF_CONTENT]); + EXPECT_EQUAL(origDef.asString(), def.asString()); + ConfigResponse::UP response(v2req.createResponse(req)); + req->GetReturn()->AddString("foobar"); + EXPECT_TRUE(response->validateResponse()); +} + +TEST("require that v2 reponse is correctly initialized") { + ConnectionMock conn; + Slime slime; + ConfigKey key = ConfigKey::create<MyConfig>("foobi"); + vespalib::string md5 = "mymd5"; + int64_t generation = 3; + vespalib::string hostname = "myhhost"; + Trace traceIn(3); + traceIn.trace(2, "Hei!"); + Cursor & root(slime.setObject()); + root.setLong(RESPONSE_VERSION, 2ul); + root.setString(RESPONSE_DEF_NAME, Memory(key.getDefName())); + root.setString(RESPONSE_DEF_NAMESPACE, Memory(key.getDefNamespace())); + root.setString(RESPONSE_DEF_MD5, Memory(key.getDefMd5())); + root.setString(RESPONSE_CONFIGID, Memory(key.getConfigId())); + root.setString(RESPONSE_CLIENT_HOSTNAME, Memory(hostname)); + root.setString(RESPONSE_CONFIG_MD5, Memory(md5)); + root.setLong(RESPONSE_CONFIG_GENERATION, generation); + traceIn.serialize(root.setObject(RESPONSE_TRACE)); + Cursor & payload(root.setObject(RESPONSE_PAYLOAD)); + payload.setString("myField", "foobiar"); + SimpleBuffer buf; + JsonFormat::encode(slime, buf, true); + FRT_RPCRequest * req = conn.allocRPCRequest(); + req->GetReturn()->AddString(buf.get().make_string().c_str()); + FRTConfigResponseV2 response(req); + ASSERT_TRUE(response.validateResponse()); + response.fill(); + Trace trace(response.getTrace()); + EXPECT_TRUE(trace.shouldTrace(3)); + EXPECT_FALSE(trace.shouldTrace(4)); + ConfigKey responseKey(response.getKey()); + EXPECT_EQUAL(key.getDefName(), responseKey.getDefName()); + EXPECT_EQUAL(key.getDefNamespace(), responseKey.getDefNamespace()); + EXPECT_EQUAL(key.getDefMd5(), responseKey.getDefMd5()); + EXPECT_EQUAL(key.getConfigId(), responseKey.getConfigId()); + EXPECT_EQUAL(hostname, response.getHostName()); + ConfigState state(response.getConfigState()); + EXPECT_EQUAL(md5, state.md5); + EXPECT_EQUAL(generation, state.generation); + ConfigValue value(response.getValue()); + MyConfig::UP config(value.newInstance<MyConfig>()); + EXPECT_EQUAL("foobiar", config->myField); + req->SubRef(); +} + +TEST("require that v3 request is correctly initialized") { + ConnectionMock conn; + ConfigKey key = ConfigKey::create<MyConfig>("foobi"); + vespalib::string md5 = "mymd5"; + int64_t currentGeneration = 3; + int64_t wantedGeneration = 4; + vespalib::string hostName = "myhost"; + int64_t timeout = 3000; + Trace traceIn(3); + traceIn.trace(2, "Hei"); + FRTConfigRequestV3 v3req(&conn, key, md5, currentGeneration, wantedGeneration, hostName, timeout, traceIn, VespaVersion::fromString("1.2.3"), CompressionType::LZ4); ConfigDefinition origDef(MyConfig::CONFIG_DEF_SCHEMA); FRT_RPCRequest * req = v3req.getRequest(); |