aboutsummaryrefslogtreecommitdiffstats
path: root/slobrok/src/tests/multi/multi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'slobrok/src/tests/multi/multi.cpp')
-rw-r--r--slobrok/src/tests/multi/multi.cpp369
1 files changed, 369 insertions, 0 deletions
diff --git a/slobrok/src/tests/multi/multi.cpp b/slobrok/src/tests/multi/multi.cpp
new file mode 100644
index 00000000000..9a8a7eb41e0
--- /dev/null
+++ b/slobrok/src/tests/multi/multi.cpp
@@ -0,0 +1,369 @@
+// 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/fnet/frt/frt.h>
+#include <string>
+
+//-----------------------------------------------------------------------------
+
+class Server : public FRT_Invokable
+{
+private:
+ FRT_Supervisor _orb;
+ std::string _name;
+
+public:
+ Server(std::string name, int port);
+ ~Server();
+ void rpc_listNamesServed(FRT_RPCRequest *req);
+};
+
+
+Server::Server(std::string name, int port)
+ : _orb(),
+ _name(name)
+{
+ {
+ FRT_ReflectionBuilder rb(&_orb);
+ //---------------------------------------------------------------------
+ rb.DefineMethod("slobrok.callback.listNamesServed", "", "S", true,
+ FRT_METHOD(Server::rpc_listNamesServed), this);
+ rb.MethodDesc("Look up a rpcserver");
+ rb.ReturnDesc("names", "The rpcserver names on this server");
+ //---------------------------------------------------------------------
+ }
+ _orb.Listen(port);
+ _orb.Start();
+}
+
+
+void
+Server::rpc_listNamesServed(FRT_RPCRequest *req)
+{
+ FRT_Values &dst = *req->GetReturn();
+ FRT_StringValue *names = dst.AddStringArray(1);
+ dst.SetString(&names[0], _name.c_str());
+}
+
+
+Server::~Server()
+{
+ _orb.ShutDown(true);
+}
+
+//-----------------------------------------------------------------------------
+
+TEST("multi") {
+ FRT_Supervisor orb;
+ orb.Start();
+
+ FRT_Target *sb = orb.GetTarget(18511);
+ FRT_RPCRequest *req = NULL;
+
+ // test ping against slobrok
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("frt.rpc.ping");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+
+ // lookup '*' on empty slobrok
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("*");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 0);
+
+ // check managed servers on empty slobrok
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.internal.listManagedRpcServers");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 0);
+
+ Server a("A", 18518);
+
+ // register server A
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.registerRpcServer");
+ req->GetParams()->AddString("A");
+ req->GetParams()->AddString("tcp/localhost:18518");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+
+ // lookup '*' should give 'A'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("*");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 1);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 1);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(0)._string_array._pt[0]._str, "A") == 0);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(1)._string_array._pt[0]._str, "tcp/localhost:18518") == 0);
+
+ // lookup 'A' should give 'A'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("A");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 1);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 1);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(0)._string_array._pt[0]._str, "A") == 0);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(1)._string_array._pt[0]._str, "tcp/localhost:18518") == 0);
+
+ // lookup 'B' should give ''
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("B");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 0);
+
+ // lookup '*/*' should give ''
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("*/*");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 0);
+
+ {
+ Server b("B", 18519);
+
+ // register server B as 'C'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.registerRpcServer");
+ req->GetParams()->AddString("C");
+ req->GetParams()->AddString("tcp/localhost:18519");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(req->IsError());
+
+ // register server B
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.registerRpcServer");
+ req->GetParams()->AddString("B");
+ req->GetParams()->AddString("tcp/localhost:18519");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+
+ {
+ Server a2("A", 18520);
+
+ // register server A(2)
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.registerRpcServer");
+ req->GetParams()->AddString("A");
+ req->GetParams()->AddString("tcp/localhost:18520");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(req->IsError());
+ }
+
+ // lookup '*' should give 'AB | BA'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("*");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 2);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 2);
+ {
+ FRT_StringValue *name = req->GetReturn()->GetValue(0)._string_array._pt;
+ FRT_StringValue *spec = req->GetReturn()->GetValue(1)._string_array._pt;
+ if (strcmp(name[0]._str, "A") == 0) {
+ ASSERT_TRUE(strcmp(name[0]._str, "A") == 0);
+ ASSERT_TRUE(strcmp(name[1]._str, "B") == 0);
+ ASSERT_TRUE(strcmp(spec[0]._str, "tcp/localhost:18518") == 0);
+ ASSERT_TRUE(strcmp(spec[1]._str, "tcp/localhost:18519") == 0);
+ } else {
+ ASSERT_TRUE(strcmp(name[1]._str, "A") == 0);
+ ASSERT_TRUE(strcmp(name[0]._str, "B") == 0);
+ ASSERT_TRUE(strcmp(spec[1]._str, "tcp/localhost:18518") == 0);
+ ASSERT_TRUE(strcmp(spec[0]._str, "tcp/localhost:18519") == 0);
+ }
+ }
+ }
+
+ FastOS_Thread::Sleep(2000);
+
+ // lookup 'B' should give ''
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("B");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 0);
+
+ // unregister server A (wrong spec)
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.unregisterRpcServer");
+ req->GetParams()->AddString("A");
+ req->GetParams()->AddString("tcp/localhost:18519");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(req->IsError());
+
+ // lookup 'A' should give 'A'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("A");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 1);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 1);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(0)._string_array._pt[0]._str, "A") == 0);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(1)._string_array._pt[0]._str, "tcp/localhost:18518") == 0);
+
+ // unregister server A
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.unregisterRpcServer");
+ req->GetParams()->AddString("A");
+ req->GetParams()->AddString("tcp/localhost:18518");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+
+ // lookup 'A' should give ''
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("A");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 0);
+
+ // lookup '*' on empty slobrok
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("*");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 0);
+
+ // unregister server A on empty slobrok
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.unregisterRpcServer");
+ req->GetParams()->AddString("A");
+ req->GetParams()->AddString("tcp/localhost:18518");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+
+
+ FRT_Target *sb1 = orb.GetTarget(18512);
+ FRT_Target *sb2 = orb.GetTarget(18513);
+ FRT_Target *sb3 = orb.GetTarget(18514);
+ FRT_Target *sb4 = orb.GetTarget(18515);
+ FRT_Target *sb5 = orb.GetTarget(18516);
+ FRT_Target *sb6 = orb.GetTarget(18517);
+
+ // register server A
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.registerRpcServer");
+ req->GetParams()->AddString("A");
+ req->GetParams()->AddString("tcp/localhost:18518");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+
+
+ Server c("C", 18521);
+ Server d("D", 18522);
+
+ for (int i=0; i < 150; i++) {
+ // register server C
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.registerRpcServer");
+ req->GetParams()->AddString("C");
+ req->GetParams()->AddString("tcp/localhost:18521");
+ sb1->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+
+ // register server D
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.registerRpcServer");
+ req->GetParams()->AddString("D");
+ req->GetParams()->AddString("tcp/localhost:18522");
+ sb2->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+
+ // lookup 'C' should give 'C'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("C");
+ sb3->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 1);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 1);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(0)._string_array._pt[0]._str, "C") == 0);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(1)._string_array._pt[0]._str, "tcp/localhost:18521") == 0);
+
+ // lookup 'C' should give 'C'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("C");
+ sb4->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 1);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 1);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(0)._string_array._pt[0]._str, "C") == 0);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(1)._string_array._pt[0]._str, "tcp/localhost:18521") == 0);
+
+ // lookup 'C' should give 'C'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("C");
+ sb5->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 1);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 1);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(0)._string_array._pt[0]._str, "C") == 0);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(1)._string_array._pt[0]._str, "tcp/localhost:18521") == 0);
+
+ // lookup 'C' should give 'C'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("C");
+ sb6->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 1);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 1);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(0)._string_array._pt[0]._str, "C") == 0);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(1)._string_array._pt[0]._str, "tcp/localhost:18521") == 0);
+
+ FastOS_Thread::Sleep(200);
+
+ // lookup 'D' should give 'D'
+ req = orb.AllocRPCRequest(req);
+ req->SetMethodName("slobrok.lookupRpcServer");
+ req->GetParams()->AddString("D");
+ sb->InvokeSync(req, 5.0);
+ ASSERT_TRUE(!req->IsError());
+ ASSERT_TRUE(strcmp(req->GetReturnSpec(), "SS") == 0);
+ ASSERT_TRUE(req->GetReturn()->GetValue(0)._string_array._len == 1);
+ ASSERT_TRUE(req->GetReturn()->GetValue(1)._string_array._len == 1);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(0)._string_array._pt[0]._str, "D") == 0);
+ ASSERT_TRUE(strcmp(req->GetReturn()->GetValue(1)._string_array._pt[0]._str, "tcp/localhost:18522") == 0);
+ }
+
+ orb.ShutDown(true);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }