diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /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/.gitignore | 9 | ||||
-rw-r--r-- | jrt_test/src/tests/rpc-error/CMakeLists.txt | 7 | ||||
-rw-r--r-- | jrt_test/src/tests/rpc-error/DESC | 1 | ||||
-rw-r--r-- | jrt_test/src/tests/rpc-error/FILES | 5 | ||||
-rw-r--r-- | jrt_test/src/tests/rpc-error/TestErrors.java | 139 | ||||
-rw-r--r-- | jrt_test/src/tests/rpc-error/dotest.sh | 45 | ||||
-rw-r--r-- | jrt_test/src/tests/rpc-error/progdefs.sh | 3 | ||||
-rwxr-xr-x | jrt_test/src/tests/rpc-error/rpc-error_test.sh | 16 | ||||
-rw-r--r-- | jrt_test/src/tests/rpc-error/test-errors.cpp | 168 |
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); |