You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2019/11/20 17:38:22 UTC
[tinkerpop] branch travis-fix updated: Isolate the single failing
test - cmon
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a commit to branch travis-fix
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
View the commit online:
https://github.com/apache/tinkerpop/commit/aae0ed7a85e0b4e4cdac18d1ea1ae92427a460f7
The following commit(s) were added to refs/heads/travis-fix by this push:
new aae0ed7 Isolate the single failing test - cmon
aae0ed7 is described below
commit aae0ed7a85e0b4e4cdac18d1ea1ae92427a460f7
Author: stephen <sp...@gmail.com>
AuthorDate: Wed Nov 20 12:37:56 2019 -0500
Isolate the single failing test - cmon
---
.../gremlin/server/GremlinServerIntegrateTest.java | 1826 ++++++++++----------
1 file changed, 913 insertions(+), 913 deletions(-)
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
index cbb1f1f..5ef922a 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
@@ -236,654 +236,654 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
return scriptEngineConf;
}
- @Test
- public void shouldScriptEvaluationErrorForRemoteTraversal() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
-
- try {
- // tests bad lambda
- g.inject(1).sideEffect(Lambda.consumer("(")).iterate();
- fail("This traversal should not have executed since lambda can't be compiled");
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat(t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION, ((ResponseException) t).getResponseStatusCode());
- }
-
- // make a graph with a cycle in it to force a long run traversal
- graphGetter.get().traversal().addV("person").as("p").addE("self").to("p").iterate();
-
- try {
- // tests an "unending" traversal
- g.V().repeat(__.out()).until(__.outE().count().is(0)).iterate();
- fail("This traversal should have timed out");
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat(t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
- }
- }
-
- @Test
- public void shouldCloseChannelIfClientDoesntRespond() throws Exception {
- final SimpleClient client = TestClientFactory.createWebSocketClient();
- client.submit("1+1");
-
- // since we do nothing for 2 seconds and the time limit for timeout on the server is 1 second, the server
- // will autoclose the channel
- Thread.sleep(2000);
-
- assertThat(recordingAppender.logContainsAny(".*Closing channel - client is disconnected after idle period of .*$"), is(true));
-
- client.close();
- }
-
- @Test
- public void shouldPingChannelIfClientDies() throws Exception {
- final Client client = TestClientFactory.build().maxConnectionPoolSize(1).minConnectionPoolSize(1).keepAliveInterval(0).create().connect();
- client.submit("1+1").all().get();
-
- // since we do nothing for 3 seconds and the time limit for ping is 1 second we should get *about* 3 pings -
- // i don't think the assertion needs to be too accurate. just need to make sure there's a ping message out
- // there record
- Thread.sleep(3000);
-
- client.close();
-
- // stop the server to be sure that logs flush
- stopServer();
-
- assertThat(recordingAppender.logContainsAny(".*Checking channel - sending ping to client after idle period of .*$"), is(true));
- }
-
- @Test
- public void shouldTimeOutRemoteTraversal() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
-
- try {
- // tests sleeping thread
- g.inject(1).sideEffect(Lambda.consumer("Thread.sleep(10000)")).iterate();
- fail("This traversal should have timed out");
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat(t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
- }
-
- // make a graph with a cycle in it to force a long run traversal
- graphGetter.get().traversal().addV("person").as("p").addE("self").to("p").iterate();
-
- try {
- // tests an "unending" traversal
- g.V().repeat(__.out()).until(__.outE().count().is(0)).iterate();
- fail("This traversal should have timed out");
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat(t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
- }
- }
-
- @Test
- public void shouldTimeOutRemoteTraversalUsingDeprecatedConfiguration() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
-
- try {
- // tests sleeping thread
- g.inject(1).sideEffect(Lambda.consumer("Thread.sleep(10000)")).iterate();
- fail("This traversal should have timed out");
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat(t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
- }
-
- // make a graph with a cycle in it to force a long run traversal
- graphGetter.get().traversal().addV("person").as("p").addE("self").to("p").iterate();
-
- try {
- // tests an "unending" traversal
- g.V().repeat(__.out()).until(__.outE().count().is(0)).iterate();
- fail("This traversal should have timed out");
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat(t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
- }
- }
-
- @Test
- public void shouldTimeOutRemoteTraversalWithPerRequestOption() {
- final GraphTraversalSource g = traversal().withRemote(conf);
-
- try {
- // tests sleeping thread
- g.with(ARGS_SCRIPT_EVAL_TIMEOUT, 500L).inject(1).sideEffect(Lambda.consumer("Thread.sleep(10000)")).iterate();
- fail("This traversal should have timed out");
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat(t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
- }
-
- // make a graph with a cycle in it to force a long run traversal
- graphGetter.get().traversal().addV("person").as("p").addE("self").to("p").iterate();
-
- try {
- // tests an "unending" traversal
- g.with(ARGS_SCRIPT_EVAL_TIMEOUT, 500L).V().repeat(__.out()).until(__.outE().count().is(0)).iterate();
- fail("This traversal should have timed out");
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat(t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
- }
- }
-
- @Test
- public void shouldProduceProperExceptionOnTimeout() throws Exception {
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect(name.getMethodName());
-
- boolean success = false;
- // Run a short test script a few times with progressively longer timeouts.
- // Each submissions should either succeed or fail with a timeout.
- // Note: the range of timeouts is intended to cover the case when the script finishes at about the
- // same time when the timeout occurs. In this situation either a timeout response or a successful
- // response is acceptable, however no other processing errors should occur.
- // Note: the timeout of 30 ms is generally sufficient for running a simple groovy script, so using longer
- // timeouts are not likely to results in a success/timeout response collision, which is the purpose
- // of this test.
- // Note: this test may have a false negative result, but a failure would indicate a real problem.
- for(int i = 0; i < 30; i++) {
- int timeout = 1 + i;
- overrideEvaluationTimeout(timeout);
-
- try {
- client.submit("x = 1 + 1").all().get().get(0).getInt();
- success = true;
- } catch (Exception ex) {
- final Throwable t = ex.getCause();
- assertThat("Unexpected exception with script evaluation timeout: " + timeout, t, instanceOf(ResponseException.class));
- assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
- }
- }
-
- assertTrue("Some script submissions should succeed", success);
-
- cluster.close();
- }
-
- @Test
- public void shouldUseBaseScript() throws Exception {
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect(name.getMethodName());
-
- assertEquals("hello, stephen", client.submit("hello('stephen')").all().get().get(0).getString());
-
- cluster.close();
- }
-
- @Test
- public void shouldUseInterpreterMode() throws Exception {
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect(name.getMethodName());
-
- client.submit("def subtractAway(x,y){x-y};[]").all().get();
- client.submit("multiplyIt = { x,y -> x * y};[]").all().get();
-
- assertEquals(2, client.submit("x = 1 + 1").all().get().get(0).getInt());
- assertEquals(3, client.submit("int y = x + 1").all().get().get(0).getInt());
- assertEquals(5, client.submit("def z = x + y").all().get().get(0).getInt());
-
- final Map<String,Object> m = new HashMap<>();
- m.put("x", 10);
- assertEquals(-5, client.submit("z - x", m).all().get().get(0).getInt());
- assertEquals(15, client.submit("addItUp(x,z)", m).all().get().get(0).getInt());
- assertEquals(5, client.submit("subtractAway(x,z)", m).all().get().get(0).getInt());
- assertEquals(50, client.submit("multiplyIt(x,z)", m).all().get().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldNotUseInterpreterMode() throws Exception {
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect(name.getMethodName());
-
- client.submit("def subtractAway(x,y){x-y};[]").all().get();
- client.submit("multiplyIt = { x,y -> x * y};[]").all().get();
-
- assertEquals(2, client.submit("x = 1 + 1").all().get().get(0).getInt());
- assertEquals(3, client.submit("y = x + 1").all().get().get(0).getInt());
- assertEquals(5, client.submit("z = x + y").all().get().get(0).getInt());
-
- final Map<String,Object> m = new HashMap<>();
- m.put("x", 10);
- assertEquals(-5, client.submit("z - x", m).all().get().get(0).getInt());
- assertEquals(15, client.submit("addItUp(x,z)", m).all().get().get(0).getInt());
- assertEquals(5, client.submit("subtractAway(x,z)", m).all().get().get(0).getInt());
- assertEquals(50, client.submit("multiplyIt(x,z)", m).all().get().get(0).getInt());
-
- cluster.close();
- }
-
- @Test
- public void shouldUseSimpleSandbox() throws Exception {
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect();
-
- assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
-
- try {
- // this should return "nothing" - there should be no exception
- client.submit("java.lang.System.exit(0)").all().get();
- fail("The above should not have executed in any successful way as sandboxing is enabled");
- } catch (Exception ex) {
- assertThat(ex.getCause().getMessage(), containsString("[Static type checking] - Not authorized to call this method: java.lang.System#exit(int)"));
- } finally {
- cluster.close();
- }
- }
-
- @Test
- public void shouldRespectHighWaterMarkSettingAndSucceed() throws Exception {
- // the highwatermark should get exceeded on the server and thus pause the writes, but have no problem catching
- // itself up - this is a tricky tests to get passing on all environments so this assumption will deny the
- // test for most cases
- TestHelper.assumeNonDeterministic();
-
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect();
-
- try {
- final int resultCountToGenerate = 1000;
- final int batchSize = 3;
- final String fatty = IntStream.range(0, 175).mapToObj(String::valueOf).collect(Collectors.joining());
- final String fattyX = "['" + fatty + "'] * " + resultCountToGenerate;
-
- // don't allow the thread to proceed until all results are accounted for
- final CountDownLatch latch = new CountDownLatch(resultCountToGenerate);
- final AtomicBoolean expected = new AtomicBoolean(false);
- final AtomicBoolean faulty = new AtomicBoolean(false);
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_BATCH_SIZE, batchSize)
- .addArg(Tokens.ARGS_GREMLIN, fattyX).create();
-
- client.submitAsync(request).thenAcceptAsync(r -> {
- r.stream().forEach(item -> {
- try {
- final String aFattyResult = item.getString();
- expected.set(aFattyResult.equals(fatty));
- } catch (Exception ex) {
- ex.printStackTrace();
- faulty.set(true);
- } finally {
- latch.countDown();
- }
- });
- });
-
- assertThat(latch.await(30000, TimeUnit.MILLISECONDS), is(true));
- assertEquals(0, latch.getCount());
- assertThat(faulty.get(), is(false));
- assertThat(expected.get(), is(true));
-
- assertThat(recordingAppender.getMessages().stream().anyMatch(m -> m.contains("Pausing response writing as writeBufferHighWaterMark exceeded on")), is(true));
- } catch (Exception ex) {
- fail("Shouldn't have tossed an exception");
- } finally {
- cluster.close();
- }
- }
-
- @Test
- public void shouldReturnInvalidRequestArgsWhenGremlinArgIsNotSupplied() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL).create();
- final ResponseMessage result = client.submit(request).get(0);
- assertThat(result.getStatus().getCode(), is(not(ResponseStatusCode.PARTIAL_CONTENT)));
- assertEquals(result.getStatus().getCode(), ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS);
- }
- }
-
- @Test
- public void shouldReturnInvalidRequestArgsWhenInvalidReservedBindingKeyIsUsed() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final Map<String, Object> bindings = new HashMap<>();
- bindings.put(T.id.getAccessor(), "123");
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "[1,2,3,4,5,6,7,8,9,0]")
- .addArg(Tokens.ARGS_BINDINGS, bindings).create();
- final CountDownLatch latch = new CountDownLatch(1);
- final AtomicBoolean pass = new AtomicBoolean(false);
- client.submit(request, result -> {
- if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
- pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
- latch.countDown();
- }
- });
-
- if (!latch.await(3000, TimeUnit.MILLISECONDS))
- fail("Request should have returned error, but instead timed out");
- assertThat(pass.get(), is(true));
- }
-
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final Map<String, Object> bindings = new HashMap<>();
- bindings.put("id", "123");
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "[1,2,3,4,5,6,7,8,9,0]")
- .addArg(Tokens.ARGS_BINDINGS, bindings).create();
- final CountDownLatch latch = new CountDownLatch(1);
- final AtomicBoolean pass = new AtomicBoolean(false);
- client.submit(request, result -> {
- if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
- pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
- latch.countDown();
- }
- });
-
- if (!latch.await(3000, TimeUnit.MILLISECONDS))
- fail("Request should have returned error, but instead timed out");
- assertTrue(pass.get());
- }
- }
-
- @Test
- public void shouldReturnInvalidRequestArgsWhenInvalidTypeBindingKeyIsUsed() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final Map<Object, Object> bindings = new HashMap<>();
- bindings.put(1, "123");
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "[1,2,3,4,5,6,7,8,9,0]")
- .addArg(Tokens.ARGS_BINDINGS, bindings).create();
- final CountDownLatch latch = new CountDownLatch(1);
- final AtomicBoolean pass = new AtomicBoolean(false);
- client.submit(request, result -> {
- if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
- pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
- latch.countDown();
- }
- });
-
- if (!latch.await(3000, TimeUnit.MILLISECONDS))
- fail("Request should have returned error, but instead timed out");
- assertThat(pass.get(), is(true));
- }
- }
-
- @Test
- public void shouldReturnInvalidRequestArgsWhenBindingCountExceedsAllowable() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final Map<Object, Object> bindings = new HashMap<>();
- bindings.put("x", 123);
- bindings.put("y", 123);
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "x+y")
- .addArg(Tokens.ARGS_BINDINGS, bindings).create();
- final CountDownLatch latch = new CountDownLatch(1);
- final AtomicBoolean pass = new AtomicBoolean(false);
- client.submit(request, result -> {
- if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
- pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
- latch.countDown();
- }
- });
-
- if (!latch.await(3000, TimeUnit.MILLISECONDS))
- fail("Request should have returned error, but instead timed out");
- assertThat(pass.get(), is(true));
- }
-
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final Map<Object, Object> bindings = new HashMap<>();
- bindings.put("x", 123);
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "x+123")
- .addArg(Tokens.ARGS_BINDINGS, bindings).create();
- final CountDownLatch latch = new CountDownLatch(1);
- final AtomicBoolean pass = new AtomicBoolean(false);
- client.submit(request, result -> {
- if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
- pass.set(ResponseStatusCode.SUCCESS == result.getStatus().getCode() && (((int) ((List) result.getResult().getData()).get(0) == 246)));
- latch.countDown();
- }
- });
-
- if (!latch.await(3000, TimeUnit.MILLISECONDS))
- fail("Request should have returned error, but instead timed out");
- assertThat(pass.get(), is(true));
- }
- }
-
- @Test
- public void shouldReturnInvalidRequestArgsWhenInvalidNullBindingKeyIsUsed() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final Map<String, Object> bindings = new HashMap<>();
- bindings.put(null, "123");
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "[1,2,3,4,5,6,7,8,9,0]")
- .addArg(Tokens.ARGS_BINDINGS, bindings).create();
- final CountDownLatch latch = new CountDownLatch(1);
- final AtomicBoolean pass = new AtomicBoolean(false);
- client.submit(request, result -> {
- if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
- pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
- latch.countDown();
- }
- });
-
- if (!latch.await(3000, TimeUnit.MILLISECONDS))
- fail("Request should have returned error, but instead timed out");
- assertThat(pass.get(), is(true));
- }
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void shouldBatchResultsByTwos() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "[0,1,2,3,4,5,6,7,8,9]").create();
-
- final List<ResponseMessage> msgs = client.submit(request);
- assertEquals(5, client.submit(request).size());
- assertEquals(0, ((List<Integer>) msgs.get(0).getResult().getData()).get(0).intValue());
- assertEquals(1, ((List<Integer>) msgs.get(0).getResult().getData()).get(1).intValue());
- assertEquals(2, ((List<Integer>) msgs.get(1).getResult().getData()).get(0).intValue());
- assertEquals(3, ((List<Integer>) msgs.get(1).getResult().getData()).get(1).intValue());
- assertEquals(4, ((List<Integer>) msgs.get(2).getResult().getData()).get(0).intValue());
- assertEquals(5, ((List<Integer>) msgs.get(2).getResult().getData()).get(1).intValue());
- assertEquals(6, ((List<Integer>) msgs.get(3).getResult().getData()).get(0).intValue());
- assertEquals(7, ((List<Integer>) msgs.get(3).getResult().getData()).get(1).intValue());
- assertEquals(8, ((List<Integer>) msgs.get(4).getResult().getData()).get(0).intValue());
- assertEquals(9, ((List<Integer>) msgs.get(4).getResult().getData()).get(1).intValue());
- }
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void shouldBatchResultsByOnesByOverridingFromClientSide() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "[0,1,2,3,4,5,6,7,8,9]")
- .addArg(Tokens.ARGS_BATCH_SIZE, 1).create();
-
- final List<ResponseMessage> msgs = client.submit(request);
- assertEquals(10, msgs.size());
- IntStream.rangeClosed(0, 9).forEach(i -> assertEquals(i, ((List<Integer>) msgs.get(i).getResult().getData()).get(0).intValue()));
- }
- }
-
- @Test
- public void shouldNotThrowNoSuchElementException() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()){
- // this should return "nothing" - there should be no exception
- final List<ResponseMessage> responses = client.submit("g.V().has('name','kadfjaldjfla')");
- assertNull(responses.get(0).getResult().getData());
- }
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void shouldReceiveFailureTimeOutOnScriptEval() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()){
- final List<ResponseMessage> responses = client.submit("Thread.sleep(3000);'some-stuff-that-should not return'");
- assertThat(responses.get(0).getStatus().getMessage(), startsWith("Evaluation exceeded the configured 'evaluationTimeout' threshold of 1000 ms"));
-
- // validate that we can still send messages to the server
- assertEquals(2, ((List<Integer>) client.submit("1+1").get(0).getResult().getData()).get(0).intValue());
- }
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void shouldReceiveFailureTimeOutOnScriptEvalUsingOverride() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final RequestMessage msg = RequestMessage.build("eval")
- .addArg(ARGS_SCRIPT_EVAL_TIMEOUT, 100L)
- .addArg(Tokens.ARGS_GREMLIN, "Thread.sleep(3000);'some-stuff-that-should not return'")
- .create();
- final List<ResponseMessage> responses = client.submit(msg);
- assertThat(responses.get(0).getStatus().getMessage(), startsWith("Evaluation exceeded the configured 'evaluationTimeout' threshold of 100 ms"));
-
- // validate that we can still send messages to the server
- assertEquals(2, ((List<Integer>) client.submit("1+1").get(0).getResult().getData()).get(0).intValue());
- }
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void shouldReceiveFailureTimeOutOnEvalUsingOverride() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final RequestMessage msg = RequestMessage.build("eval")
- .addArg(Tokens.ARGS_EVAL_TIMEOUT, 100L)
- .addArg(Tokens.ARGS_GREMLIN, "Thread.sleep(3000);'some-stuff-that-should not return'")
- .create();
- final List<ResponseMessage> responses = client.submit(msg);
- assertThat(responses.get(0).getStatus().getMessage(), startsWith("Evaluation exceeded the configured 'evaluationTimeout' threshold of 100 ms"));
-
- // validate that we can still send messages to the server
- assertEquals(2, ((List<Integer>) client.submit("1+1").get(0).getResult().getData()).get(0).intValue());
- }
- }
-
- @Test
- public void shouldReceiveFailureTimeOutOnScriptEvalOfOutOfControlLoop() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()){
- // timeout configured for 1 second so the timed interrupt should trigger prior to the
- // evaluationTimeout which is at 30 seconds by default
- final List<ResponseMessage> responses = client.submit("while(true){}");
- assertThat(responses.get(0).getStatus().getMessage(), startsWith("Timeout during script evaluation triggered by TimedInterruptCustomizerProvider"));
-
- // validate that we can still send messages to the server
- assertEquals(2, ((List<Integer>) client.submit("1+1").get(0).getResult().getData()).get(0).intValue());
- }
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void shouldLoadInitScript() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()){
- assertEquals(2, ((List<Integer>) client.submit("addItUp(1,1)").get(0).getResult().getData()).get(0).intValue());
- }
- }
-
- @Test
- public void shouldGarbageCollectPhantomButNotHard() throws Exception {
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect();
-
- assertEquals(2, client.submit("addItUp(1,1)").all().join().get(0).getInt());
- assertEquals(0, client.submit("def subtract(x,y){x-y};subtract(1,1)").all().join().get(0).getInt());
- assertEquals(0, client.submit("subtract(1,1)").all().join().get(0).getInt());
-
- final Map<String, Object> bindings = new HashMap<>();
- bindings.put(GremlinGroovyScriptEngine.KEY_REFERENCE_TYPE, GremlinGroovyScriptEngine.REFERENCE_TYPE_PHANTOM);
- assertEquals(4, client.submit("def multiply(x,y){x*y};multiply(2,2)", bindings).all().join().get(0).getInt());
-
- try {
- client.submit("multiply(2,2)").all().join().get(0).getInt();
- fail("Should throw an exception since reference is phantom.");
- } catch (RuntimeException ignored) {
-
- } finally {
- cluster.close();
- }
- }
-
- @Test
- public void shouldReceiveFailureOnBadGraphSONSerialization() throws Exception {
- final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V3D0).create();
- final Client client = cluster.connect();
-
- try {
- client.submit("def class C { def C getC(){return this}}; new C()").all().join();
- fail("Should throw an exception.");
- } catch (RuntimeException re) {
- final Throwable root = ExceptionUtils.getRootCause(re);
- assertThat(root.getMessage(), CoreMatchers.startsWith("Error during serialization: Direct self-reference leading to cycle (through reference chain:"));
-
- // validate that we can still send messages to the server
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
- } finally {
- cluster.close();
- }
- }
-
- @Test
- public void shouldReceiveFailureOnBadGryoSerialization() throws Exception {
- final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRYO_V1D0).create();
- final Client client = cluster.connect();
-
- try {
- client.submit("java.awt.Color.RED").all().join();
- fail("Should throw an exception.");
- } catch (RuntimeException re) {
- final Throwable root = ExceptionUtils.getRootCause(re);
- assertThat(root.getMessage(), CoreMatchers.startsWith("Error during serialization: Class is not registered: java.awt.Color"));
-
- // validate that we can still send messages to the server
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
- } finally {
- cluster.close();
- }
- }
-
- @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
- @Test
- public void shouldBlockRequestWhenTooBig() throws Exception {
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect();
-
- try {
- final String fatty = IntStream.range(0, 1024).mapToObj(String::valueOf).collect(Collectors.joining());
- final CompletableFuture<ResultSet> result = client.submitAsync("'" + fatty + "';'test'");
- final ResultSet resultSet = result.get(10000, TimeUnit.MILLISECONDS);
- resultSet.all().get(10000, TimeUnit.MILLISECONDS);
- fail("Should throw an exception.");
- } catch (TimeoutException te) {
- // the request should not have timed-out - the connection should have been reset, but it seems that
- // timeout seems to occur as well on some systems (it's not clear why). however, the nature of this
- // test is to ensure that the script isn't processed if it exceeds a certain size, so in this sense
- // it seems ok to pass in this case.
- } catch (Exception re) {
- final Throwable root = ExceptionUtils.getRootCause(re);
- // Netty closes the channel to the server on a non-recoverable error such as CorruptedFrameException
- // and the connection is subsequently destroyed. Each of the pending requests are given an error with
- // the following error message.
- //
- // went with two possible error messages here as i think that there is some either non-deterministic
- // behavior around the error message or it's environmentally dependent (e.g. different jdk, versions, etc)
- assertThat(root.getMessage(), Matchers.anyOf(is("Connection to server is no longer active"), is("Connection reset by peer")));
-
- // validate that we can still send messages to the server
- assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
- } finally {
- cluster.close();
- }
- }
+// @Test
+// public void shouldScriptEvaluationErrorForRemoteTraversal() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+//
+// try {
+// // tests bad lambda
+// g.inject(1).sideEffect(Lambda.consumer("(")).iterate();
+// fail("This traversal should not have executed since lambda can't be compiled");
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat(t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION, ((ResponseException) t).getResponseStatusCode());
+// }
+//
+// // make a graph with a cycle in it to force a long run traversal
+// graphGetter.get().traversal().addV("person").as("p").addE("self").to("p").iterate();
+//
+// try {
+// // tests an "unending" traversal
+// g.V().repeat(__.out()).until(__.outE().count().is(0)).iterate();
+// fail("This traversal should have timed out");
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat(t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
+// }
+// }
+//
+// @Test
+// public void shouldCloseChannelIfClientDoesntRespond() throws Exception {
+// final SimpleClient client = TestClientFactory.createWebSocketClient();
+// client.submit("1+1");
+//
+// // since we do nothing for 2 seconds and the time limit for timeout on the server is 1 second, the server
+// // will autoclose the channel
+// Thread.sleep(2000);
+//
+// assertThat(recordingAppender.logContainsAny(".*Closing channel - client is disconnected after idle period of .*$"), is(true));
+//
+// client.close();
+// }
+//
+// @Test
+// public void shouldPingChannelIfClientDies() throws Exception {
+// final Client client = TestClientFactory.build().maxConnectionPoolSize(1).minConnectionPoolSize(1).keepAliveInterval(0).create().connect();
+// client.submit("1+1").all().get();
+//
+// // since we do nothing for 3 seconds and the time limit for ping is 1 second we should get *about* 3 pings -
+// // i don't think the assertion needs to be too accurate. just need to make sure there's a ping message out
+// // there record
+// Thread.sleep(3000);
+//
+// client.close();
+//
+// // stop the server to be sure that logs flush
+// stopServer();
+//
+// assertThat(recordingAppender.logContainsAny(".*Checking channel - sending ping to client after idle period of .*$"), is(true));
+// }
+//
+// @Test
+// public void shouldTimeOutRemoteTraversal() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+//
+// try {
+// // tests sleeping thread
+// g.inject(1).sideEffect(Lambda.consumer("Thread.sleep(10000)")).iterate();
+// fail("This traversal should have timed out");
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat(t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
+// }
+//
+// // make a graph with a cycle in it to force a long run traversal
+// graphGetter.get().traversal().addV("person").as("p").addE("self").to("p").iterate();
+//
+// try {
+// // tests an "unending" traversal
+// g.V().repeat(__.out()).until(__.outE().count().is(0)).iterate();
+// fail("This traversal should have timed out");
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat(t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
+// }
+// }
+//
+// @Test
+// public void shouldTimeOutRemoteTraversalUsingDeprecatedConfiguration() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+//
+// try {
+// // tests sleeping thread
+// g.inject(1).sideEffect(Lambda.consumer("Thread.sleep(10000)")).iterate();
+// fail("This traversal should have timed out");
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat(t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
+// }
+//
+// // make a graph with a cycle in it to force a long run traversal
+// graphGetter.get().traversal().addV("person").as("p").addE("self").to("p").iterate();
+//
+// try {
+// // tests an "unending" traversal
+// g.V().repeat(__.out()).until(__.outE().count().is(0)).iterate();
+// fail("This traversal should have timed out");
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat(t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
+// }
+// }
+//
+// @Test
+// public void shouldTimeOutRemoteTraversalWithPerRequestOption() {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+//
+// try {
+// // tests sleeping thread
+// g.with(ARGS_SCRIPT_EVAL_TIMEOUT, 500L).inject(1).sideEffect(Lambda.consumer("Thread.sleep(10000)")).iterate();
+// fail("This traversal should have timed out");
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat(t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
+// }
+//
+// // make a graph with a cycle in it to force a long run traversal
+// graphGetter.get().traversal().addV("person").as("p").addE("self").to("p").iterate();
+//
+// try {
+// // tests an "unending" traversal
+// g.with(ARGS_SCRIPT_EVAL_TIMEOUT, 500L).V().repeat(__.out()).until(__.outE().count().is(0)).iterate();
+// fail("This traversal should have timed out");
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat(t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
+// }
+// }
+//
+// @Test
+// public void shouldProduceProperExceptionOnTimeout() throws Exception {
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// boolean success = false;
+// // Run a short test script a few times with progressively longer timeouts.
+// // Each submissions should either succeed or fail with a timeout.
+// // Note: the range of timeouts is intended to cover the case when the script finishes at about the
+// // same time when the timeout occurs. In this situation either a timeout response or a successful
+// // response is acceptable, however no other processing errors should occur.
+// // Note: the timeout of 30 ms is generally sufficient for running a simple groovy script, so using longer
+// // timeouts are not likely to results in a success/timeout response collision, which is the purpose
+// // of this test.
+// // Note: this test may have a false negative result, but a failure would indicate a real problem.
+// for(int i = 0; i < 30; i++) {
+// int timeout = 1 + i;
+// overrideEvaluationTimeout(timeout);
+//
+// try {
+// client.submit("x = 1 + 1").all().get().get(0).getInt();
+// success = true;
+// } catch (Exception ex) {
+// final Throwable t = ex.getCause();
+// assertThat("Unexpected exception with script evaluation timeout: " + timeout, t, instanceOf(ResponseException.class));
+// assertEquals(ResponseStatusCode.SERVER_ERROR_TIMEOUT, ((ResponseException) t).getResponseStatusCode());
+// }
+// }
+//
+// assertTrue("Some script submissions should succeed", success);
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldUseBaseScript() throws Exception {
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// assertEquals("hello, stephen", client.submit("hello('stephen')").all().get().get(0).getString());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldUseInterpreterMode() throws Exception {
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// client.submit("def subtractAway(x,y){x-y};[]").all().get();
+// client.submit("multiplyIt = { x,y -> x * y};[]").all().get();
+//
+// assertEquals(2, client.submit("x = 1 + 1").all().get().get(0).getInt());
+// assertEquals(3, client.submit("int y = x + 1").all().get().get(0).getInt());
+// assertEquals(5, client.submit("def z = x + y").all().get().get(0).getInt());
+//
+// final Map<String,Object> m = new HashMap<>();
+// m.put("x", 10);
+// assertEquals(-5, client.submit("z - x", m).all().get().get(0).getInt());
+// assertEquals(15, client.submit("addItUp(x,z)", m).all().get().get(0).getInt());
+// assertEquals(5, client.submit("subtractAway(x,z)", m).all().get().get(0).getInt());
+// assertEquals(50, client.submit("multiplyIt(x,z)", m).all().get().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldNotUseInterpreterMode() throws Exception {
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect(name.getMethodName());
+//
+// client.submit("def subtractAway(x,y){x-y};[]").all().get();
+// client.submit("multiplyIt = { x,y -> x * y};[]").all().get();
+//
+// assertEquals(2, client.submit("x = 1 + 1").all().get().get(0).getInt());
+// assertEquals(3, client.submit("y = x + 1").all().get().get(0).getInt());
+// assertEquals(5, client.submit("z = x + y").all().get().get(0).getInt());
+//
+// final Map<String,Object> m = new HashMap<>();
+// m.put("x", 10);
+// assertEquals(-5, client.submit("z - x", m).all().get().get(0).getInt());
+// assertEquals(15, client.submit("addItUp(x,z)", m).all().get().get(0).getInt());
+// assertEquals(5, client.submit("subtractAway(x,z)", m).all().get().get(0).getInt());
+// assertEquals(50, client.submit("multiplyIt(x,z)", m).all().get().get(0).getInt());
+//
+// cluster.close();
+// }
+//
+// @Test
+// public void shouldUseSimpleSandbox() throws Exception {
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect();
+//
+// assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
+//
+// try {
+// // this should return "nothing" - there should be no exception
+// client.submit("java.lang.System.exit(0)").all().get();
+// fail("The above should not have executed in any successful way as sandboxing is enabled");
+// } catch (Exception ex) {
+// assertThat(ex.getCause().getMessage(), containsString("[Static type checking] - Not authorized to call this method: java.lang.System#exit(int)"));
+// } finally {
+// cluster.close();
+// }
+// }
+//
+// @Test
+// public void shouldRespectHighWaterMarkSettingAndSucceed() throws Exception {
+// // the highwatermark should get exceeded on the server and thus pause the writes, but have no problem catching
+// // itself up - this is a tricky tests to get passing on all environments so this assumption will deny the
+// // test for most cases
+// TestHelper.assumeNonDeterministic();
+//
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect();
+//
+// try {
+// final int resultCountToGenerate = 1000;
+// final int batchSize = 3;
+// final String fatty = IntStream.range(0, 175).mapToObj(String::valueOf).collect(Collectors.joining());
+// final String fattyX = "['" + fatty + "'] * " + resultCountToGenerate;
+//
+// // don't allow the thread to proceed until all results are accounted for
+// final CountDownLatch latch = new CountDownLatch(resultCountToGenerate);
+// final AtomicBoolean expected = new AtomicBoolean(false);
+// final AtomicBoolean faulty = new AtomicBoolean(false);
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_BATCH_SIZE, batchSize)
+// .addArg(Tokens.ARGS_GREMLIN, fattyX).create();
+//
+// client.submitAsync(request).thenAcceptAsync(r -> {
+// r.stream().forEach(item -> {
+// try {
+// final String aFattyResult = item.getString();
+// expected.set(aFattyResult.equals(fatty));
+// } catch (Exception ex) {
+// ex.printStackTrace();
+// faulty.set(true);
+// } finally {
+// latch.countDown();
+// }
+// });
+// });
+//
+// assertThat(latch.await(30000, TimeUnit.MILLISECONDS), is(true));
+// assertEquals(0, latch.getCount());
+// assertThat(faulty.get(), is(false));
+// assertThat(expected.get(), is(true));
+//
+// assertThat(recordingAppender.getMessages().stream().anyMatch(m -> m.contains("Pausing response writing as writeBufferHighWaterMark exceeded on")), is(true));
+// } catch (Exception ex) {
+// fail("Shouldn't have tossed an exception");
+// } finally {
+// cluster.close();
+// }
+// }
+//
+// @Test
+// public void shouldReturnInvalidRequestArgsWhenGremlinArgIsNotSupplied() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL).create();
+// final ResponseMessage result = client.submit(request).get(0);
+// assertThat(result.getStatus().getCode(), is(not(ResponseStatusCode.PARTIAL_CONTENT)));
+// assertEquals(result.getStatus().getCode(), ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS);
+// }
+// }
+//
+// @Test
+// public void shouldReturnInvalidRequestArgsWhenInvalidReservedBindingKeyIsUsed() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final Map<String, Object> bindings = new HashMap<>();
+// bindings.put(T.id.getAccessor(), "123");
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "[1,2,3,4,5,6,7,8,9,0]")
+// .addArg(Tokens.ARGS_BINDINGS, bindings).create();
+// final CountDownLatch latch = new CountDownLatch(1);
+// final AtomicBoolean pass = new AtomicBoolean(false);
+// client.submit(request, result -> {
+// if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
+// pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
+// latch.countDown();
+// }
+// });
+//
+// if (!latch.await(3000, TimeUnit.MILLISECONDS))
+// fail("Request should have returned error, but instead timed out");
+// assertThat(pass.get(), is(true));
+// }
+//
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final Map<String, Object> bindings = new HashMap<>();
+// bindings.put("id", "123");
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "[1,2,3,4,5,6,7,8,9,0]")
+// .addArg(Tokens.ARGS_BINDINGS, bindings).create();
+// final CountDownLatch latch = new CountDownLatch(1);
+// final AtomicBoolean pass = new AtomicBoolean(false);
+// client.submit(request, result -> {
+// if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
+// pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
+// latch.countDown();
+// }
+// });
+//
+// if (!latch.await(3000, TimeUnit.MILLISECONDS))
+// fail("Request should have returned error, but instead timed out");
+// assertTrue(pass.get());
+// }
+// }
+//
+// @Test
+// public void shouldReturnInvalidRequestArgsWhenInvalidTypeBindingKeyIsUsed() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final Map<Object, Object> bindings = new HashMap<>();
+// bindings.put(1, "123");
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "[1,2,3,4,5,6,7,8,9,0]")
+// .addArg(Tokens.ARGS_BINDINGS, bindings).create();
+// final CountDownLatch latch = new CountDownLatch(1);
+// final AtomicBoolean pass = new AtomicBoolean(false);
+// client.submit(request, result -> {
+// if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
+// pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
+// latch.countDown();
+// }
+// });
+//
+// if (!latch.await(3000, TimeUnit.MILLISECONDS))
+// fail("Request should have returned error, but instead timed out");
+// assertThat(pass.get(), is(true));
+// }
+// }
+//
+// @Test
+// public void shouldReturnInvalidRequestArgsWhenBindingCountExceedsAllowable() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final Map<Object, Object> bindings = new HashMap<>();
+// bindings.put("x", 123);
+// bindings.put("y", 123);
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "x+y")
+// .addArg(Tokens.ARGS_BINDINGS, bindings).create();
+// final CountDownLatch latch = new CountDownLatch(1);
+// final AtomicBoolean pass = new AtomicBoolean(false);
+// client.submit(request, result -> {
+// if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
+// pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
+// latch.countDown();
+// }
+// });
+//
+// if (!latch.await(3000, TimeUnit.MILLISECONDS))
+// fail("Request should have returned error, but instead timed out");
+// assertThat(pass.get(), is(true));
+// }
+//
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final Map<Object, Object> bindings = new HashMap<>();
+// bindings.put("x", 123);
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "x+123")
+// .addArg(Tokens.ARGS_BINDINGS, bindings).create();
+// final CountDownLatch latch = new CountDownLatch(1);
+// final AtomicBoolean pass = new AtomicBoolean(false);
+// client.submit(request, result -> {
+// if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
+// pass.set(ResponseStatusCode.SUCCESS == result.getStatus().getCode() && (((int) ((List) result.getResult().getData()).get(0) == 246)));
+// latch.countDown();
+// }
+// });
+//
+// if (!latch.await(3000, TimeUnit.MILLISECONDS))
+// fail("Request should have returned error, but instead timed out");
+// assertThat(pass.get(), is(true));
+// }
+// }
+//
+// @Test
+// public void shouldReturnInvalidRequestArgsWhenInvalidNullBindingKeyIsUsed() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final Map<String, Object> bindings = new HashMap<>();
+// bindings.put(null, "123");
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "[1,2,3,4,5,6,7,8,9,0]")
+// .addArg(Tokens.ARGS_BINDINGS, bindings).create();
+// final CountDownLatch latch = new CountDownLatch(1);
+// final AtomicBoolean pass = new AtomicBoolean(false);
+// client.submit(request, result -> {
+// if (result.getStatus().getCode() != ResponseStatusCode.PARTIAL_CONTENT) {
+// pass.set(ResponseStatusCode.REQUEST_ERROR_INVALID_REQUEST_ARGUMENTS == result.getStatus().getCode());
+// latch.countDown();
+// }
+// });
+//
+// if (!latch.await(3000, TimeUnit.MILLISECONDS))
+// fail("Request should have returned error, but instead timed out");
+// assertThat(pass.get(), is(true));
+// }
+// }
+//
+// @Test
+// @SuppressWarnings("unchecked")
+// public void shouldBatchResultsByTwos() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "[0,1,2,3,4,5,6,7,8,9]").create();
+//
+// final List<ResponseMessage> msgs = client.submit(request);
+// assertEquals(5, client.submit(request).size());
+// assertEquals(0, ((List<Integer>) msgs.get(0).getResult().getData()).get(0).intValue());
+// assertEquals(1, ((List<Integer>) msgs.get(0).getResult().getData()).get(1).intValue());
+// assertEquals(2, ((List<Integer>) msgs.get(1).getResult().getData()).get(0).intValue());
+// assertEquals(3, ((List<Integer>) msgs.get(1).getResult().getData()).get(1).intValue());
+// assertEquals(4, ((List<Integer>) msgs.get(2).getResult().getData()).get(0).intValue());
+// assertEquals(5, ((List<Integer>) msgs.get(2).getResult().getData()).get(1).intValue());
+// assertEquals(6, ((List<Integer>) msgs.get(3).getResult().getData()).get(0).intValue());
+// assertEquals(7, ((List<Integer>) msgs.get(3).getResult().getData()).get(1).intValue());
+// assertEquals(8, ((List<Integer>) msgs.get(4).getResult().getData()).get(0).intValue());
+// assertEquals(9, ((List<Integer>) msgs.get(4).getResult().getData()).get(1).intValue());
+// }
+// }
+//
+// @Test
+// @SuppressWarnings("unchecked")
+// public void shouldBatchResultsByOnesByOverridingFromClientSide() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "[0,1,2,3,4,5,6,7,8,9]")
+// .addArg(Tokens.ARGS_BATCH_SIZE, 1).create();
+//
+// final List<ResponseMessage> msgs = client.submit(request);
+// assertEquals(10, msgs.size());
+// IntStream.rangeClosed(0, 9).forEach(i -> assertEquals(i, ((List<Integer>) msgs.get(i).getResult().getData()).get(0).intValue()));
+// }
+// }
+//
+// @Test
+// public void shouldNotThrowNoSuchElementException() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()){
+// // this should return "nothing" - there should be no exception
+// final List<ResponseMessage> responses = client.submit("g.V().has('name','kadfjaldjfla')");
+// assertNull(responses.get(0).getResult().getData());
+// }
+// }
+//
+// @Test
+// @SuppressWarnings("unchecked")
+// public void shouldReceiveFailureTimeOutOnScriptEval() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()){
+// final List<ResponseMessage> responses = client.submit("Thread.sleep(3000);'some-stuff-that-should not return'");
+// assertThat(responses.get(0).getStatus().getMessage(), startsWith("Evaluation exceeded the configured 'evaluationTimeout' threshold of 1000 ms"));
+//
+// // validate that we can still send messages to the server
+// assertEquals(2, ((List<Integer>) client.submit("1+1").get(0).getResult().getData()).get(0).intValue());
+// }
+// }
+//
+// @Test
+// @SuppressWarnings("unchecked")
+// public void shouldReceiveFailureTimeOutOnScriptEvalUsingOverride() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final RequestMessage msg = RequestMessage.build("eval")
+// .addArg(ARGS_SCRIPT_EVAL_TIMEOUT, 100L)
+// .addArg(Tokens.ARGS_GREMLIN, "Thread.sleep(3000);'some-stuff-that-should not return'")
+// .create();
+// final List<ResponseMessage> responses = client.submit(msg);
+// assertThat(responses.get(0).getStatus().getMessage(), startsWith("Evaluation exceeded the configured 'evaluationTimeout' threshold of 100 ms"));
+//
+// // validate that we can still send messages to the server
+// assertEquals(2, ((List<Integer>) client.submit("1+1").get(0).getResult().getData()).get(0).intValue());
+// }
+// }
+//
+// @Test
+// @SuppressWarnings("unchecked")
+// public void shouldReceiveFailureTimeOutOnEvalUsingOverride() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final RequestMessage msg = RequestMessage.build("eval")
+// .addArg(Tokens.ARGS_EVAL_TIMEOUT, 100L)
+// .addArg(Tokens.ARGS_GREMLIN, "Thread.sleep(3000);'some-stuff-that-should not return'")
+// .create();
+// final List<ResponseMessage> responses = client.submit(msg);
+// assertThat(responses.get(0).getStatus().getMessage(), startsWith("Evaluation exceeded the configured 'evaluationTimeout' threshold of 100 ms"));
+//
+// // validate that we can still send messages to the server
+// assertEquals(2, ((List<Integer>) client.submit("1+1").get(0).getResult().getData()).get(0).intValue());
+// }
+// }
+//
+// @Test
+// public void shouldReceiveFailureTimeOutOnScriptEvalOfOutOfControlLoop() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()){
+// // timeout configured for 1 second so the timed interrupt should trigger prior to the
+// // evaluationTimeout which is at 30 seconds by default
+// final List<ResponseMessage> responses = client.submit("while(true){}");
+// assertThat(responses.get(0).getStatus().getMessage(), startsWith("Timeout during script evaluation triggered by TimedInterruptCustomizerProvider"));
+//
+// // validate that we can still send messages to the server
+// assertEquals(2, ((List<Integer>) client.submit("1+1").get(0).getResult().getData()).get(0).intValue());
+// }
+// }
+//
+// @Test
+// @SuppressWarnings("unchecked")
+// public void shouldLoadInitScript() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()){
+// assertEquals(2, ((List<Integer>) client.submit("addItUp(1,1)").get(0).getResult().getData()).get(0).intValue());
+// }
+// }
+//
+// @Test
+// public void shouldGarbageCollectPhantomButNotHard() throws Exception {
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect();
+//
+// assertEquals(2, client.submit("addItUp(1,1)").all().join().get(0).getInt());
+// assertEquals(0, client.submit("def subtract(x,y){x-y};subtract(1,1)").all().join().get(0).getInt());
+// assertEquals(0, client.submit("subtract(1,1)").all().join().get(0).getInt());
+//
+// final Map<String, Object> bindings = new HashMap<>();
+// bindings.put(GremlinGroovyScriptEngine.KEY_REFERENCE_TYPE, GremlinGroovyScriptEngine.REFERENCE_TYPE_PHANTOM);
+// assertEquals(4, client.submit("def multiply(x,y){x*y};multiply(2,2)", bindings).all().join().get(0).getInt());
+//
+// try {
+// client.submit("multiply(2,2)").all().join().get(0).getInt();
+// fail("Should throw an exception since reference is phantom.");
+// } catch (RuntimeException ignored) {
+//
+// } finally {
+// cluster.close();
+// }
+// }
+//
+// @Test
+// public void shouldReceiveFailureOnBadGraphSONSerialization() throws Exception {
+// final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V3D0).create();
+// final Client client = cluster.connect();
+//
+// try {
+// client.submit("def class C { def C getC(){return this}}; new C()").all().join();
+// fail("Should throw an exception.");
+// } catch (RuntimeException re) {
+// final Throwable root = ExceptionUtils.getRootCause(re);
+// assertThat(root.getMessage(), CoreMatchers.startsWith("Error during serialization: Direct self-reference leading to cycle (through reference chain:"));
+//
+// // validate that we can still send messages to the server
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+// } finally {
+// cluster.close();
+// }
+// }
+//
+// @Test
+// public void shouldReceiveFailureOnBadGryoSerialization() throws Exception {
+// final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRYO_V1D0).create();
+// final Client client = cluster.connect();
+//
+// try {
+// client.submit("java.awt.Color.RED").all().join();
+// fail("Should throw an exception.");
+// } catch (RuntimeException re) {
+// final Throwable root = ExceptionUtils.getRootCause(re);
+// assertThat(root.getMessage(), CoreMatchers.startsWith("Error during serialization: Class is not registered: java.awt.Color"));
+//
+// // validate that we can still send messages to the server
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+// } finally {
+// cluster.close();
+// }
+// }
+//
+// @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+// @Test
+// public void shouldBlockRequestWhenTooBig() throws Exception {
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect();
+//
+// try {
+// final String fatty = IntStream.range(0, 1024).mapToObj(String::valueOf).collect(Collectors.joining());
+// final CompletableFuture<ResultSet> result = client.submitAsync("'" + fatty + "';'test'");
+// final ResultSet resultSet = result.get(10000, TimeUnit.MILLISECONDS);
+// resultSet.all().get(10000, TimeUnit.MILLISECONDS);
+// fail("Should throw an exception.");
+// } catch (TimeoutException te) {
+// // the request should not have timed-out - the connection should have been reset, but it seems that
+// // timeout seems to occur as well on some systems (it's not clear why). however, the nature of this
+// // test is to ensure that the script isn't processed if it exceeds a certain size, so in this sense
+// // it seems ok to pass in this case.
+// } catch (Exception re) {
+// final Throwable root = ExceptionUtils.getRootCause(re);
+// // Netty closes the channel to the server on a non-recoverable error such as CorruptedFrameException
+// // and the connection is subsequently destroyed. Each of the pending requests are given an error with
+// // the following error message.
+// //
+// // went with two possible error messages here as i think that there is some either non-deterministic
+// // behavior around the error message or it's environmentally dependent (e.g. different jdk, versions, etc)
+// assertThat(root.getMessage(), Matchers.anyOf(is("Connection to server is no longer active"), is("Connection reset by peer")));
+//
+// // validate that we can still send messages to the server
+// assertEquals(2, client.submit("1+1").all().join().get(0).getInt());
+// } finally {
+// cluster.close();
+// }
+// }
@Test
public void shouldFailOnDeadHost() throws Exception {
@@ -930,269 +930,269 @@ public class GremlinServerIntegrateTest extends AbstractGremlinServerIntegration
cluster.close();
}
}
-
- @Test
- public void shouldNotHavePartialContentWithOneResult() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "10").create();
- final List<ResponseMessage> responses = client.submit(request);
- assertEquals(1, responses.size());
- assertEquals(ResponseStatusCode.SUCCESS, responses.get(0).getStatus().getCode());
- }
- }
-
- @Test
- public void shouldHavePartialContentWithLongResultsCollection() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "new String[100]").create();
- final List<ResponseMessage> responses = client.submit(request);
- assertThat(responses.size(), Matchers.greaterThan(1));
- for (Iterator<ResponseMessage> it = responses.iterator(); it.hasNext(); ) {
- final ResponseMessage msg = it.next();
- final ResponseStatusCode expected = it.hasNext() ? ResponseStatusCode.PARTIAL_CONTENT : ResponseStatusCode.SUCCESS;
- assertEquals(expected, msg.getStatus().getCode());
- }
- }
- }
-
- @Test
- public void shouldFailWithBadScriptEval() throws Exception {
- try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
- final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
- .addArg(Tokens.ARGS_GREMLIN, "new String().doNothingAtAllBecauseThis is a syntax error").create();
- final List<ResponseMessage> responses = client.submit(request);
- assertEquals(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION, responses.get(0).getStatus().getCode());
- assertEquals(1, responses.size());
- }
- }
-
- @Test
- public void shouldSupportLambdasUsingWithRemote() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
- g.addV("person").property("age", 20).iterate();
- g.addV("person").property("age", 10).iterate();
- assertEquals(50L, g.V().hasLabel("person").map(Lambda.function("it.get().value('age') + 10")).sum().next());
- }
-
- @Test
- public void shouldGetSideEffectKeysAndStatusUsingWithRemote() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
- g.addV("person").property("age", 20).iterate();
- g.addV("person").property("age", 10).iterate();
- final GraphTraversal traversal = g.V().aggregate("a").aggregate("b");
- traversal.iterate();
- final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects();
- assertThat(se.statusAttributes().containsKey(Tokens.ARGS_HOST), is(true));
-
- // Get keys
- final Set<String> sideEffectKeys = se.keys();
- assertEquals(2, sideEffectKeys.size());
-
- // Get side effects
- final BulkSet aSideEffects = se.get("a");
- assertThat(aSideEffects.isEmpty(), is(false));
- final BulkSet bSideEffects = se.get("b");
- assertThat(bSideEffects.isEmpty(), is(false));
-
- // Should get local keys/side effects after close
- se.close();
-
- final Set<String> localSideEffectKeys = se.keys();
- assertEquals(2, localSideEffectKeys.size());
-
- final BulkSet localASideEffects = se.get("a");
- assertThat(localASideEffects.isEmpty(), is(false));
-
- final BulkSet localBSideEffects = se.get("b");
- assertThat(localBSideEffects.isEmpty(), is(false));
-
- final GraphTraversal gdotv = g.V();
- gdotv.toList();
- final DriverRemoteTraversalSideEffects gdotvSe = (DriverRemoteTraversalSideEffects) gdotv.asAdmin().getSideEffects();
- assertThat(gdotvSe.statusAttributes().containsKey(Tokens.ARGS_HOST), is(true));
- }
-
- @Test
- public void shouldCloseSideEffectsUsingWithRemote() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
- g.addV("person").property("age", 20).iterate();
- g.addV("person").property("age", 10).iterate();
- final GraphTraversal traversal = g.V().aggregate("a").aggregate("b");
- traversal.iterate();
- final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects();
- final BulkSet sideEffects = se.get("a");
- assertThat(sideEffects.isEmpty(), is(false));
- se.close();
-
- // Can't get new side effects after close
- try {
- se.get("b");
- fail("The traversal is closed");
- } catch (Exception ex) {
- assertThat(ex, instanceOf(IllegalStateException.class));
- assertEquals("Traversal has been closed - no new side-effects can be retrieved", ex.getMessage());
- }
-
- // Earlier keys should be cached locally
- final Set<String> localSideEffectKeys = se.keys();
- assertEquals(2, localSideEffectKeys.size());
- final BulkSet localSideEffects = se.get("a");
- assertThat(localSideEffects.isEmpty(), is(false));
-
- // Try to get side effect from server
- final Cluster cluster = TestClientFactory.open();
- final Client client = cluster.connect();
- final Field field = DriverRemoteTraversalSideEffects.class.getDeclaredField("serverSideEffect");
- field.setAccessible(true);
- final UUID serverSideEffectId = (UUID) field.get(se);
- final Map<String, String> aliases = new HashMap<>();
- aliases.put("g", "g");
- final RequestMessage msg = RequestMessage.build(Tokens.OPS_GATHER)
- .addArg(Tokens.ARGS_SIDE_EFFECT, serverSideEffectId)
- .addArg(Tokens.ARGS_SIDE_EFFECT_KEY, "b")
- .addArg(Tokens.ARGS_ALIASES, aliases)
- .processor("traversal").create();
- boolean error;
- try {
- client.submitAsync(msg).get().one();
- error = false;
- } catch (Exception ex) {
- error = true;
- }
- assertThat(error, is(true));
- }
-
- @Test
- public void shouldBlockWhenGettingSideEffectKeysUsingWithRemote() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
- g.addV("person").property("age", 20).iterate();
- g.addV("person").property("age", 10).iterate();
- final GraphTraversal traversal = g.V().aggregate("a")
- .sideEffect(Lambda.consumer("{Thread.sleep(3000)}"))
- .aggregate("b");
-
- // force strategy application - if this doesn't happen then getSideEffects() returns DefaultTraversalSideEffects
- traversal.hasNext();
-
- // start a separate thread to iterate
- final Thread t = new Thread(traversal::iterate);
- t.start();
-
- // blocks here until traversal iteration is complete
- final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects();
-
- // Get keys
- final Set<String> sideEffectKeys = se.keys();
- assertEquals(2, sideEffectKeys.size());
-
- // Get side effects
- final BulkSet aSideEffects = se.get("a");
- assertThat(aSideEffects.isEmpty(), is(false));
- final BulkSet bSideEffects = se.get("b");
- assertThat(bSideEffects.isEmpty(), is(false));
-
- // Should get local keys/side effects after close
- se.close();
-
- final Set<String> localSideEffectKeys = se.keys();
- assertEquals(2, localSideEffectKeys.size());
-
- final BulkSet localASideEffects = se.get("a");
- assertThat(localASideEffects.isEmpty(), is(false));
-
- final BulkSet localBSideEffects = se.get("b");
- assertThat(localBSideEffects.isEmpty(), is(false));
- }
-
- @Test
- public void shouldBlockWhenGettingSideEffectValuesUsingWithRemote() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
- g.addV("person").property("age", 20).iterate();
- g.addV("person").property("age", 10).iterate();
- final GraphTraversal traversal = g.V().aggregate("a")
- .sideEffect(Lambda.consumer("{Thread.sleep(3000)}"))
- .aggregate("b");
-
- // force strategy application - if this doesn't happen then getSideEffects() returns DefaultTraversalSideEffects
- traversal.hasNext();
-
- // start a separate thread to iterate
- final Thread t = new Thread(traversal::iterate);
- t.start();
-
- // blocks here until traversal iteration is complete
- final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects();
-
- // Get side effects
- final BulkSet aSideEffects = se.get("a");
- assertThat(aSideEffects.isEmpty(), is(false));
- final BulkSet bSideEffects = se.get("b");
- assertThat(bSideEffects.isEmpty(), is(false));
-
- // Get keys
- final Set<String> sideEffectKeys = se.keys();
- assertEquals(2, sideEffectKeys.size());
-
- // Should get local keys/side effects after close
- se.close();
-
- final Set<String> localSideEffectKeys = se.keys();
- assertEquals(2, localSideEffectKeys.size());
-
- final BulkSet localASideEffects = se.get("a");
- assertThat(localASideEffects.isEmpty(), is(false));
-
- final BulkSet localBSideEffects = se.get("b");
- assertThat(localBSideEffects.isEmpty(), is(false));
- }
-
- @Test
- public void shouldDoNonBlockingPromiseWithRemote() throws Exception {
- final GraphTraversalSource g = traversal().withRemote(conf);
- g.addV("person").property("age", 20).promise(Traversal::iterate).join();
- g.addV("person").property("age", 10).promise(Traversal::iterate).join();
- assertEquals(50L, g.V().hasLabel("person").map(Lambda.function("it.get().value('age') + 10")).sum().promise(t -> t.next()).join());
- g.addV("person").property("age", 20).promise(Traversal::iterate).join();
-
- final Traversal<Vertex,Integer> traversal = g.V().hasLabel("person").has("age", 20).values("age");
- int age = traversal.promise(t -> t.next(1).get(0)).join();
- assertEquals(20, age);
- assertEquals(20, (int)traversal.next());
- assertThat(traversal.hasNext(), is(false));
-
- final Traversal traversalCloned = g.V().hasLabel("person").has("age", 20).values("age");
- assertEquals(20, traversalCloned.next());
- assertEquals(20, traversalCloned.promise(t -> ((Traversal) t).next(1).get(0)).join());
- assertThat(traversalCloned.promise(t -> ((Traversal) t).hasNext()).join(), is(false));
-
- assertEquals(3, g.V().promise(Traversal::toList).join().size());
- }
-
- @Test
- public void shouldProvideBetterExceptionForMethodCodeTooLarge() {
- final int numberOfParameters = 4000;
- final Map<String,Object> b = new HashMap<>();
-
- // generate a script with a ton of bindings usage to generate a "code too large" exception
- String script = "x = 0";
- for (int ix = 0; ix < numberOfParameters; ix++) {
- if (ix > 0 && ix % 100 == 0) {
- script = script + ";" + System.lineSeparator() + "x = x";
- }
- script = script + " + x" + ix;
- b.put("x" + ix, ix);
- }
-
- final Cluster cluster = TestClientFactory.build().maxContentLength(4096000).create();
- final Client client = cluster.connect();
-
- try {
- client.submit(script, b).all().get();
- fail("Should have tanked out because of number of parameters used and size of the compile script");
- } catch (Exception ex) {
- assertThat(ex.getMessage(), containsString("The Gremlin statement that was submitted exceeds the maximum compilation size allowed by the JVM"));
- }
- }
+//
+// @Test
+// public void shouldNotHavePartialContentWithOneResult() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "10").create();
+// final List<ResponseMessage> responses = client.submit(request);
+// assertEquals(1, responses.size());
+// assertEquals(ResponseStatusCode.SUCCESS, responses.get(0).getStatus().getCode());
+// }
+// }
+//
+// @Test
+// public void shouldHavePartialContentWithLongResultsCollection() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "new String[100]").create();
+// final List<ResponseMessage> responses = client.submit(request);
+// assertThat(responses.size(), Matchers.greaterThan(1));
+// for (Iterator<ResponseMessage> it = responses.iterator(); it.hasNext(); ) {
+// final ResponseMessage msg = it.next();
+// final ResponseStatusCode expected = it.hasNext() ? ResponseStatusCode.PARTIAL_CONTENT : ResponseStatusCode.SUCCESS;
+// assertEquals(expected, msg.getStatus().getCode());
+// }
+// }
+// }
+//
+// @Test
+// public void shouldFailWithBadScriptEval() throws Exception {
+// try (SimpleClient client = TestClientFactory.createWebSocketClient()) {
+// final RequestMessage request = RequestMessage.build(Tokens.OPS_EVAL)
+// .addArg(Tokens.ARGS_GREMLIN, "new String().doNothingAtAllBecauseThis is a syntax error").create();
+// final List<ResponseMessage> responses = client.submit(request);
+// assertEquals(ResponseStatusCode.SERVER_ERROR_SCRIPT_EVALUATION, responses.get(0).getStatus().getCode());
+// assertEquals(1, responses.size());
+// }
+// }
+//
+// @Test
+// public void shouldSupportLambdasUsingWithRemote() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+// g.addV("person").property("age", 20).iterate();
+// g.addV("person").property("age", 10).iterate();
+// assertEquals(50L, g.V().hasLabel("person").map(Lambda.function("it.get().value('age') + 10")).sum().next());
+// }
+//
+// @Test
+// public void shouldGetSideEffectKeysAndStatusUsingWithRemote() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+// g.addV("person").property("age", 20).iterate();
+// g.addV("person").property("age", 10).iterate();
+// final GraphTraversal traversal = g.V().aggregate("a").aggregate("b");
+// traversal.iterate();
+// final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects();
+// assertThat(se.statusAttributes().containsKey(Tokens.ARGS_HOST), is(true));
+//
+// // Get keys
+// final Set<String> sideEffectKeys = se.keys();
+// assertEquals(2, sideEffectKeys.size());
+//
+// // Get side effects
+// final BulkSet aSideEffects = se.get("a");
+// assertThat(aSideEffects.isEmpty(), is(false));
+// final BulkSet bSideEffects = se.get("b");
+// assertThat(bSideEffects.isEmpty(), is(false));
+//
+// // Should get local keys/side effects after close
+// se.close();
+//
+// final Set<String> localSideEffectKeys = se.keys();
+// assertEquals(2, localSideEffectKeys.size());
+//
+// final BulkSet localASideEffects = se.get("a");
+// assertThat(localASideEffects.isEmpty(), is(false));
+//
+// final BulkSet localBSideEffects = se.get("b");
+// assertThat(localBSideEffects.isEmpty(), is(false));
+//
+// final GraphTraversal gdotv = g.V();
+// gdotv.toList();
+// final DriverRemoteTraversalSideEffects gdotvSe = (DriverRemoteTraversalSideEffects) gdotv.asAdmin().getSideEffects();
+// assertThat(gdotvSe.statusAttributes().containsKey(Tokens.ARGS_HOST), is(true));
+// }
+//
+// @Test
+// public void shouldCloseSideEffectsUsingWithRemote() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+// g.addV("person").property("age", 20).iterate();
+// g.addV("person").property("age", 10).iterate();
+// final GraphTraversal traversal = g.V().aggregate("a").aggregate("b");
+// traversal.iterate();
+// final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects();
+// final BulkSet sideEffects = se.get("a");
+// assertThat(sideEffects.isEmpty(), is(false));
+// se.close();
+//
+// // Can't get new side effects after close
+// try {
+// se.get("b");
+// fail("The traversal is closed");
+// } catch (Exception ex) {
+// assertThat(ex, instanceOf(IllegalStateException.class));
+// assertEquals("Traversal has been closed - no new side-effects can be retrieved", ex.getMessage());
+// }
+//
+// // Earlier keys should be cached locally
+// final Set<String> localSideEffectKeys = se.keys();
+// assertEquals(2, localSideEffectKeys.size());
+// final BulkSet localSideEffects = se.get("a");
+// assertThat(localSideEffects.isEmpty(), is(false));
+//
+// // Try to get side effect from server
+// final Cluster cluster = TestClientFactory.open();
+// final Client client = cluster.connect();
+// final Field field = DriverRemoteTraversalSideEffects.class.getDeclaredField("serverSideEffect");
+// field.setAccessible(true);
+// final UUID serverSideEffectId = (UUID) field.get(se);
+// final Map<String, String> aliases = new HashMap<>();
+// aliases.put("g", "g");
+// final RequestMessage msg = RequestMessage.build(Tokens.OPS_GATHER)
+// .addArg(Tokens.ARGS_SIDE_EFFECT, serverSideEffectId)
+// .addArg(Tokens.ARGS_SIDE_EFFECT_KEY, "b")
+// .addArg(Tokens.ARGS_ALIASES, aliases)
+// .processor("traversal").create();
+// boolean error;
+// try {
+// client.submitAsync(msg).get().one();
+// error = false;
+// } catch (Exception ex) {
+// error = true;
+// }
+// assertThat(error, is(true));
+// }
+//
+// @Test
+// public void shouldBlockWhenGettingSideEffectKeysUsingWithRemote() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+// g.addV("person").property("age", 20).iterate();
+// g.addV("person").property("age", 10).iterate();
+// final GraphTraversal traversal = g.V().aggregate("a")
+// .sideEffect(Lambda.consumer("{Thread.sleep(3000)}"))
+// .aggregate("b");
+//
+// // force strategy application - if this doesn't happen then getSideEffects() returns DefaultTraversalSideEffects
+// traversal.hasNext();
+//
+// // start a separate thread to iterate
+// final Thread t = new Thread(traversal::iterate);
+// t.start();
+//
+// // blocks here until traversal iteration is complete
+// final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects();
+//
+// // Get keys
+// final Set<String> sideEffectKeys = se.keys();
+// assertEquals(2, sideEffectKeys.size());
+//
+// // Get side effects
+// final BulkSet aSideEffects = se.get("a");
+// assertThat(aSideEffects.isEmpty(), is(false));
+// final BulkSet bSideEffects = se.get("b");
+// assertThat(bSideEffects.isEmpty(), is(false));
+//
+// // Should get local keys/side effects after close
+// se.close();
+//
+// final Set<String> localSideEffectKeys = se.keys();
+// assertEquals(2, localSideEffectKeys.size());
+//
+// final BulkSet localASideEffects = se.get("a");
+// assertThat(localASideEffects.isEmpty(), is(false));
+//
+// final BulkSet localBSideEffects = se.get("b");
+// assertThat(localBSideEffects.isEmpty(), is(false));
+// }
+//
+// @Test
+// public void shouldBlockWhenGettingSideEffectValuesUsingWithRemote() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+// g.addV("person").property("age", 20).iterate();
+// g.addV("person").property("age", 10).iterate();
+// final GraphTraversal traversal = g.V().aggregate("a")
+// .sideEffect(Lambda.consumer("{Thread.sleep(3000)}"))
+// .aggregate("b");
+//
+// // force strategy application - if this doesn't happen then getSideEffects() returns DefaultTraversalSideEffects
+// traversal.hasNext();
+//
+// // start a separate thread to iterate
+// final Thread t = new Thread(traversal::iterate);
+// t.start();
+//
+// // blocks here until traversal iteration is complete
+// final DriverRemoteTraversalSideEffects se = (DriverRemoteTraversalSideEffects) traversal.asAdmin().getSideEffects();
+//
+// // Get side effects
+// final BulkSet aSideEffects = se.get("a");
+// assertThat(aSideEffects.isEmpty(), is(false));
+// final BulkSet bSideEffects = se.get("b");
+// assertThat(bSideEffects.isEmpty(), is(false));
+//
+// // Get keys
+// final Set<String> sideEffectKeys = se.keys();
+// assertEquals(2, sideEffectKeys.size());
+//
+// // Should get local keys/side effects after close
+// se.close();
+//
+// final Set<String> localSideEffectKeys = se.keys();
+// assertEquals(2, localSideEffectKeys.size());
+//
+// final BulkSet localASideEffects = se.get("a");
+// assertThat(localASideEffects.isEmpty(), is(false));
+//
+// final BulkSet localBSideEffects = se.get("b");
+// assertThat(localBSideEffects.isEmpty(), is(false));
+// }
+//
+// @Test
+// public void shouldDoNonBlockingPromiseWithRemote() throws Exception {
+// final GraphTraversalSource g = traversal().withRemote(conf);
+// g.addV("person").property("age", 20).promise(Traversal::iterate).join();
+// g.addV("person").property("age", 10).promise(Traversal::iterate).join();
+// assertEquals(50L, g.V().hasLabel("person").map(Lambda.function("it.get().value('age') + 10")).sum().promise(t -> t.next()).join());
+// g.addV("person").property("age", 20).promise(Traversal::iterate).join();
+//
+// final Traversal<Vertex,Integer> traversal = g.V().hasLabel("person").has("age", 20).values("age");
+// int age = traversal.promise(t -> t.next(1).get(0)).join();
+// assertEquals(20, age);
+// assertEquals(20, (int)traversal.next());
+// assertThat(traversal.hasNext(), is(false));
+//
+// final Traversal traversalCloned = g.V().hasLabel("person").has("age", 20).values("age");
+// assertEquals(20, traversalCloned.next());
+// assertEquals(20, traversalCloned.promise(t -> ((Traversal) t).next(1).get(0)).join());
+// assertThat(traversalCloned.promise(t -> ((Traversal) t).hasNext()).join(), is(false));
+//
+// assertEquals(3, g.V().promise(Traversal::toList).join().size());
+// }
+//
+// @Test
+// public void shouldProvideBetterExceptionForMethodCodeTooLarge() {
+// final int numberOfParameters = 4000;
+// final Map<String,Object> b = new HashMap<>();
+//
+// // generate a script with a ton of bindings usage to generate a "code too large" exception
+// String script = "x = 0";
+// for (int ix = 0; ix < numberOfParameters; ix++) {
+// if (ix > 0 && ix % 100 == 0) {
+// script = script + ";" + System.lineSeparator() + "x = x";
+// }
+// script = script + " + x" + ix;
+// b.put("x" + ix, ix);
+// }
+//
+// final Cluster cluster = TestClientFactory.build().maxContentLength(4096000).create();
+// final Client client = cluster.connect();
+//
+// try {
+// client.submit(script, b).all().get();
+// fail("Should have tanked out because of number of parameters used and size of the compile script");
+// } catch (Exception ex) {
+// assertThat(ex.getMessage(), containsString("The Gremlin statement that was submitted exceeds the maximum compilation size allowed by the JVM"));
+// }
+// }
}