From 6f52afcf90b80f050cb953368798500d386f0e81 Mon Sep 17 00:00:00 2001 From: Rob Rudin Date: Tue, 28 Mar 2023 08:55:07 -0400 Subject: [PATCH] DEVEXP-185 Better error messages for IO errors --- .../TestDatabaseClientConnection.java | 41 ++++++------------- .../marklogic/client/impl/OkHttpServices.java | 8 +++- .../com/marklogic/client/test/SSLTest.java | 20 ++------- 3 files changed, 23 insertions(+), 46 deletions(-) diff --git a/marklogic-client-api-functionaltests/src/test/java/com/marklogic/client/fastfunctest/TestDatabaseClientConnection.java b/marklogic-client-api-functionaltests/src/test/java/com/marklogic/client/fastfunctest/TestDatabaseClientConnection.java index 684d4d27f..4e6281fdf 100644 --- a/marklogic-client-api-functionaltests/src/test/java/com/marklogic/client/fastfunctest/TestDatabaseClientConnection.java +++ b/marklogic-client-api-functionaltests/src/test/java/com/marklogic/client/fastfunctest/TestDatabaseClientConnection.java @@ -20,6 +20,7 @@ import com.marklogic.client.DatabaseClientFactory; import com.marklogic.client.DatabaseClientFactory.SSLHostnameVerifier; import com.marklogic.client.DatabaseClientFactory.SecurityContext; +import com.marklogic.client.MarkLogicIOException; import com.marklogic.client.ResourceNotFoundException; import com.marklogic.client.Transaction; import com.marklogic.client.alerting.RuleDefinition; @@ -46,6 +47,7 @@ import com.marklogic.client.query.ValuesDefinition; import com.marklogic.client.query.ValuesListDefinition; import org.custommonkey.xmlunit.exceptions.XpathException; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.w3c.dom.Document; import org.xml.sax.SAXException; @@ -167,35 +169,18 @@ public X509Certificate[] getAcceptedIssuers() { } - @Test - public void testDatabaseClientConnectionInvalidPort() throws IOException - { - System.out.println("Running testDatabaseClientConnectionInvalidPort"); - - String filename = "facebook-10443244874876159931"; - - DatabaseClient client = newDatabaseClientBuilder().withPort(8033).build(); - - String expectedException = null; - String exception = ""; - if (IsSecurityEnabled()) - expectedException = "Failed to connect"; - else - expectedException = "com.marklogic.client.MarkLogicIOException"; - - // write doc - try { - writeDocumentUsingStringHandle(client, filename, "/write-text-doc/", "Text"); - } catch (Exception e) { - exception = e.toString(); - System.out.println("Exception is " + exception); - } - - assertTrue(exception.contains(expectedException)); + @Test + void invalidPort() { + int assumedInvalidPort = 60123; + DatabaseClient client = newDatabaseClientBuilder().withPort(assumedInvalidPort).build(); - // release client - client.release(); - } + MarkLogicIOException ex = Assertions.assertThrows(MarkLogicIOException.class, () -> client.checkConnection()); + String expected = "Error occurred while calling http://localhost:60123/v1/ping; java.net.ConnectException: " + + "Failed to connect to localhost/127.0.0.1:60123 ; possible reasons for the error include " + + "that a MarkLogic app server may not be listening on the port, or MarkLogic was stopped " + + "or restarted during the request; check the MarkLogic server logs for more information."; + assertEquals(expected, ex.getMessage()); + } @Test public void testDatabaseClientConnectionInvalidUser() throws IOException, KeyManagementException, NoSuchAlgorithmException diff --git a/marklogic-client-api/src/main/java/com/marklogic/client/impl/OkHttpServices.java b/marklogic-client-api/src/main/java/com/marklogic/client/impl/OkHttpServices.java index 26d0ef466..1d89acbc4 100644 --- a/marklogic-client-api/src/main/java/com/marklogic/client/impl/OkHttpServices.java +++ b/marklogic-client-api/src/main/java/com/marklogic/client/impl/OkHttpServices.java @@ -503,7 +503,13 @@ private Response sendRequestOnce(Request request) { try { return getConnection().newCall(request).execute(); } catch (IOException e) { - throw new MarkLogicIOException(e); + String message = String.format( + "Error occurred while calling %s; %s: %s " + + "; possible reasons for the error include that a MarkLogic app server may not be listening on the port, " + + "or MarkLogic was stopped or restarted during the request; check the MarkLogic server logs for more information.", + request.url(), e.getClass().getName(), e.getMessage() + ); + throw new MarkLogicIOException(message, e); } } diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/SSLTest.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/SSLTest.java index cf916a39f..e1025fad5 100644 --- a/marklogic-client-api/src/test/java/com/marklogic/client/test/SSLTest.java +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/SSLTest.java @@ -82,23 +82,9 @@ public void testSSLAuth() throws NoSuchAlgorithmException, KeyManagementExceptio assertEquals(handle.get(), "A simple text document by SSL connection"); docMgr.delete(docId); } catch (MarkLogicIOException e) { - String exception = e.toString(); - String message = exception.toLowerCase(); - - boolean foundExpected = false; - - String[] expectedClasses = {"javax.net.ssl.SSLException", "java.net.UnknownServiceException"}; - String[] expectedMessages = {"unrecognized ssl message", "unable to find acceptable protocols"}; - for (int i=0; i < expectedClasses.length; i++) { - String expectedException = "com.marklogic.client.MarkLogicIOException: " + expectedClasses[i] +": "; - if (exception.startsWith(expectedException) && message.contains(expectedMessages[i])) { - foundExpected = true; - break; - } - } - if (!foundExpected) { - fail("unexpected exception for SSL over HTTPS or HTTP connection:\n"+exception); - } + String message = e.getMessage(); + assertTrue(message.contains("java.net.UnknownServiceException: Unable to find acceptable protocols"), + "Unexpected message: " + message); } }