summaryrefslogtreecommitdiffstats
path: root/jrt_test/src/tests/rpc-error
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /jrt_test/src/tests/rpc-error
Publish
Diffstat (limited to 'jrt_test/src/tests/rpc-error')
-rw-r--r--jrt_test/src/tests/rpc-error/.gitignore9
-rw-r--r--jrt_test/src/tests/rpc-error/CMakeLists.txt7
-rw-r--r--jrt_test/src/tests/rpc-error/DESC1
-rw-r--r--jrt_test/src/tests/rpc-error/FILES5
-rw-r--r--jrt_test/src/tests/rpc-error/TestErrors.java139
-rw-r--r--jrt_test/src/tests/rpc-error/dotest.sh45
-rw-r--r--jrt_test/src/tests/rpc-error/progdefs.sh3
-rwxr-xr-xjrt_test/src/tests/rpc-error/rpc-error_test.sh16
-rw-r--r--jrt_test/src/tests/rpc-error/test-errors.cpp168
9 files changed, 393 insertions, 0 deletions
diff --git a/jrt_test/src/tests/rpc-error/.gitignore b/jrt_test/src/tests/rpc-error/.gitignore
new file mode 100644
index 00000000000..96e67ef3ca7
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/.gitignore
@@ -0,0 +1,9 @@
+.depend
+Makefile
+TestErrors.class
+cpp_pid.txt
+java_pid.txt
+out.cppserver.1
+out.javaserver.1
+test-errors
+jrt_test_test-errors_app
diff --git a/jrt_test/src/tests/rpc-error/CMakeLists.txt b/jrt_test/src/tests/rpc-error/CMakeLists.txt
new file mode 100644
index 00000000000..9d144709dfc
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/CMakeLists.txt
@@ -0,0 +1,7 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(jrt_test_test-errors_app
+ SOURCES
+ test-errors.cpp
+ DEPENDS
+)
+vespa_add_test(NAME jrt_test_test-errors_app NO_VALGRIND COMMAND sh rpc-error_test.sh)
diff --git a/jrt_test/src/tests/rpc-error/DESC b/jrt_test/src/tests/rpc-error/DESC
new file mode 100644
index 00000000000..a9de538edd7
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/DESC
@@ -0,0 +1 @@
+Test that RPC errors are handled correctly when mixing cpp and java.
diff --git a/jrt_test/src/tests/rpc-error/FILES b/jrt_test/src/tests/rpc-error/FILES
new file mode 100644
index 00000000000..53c47eb425d
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/FILES
@@ -0,0 +1,5 @@
+dotest.sh
+TestErrors.java
+test-errors.cpp
+out.cppserver.1
+out.javaserver.1
diff --git a/jrt_test/src/tests/rpc-error/TestErrors.java b/jrt_test/src/tests/rpc-error/TestErrors.java
new file mode 100644
index 00000000000..cc25935141f
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/TestErrors.java
@@ -0,0 +1,139 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+import com.yahoo.jrt.*;
+
+
+public class TestErrors {
+
+ boolean error = false;
+ Supervisor client;
+ Target target;
+
+ public void init(String spec) {
+ client = new Supervisor(new Transport());
+ target = client.connect(new Spec(spec));
+ }
+
+ public void fini() {
+ target.close();
+ client.transport().shutdown().join();
+ if (!error) {
+ System.err.println("Conclusion: PASS");
+ } else {
+ System.err.println("Conclusion: FAIL");
+ System.exit(1);
+ }
+ }
+
+ public void assertTrue(boolean value) {
+ if (!value) {
+ Throwable tmp = new Throwable();
+ System.out.println("<ASSERT FAILED>");
+ tmp.printStackTrace();
+ error = true;
+ }
+ }
+
+ public void assertEquals(int e, int a) {
+ if (e != a) {
+ Throwable tmp = new Throwable();
+ System.out.println("<ASSERT FAILED>: expected <" + e +
+ ">, but was <" + a + ">");
+ tmp.printStackTrace();
+ error = true;
+ }
+ }
+
+ public void testNoError() {
+ Request req1 = new Request("test");
+ req1.parameters().add(new Int32Value(42));
+ req1.parameters().add(new Int32Value(0));
+ req1.parameters().add(new Int8Value((byte)0));
+ target.invokeSync(req1, 60.0);
+ assertTrue(!req1.isError());
+ assertEquals(1, req1.returnValues().size());
+ assertEquals(42, req1.returnValues().get(0).asInt32());
+ }
+
+ public void testNoSuchMethod() {
+ Request req1 = new Request("bogus");
+ target.invokeSync(req1, 60.0);
+ assertTrue(req1.isError());
+ assertEquals(0, req1.returnValues().size());
+ assertEquals(ErrorCode.NO_SUCH_METHOD, req1.errorCode());
+ }
+
+ public void testWrongParameters() {
+ Request req1 = new Request("test");
+ req1.parameters().add(new Int32Value(42));
+ req1.parameters().add(new Int32Value(0));
+ req1.parameters().add(new Int32Value(0));
+ target.invokeSync(req1, 60.0);
+ assertTrue(req1.isError());
+ assertEquals(0, req1.returnValues().size());
+ assertEquals(ErrorCode.WRONG_PARAMS, req1.errorCode());
+
+ Request req2 = new Request("test");
+ req2.parameters().add(new Int32Value(42));
+ req2.parameters().add(new Int32Value(0));
+ target.invokeSync(req2, 60.0);
+ assertTrue(req2.isError());
+ assertEquals(0, req2.returnValues().size());
+ assertEquals(ErrorCode.WRONG_PARAMS, req2.errorCode());
+
+ Request req3 = new Request("test");
+ req3.parameters().add(new Int32Value(42));
+ req3.parameters().add(new Int32Value(0));
+ req3.parameters().add(new Int8Value((byte)0));
+ req3.parameters().add(new Int8Value((byte)0));
+ target.invokeSync(req3, 60.0);
+ assertTrue(req3.isError());
+ assertEquals(0, req3.returnValues().size());
+ assertEquals(ErrorCode.WRONG_PARAMS, req3.errorCode());
+ }
+
+ public void testWrongReturnValues() {
+ Request req1 = new Request("test");
+ req1.parameters().add(new Int32Value(42));
+ req1.parameters().add(new Int32Value(0));
+ req1.parameters().add(new Int8Value((byte)1));
+ target.invokeSync(req1, 60.0);
+ assertTrue(req1.isError());
+ assertEquals(0, req1.returnValues().size());
+ assertEquals(ErrorCode.WRONG_RETURN, req1.errorCode());
+ }
+
+ public void testMethodFailed() {
+ Request req1 = new Request("test");
+ req1.parameters().add(new Int32Value(42));
+ req1.parameters().add(new Int32Value(75000));
+ req1.parameters().add(new Int8Value((byte)0));
+ target.invokeSync(req1, 60.0);
+ assertTrue(req1.isError());
+ assertEquals(0, req1.returnValues().size());
+ assertEquals(75000, req1.errorCode());
+
+ Request req2 = new Request("test");
+ req2.parameters().add(new Int32Value(42));
+ req2.parameters().add(new Int32Value(75000));
+ req2.parameters().add(new Int8Value((byte)1));
+ target.invokeSync(req2, 60.0);
+ assertTrue(req2.isError());
+ assertEquals(0, req2.returnValues().size());
+ assertEquals(75000, req2.errorCode());
+ }
+
+ public static void main(String[] args) {
+ if (args.length != 1) {
+ System.err.println("Usage: TestErrors spec");
+ System.exit(1);
+ }
+ TestErrors test = new TestErrors();
+ test.init(args[0]);
+ test.testNoError();
+ test.testNoSuchMethod();
+ test.testWrongParameters();
+ test.testWrongReturnValues();
+ test.testMethodFailed();
+ test.fini();
+ }
+}
diff --git a/jrt_test/src/tests/rpc-error/dotest.sh b/jrt_test/src/tests/rpc-error/dotest.sh
new file mode 100644
index 00000000000..2e37525857f
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/dotest.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+. ../../binref/env.sh
+
+STATUS=ok
+JAVA_PORT=$PORT_3
+CPP_PORT=$PORT_4
+
+export JAVA_PORT
+export CPP_PORT
+
+sh $BINREF/progctl.sh progdefs.sh start cppserver 1
+
+$BINREF/runjava PollRPCServer tcp/localhost:$CPP_PORT
+echo "CPP CLIENT <-> CPP SERVER"
+./jrt_test_test-errors_app tcp/localhost:$CPP_PORT
+if [ $? -ne 0 ]; then STATUS=fail; fi
+
+echo "JAVA CLIENT <-> CPP SERVER"
+$BINREF/runjava TestErrors tcp/localhost:$CPP_PORT
+if [ $? -ne 0 ]; then STATUS=fail; fi
+
+sh $BINREF/progctl.sh progdefs.sh stop cppserver 1
+
+
+sh $BINREF/progctl.sh progdefs.sh start javaserver 1
+
+$BINREF/runjava PollRPCServer tcp/localhost:$JAVA_PORT
+echo "CPP CLIENT <-> JAVA SERVER"
+./jrt_test_test-errors_app tcp/localhost:$JAVA_PORT
+if [ $? -ne 0 ]; then STATUS=fail; fi
+
+echo "JAVA CLIENT <-> JAVA SERVER"
+$BINREF/runjava TestErrors tcp/localhost:$JAVA_PORT
+if [ $? -ne 0 ]; then STATUS=fail; fi
+
+sh $BINREF/progctl.sh progdefs.sh stop javaserver 1
+
+if [ $STATUS = "ok" ]; then
+ echo "OK"
+else
+ echo "FAIL"
+ exit 1
+fi
diff --git a/jrt_test/src/tests/rpc-error/progdefs.sh b/jrt_test/src/tests/rpc-error/progdefs.sh
new file mode 100644
index 00000000000..815aa5a960e
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/progdefs.sh
@@ -0,0 +1,3 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+prog cppserver 1 "tcp/$CPP_PORT" "$BINREF/simpleserver"
+prog javaserver 1 "tcp/$JAVA_PORT" "$BINREF/runjava SimpleServer"
diff --git a/jrt_test/src/tests/rpc-error/rpc-error_test.sh b/jrt_test/src/tests/rpc-error/rpc-error_test.sh
new file mode 100755
index 00000000000..dc2f855acbd
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/rpc-error_test.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+. ../../binref/env.sh
+
+STATUS=ok
+JAVA_PORT=$PORT_3
+CPP_PORT=$PORT_4
+
+export JAVA_PORT
+export CPP_PORT
+
+$BINREF/compilejava TestErrors.java
+
+sh dotest.sh || (sh $BINREF/progctl.sh progdefs.sh stop all; false)
+sh $BINREF/progctl.sh progdefs.sh stop all
+
diff --git a/jrt_test/src/tests/rpc-error/test-errors.cpp b/jrt_test/src/tests/rpc-error/test-errors.cpp
new file mode 100644
index 00000000000..fd167b85085
--- /dev/null
+++ b/jrt_test/src/tests/rpc-error/test-errors.cpp
@@ -0,0 +1,168 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/fnet/frt/frt.h>
+
+
+class TestErrors : public vespalib::TestApp
+{
+private:
+ FRT_Supervisor *client;
+ FRT_Target *target;
+
+public:
+ void init(const char *spec) {
+ client = new FRT_Supervisor;
+ target = client->GetTarget(spec);
+ client->Start();
+ }
+
+ void fini() {
+ target->SubRef();
+ target = NULL;
+ client->ShutDown(true);
+ delete client;
+ client = NULL;
+ }
+
+ void testNoError();
+ void testNoSuchMethod();
+ void testWrongParameters();
+ void testWrongReturnValues();
+ void testMethodFailed();
+ int Main();
+};
+
+
+void
+TestErrors::testNoError()
+{
+ FRT_RPCRequest *req1 = client->AllocRPCRequest();
+ req1->SetMethodName("test");
+ req1->GetParams()->AddInt32(42);
+ req1->GetParams()->AddInt32(0);
+ req1->GetParams()->AddInt8(0);
+ target->InvokeSync(req1, 60.0);
+ EXPECT_TRUE(!req1->IsError());
+ if (EXPECT_TRUE(1 == req1->GetReturn()->GetNumValues())) {
+ EXPECT_TRUE(42 == req1->GetReturn()->GetValue(0)._intval32);
+ } else {
+ EXPECT_TRUE(false);
+ }
+ req1->SubRef();
+}
+
+
+void
+TestErrors::testNoSuchMethod()
+{
+ FRT_RPCRequest *req1 = client->AllocRPCRequest();
+ req1->SetMethodName("bogus");
+ target->InvokeSync(req1, 60.0);
+ EXPECT_TRUE(req1->IsError());
+ EXPECT_TRUE(0 == req1->GetReturn()->GetNumValues());
+ EXPECT_TRUE(FRTE_RPC_NO_SUCH_METHOD == req1->GetErrorCode());
+ req1->SubRef();
+}
+
+
+void
+TestErrors::testWrongParameters()
+{
+ FRT_RPCRequest *req1 = client->AllocRPCRequest();
+ req1->SetMethodName("test");
+ req1->GetParams()->AddInt32(42);
+ req1->GetParams()->AddInt32(0);
+ req1->GetParams()->AddInt32(0);
+ target->InvokeSync(req1, 60.0);
+ EXPECT_TRUE(req1->IsError());
+ EXPECT_TRUE(0 == req1->GetReturn()->GetNumValues());
+ EXPECT_TRUE(FRTE_RPC_WRONG_PARAMS == req1->GetErrorCode());
+ req1->SubRef();
+
+ FRT_RPCRequest *req2 = client->AllocRPCRequest();
+ req2->SetMethodName("test");
+ req2->GetParams()->AddInt32(42);
+ req2->GetParams()->AddInt32(0);
+ target->InvokeSync(req2, 60.0);
+ EXPECT_TRUE(req2->IsError());
+ EXPECT_TRUE(0 == req2->GetReturn()->GetNumValues());
+ EXPECT_TRUE(FRTE_RPC_WRONG_PARAMS == req2->GetErrorCode());
+ req2->SubRef();
+
+ FRT_RPCRequest *req3 = client->AllocRPCRequest();
+ req3->SetMethodName("test");
+ req3->GetParams()->AddInt32(42);
+ req3->GetParams()->AddInt32(0);
+ req3->GetParams()->AddInt8(0);
+ req3->GetParams()->AddInt8(0);
+ target->InvokeSync(req3, 60.0);
+ EXPECT_TRUE(req3->IsError());
+ EXPECT_TRUE(0 == req3->GetReturn()->GetNumValues());
+ EXPECT_TRUE(FRTE_RPC_WRONG_PARAMS == req3->GetErrorCode());
+ req3->SubRef();
+}
+
+
+void
+TestErrors::testWrongReturnValues()
+{
+ FRT_RPCRequest *req1 = client->AllocRPCRequest();
+ req1->SetMethodName("test");
+ req1->GetParams()->AddInt32(42);
+ req1->GetParams()->AddInt32(0);
+ req1->GetParams()->AddInt8(1);
+ target->InvokeSync(req1, 60.0);
+ EXPECT_TRUE(req1->IsError());
+ EXPECT_TRUE(0 == req1->GetReturn()->GetNumValues());
+ EXPECT_TRUE(FRTE_RPC_WRONG_RETURN == req1->GetErrorCode());
+ req1->SubRef();
+}
+
+
+void
+TestErrors::testMethodFailed()
+{
+ FRT_RPCRequest *req1 = client->AllocRPCRequest();
+ req1->SetMethodName("test");
+ req1->GetParams()->AddInt32(42);
+ req1->GetParams()->AddInt32(75000);
+ req1->GetParams()->AddInt8(0);
+ target->InvokeSync(req1, 60.0);
+ EXPECT_TRUE(req1->IsError());
+ EXPECT_TRUE(0 == req1->GetReturn()->GetNumValues());
+ EXPECT_TRUE(75000 == req1->GetErrorCode());
+ req1->SubRef();
+
+ FRT_RPCRequest *req2 = client->AllocRPCRequest();
+ req2->SetMethodName("test");
+ req2->GetParams()->AddInt32(42);
+ req2->GetParams()->AddInt32(75000);
+ req2->GetParams()->AddInt8(1);
+ target->InvokeSync(req2, 60.0);
+ EXPECT_TRUE(req2->IsError());
+ EXPECT_TRUE(0 == req2->GetReturn()->GetNumValues());
+ EXPECT_TRUE(75000 == req2->GetErrorCode());
+ req2->SubRef();
+}
+
+
+int
+TestErrors::Main()
+{
+ if (_argc != 2) {
+ fprintf(stderr, "usage: %s spec", _argv[0]);
+ return 1;
+ }
+ TEST_INIT("test_errors");
+ init(_argv[1]);
+ testNoError();
+ testNoSuchMethod();
+ testWrongParameters();
+ testWrongReturnValues();
+ testMethodFailed();
+ fini();
+ TEST_DONE();
+}
+
+
+TEST_APPHOOK(TestErrors);