This is an automated email from the ASF dual-hosted git repository.
joewitt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 8202bff NIFI-8304 This closes #4907. Replaced HttpsURLConnection with
OkHttpClient in TestListenHTTP NIFI-8304 Updated TestPutTCP to shutdown server
before checking connections NIFI-8304 Changed TestListenTCP to send messages in
one byte array NIFI-8304 Added check for expected jdk.tls.disabledAlgorithms
8202bff is described below
commit 8202bffc9835f9c989e4fd3977a98d46a2df77e7
Author: exceptionfactory <[email protected]>
AuthorDate: Wed Mar 17 07:58:36 2021 -0500
NIFI-8304 This closes #4907. Replaced HttpsURLConnection with OkHttpClient
in TestListenHTTP
NIFI-8304 Updated TestPutTCP to shutdown server before checking connections
NIFI-8304 Changed TestListenTCP to send messages in one byte array
NIFI-8304 Added check for expected jdk.tls.disabledAlgorithms
---
.../nifi/processors/standard/InvokeHTTPTest.java | 14 +---
.../nifi/processors/standard/TestListenHTTP.java | 94 +++++++++-------------
.../nifi/processors/standard/TestListenTCP.java | 33 ++------
.../nifi/processors/standard/TestPutTCP.java | 87 ++++++++++----------
.../apache/nifi/web/util/ssl/SslContextUtils.java | 49 +++++++++++
5 files changed, 139 insertions(+), 138 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/InvokeHTTPTest.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/InvokeHTTPTest.java
index ed60215..e7fdaea 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/InvokeHTTPTest.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/InvokeHTTPTest.java
@@ -24,7 +24,6 @@ import org.apache.nifi.flowfile.attributes.CoreAttributes;
import org.apache.nifi.processor.Relationship;
import org.apache.nifi.reporting.InitializationException;
import org.apache.nifi.security.util.KeyStoreUtils;
-import org.apache.nifi.security.util.SslContextFactory;
import org.apache.nifi.security.util.StandardTlsConfiguration;
import org.apache.nifi.security.util.TlsConfiguration;
import org.apache.nifi.security.util.TlsException;
@@ -33,6 +32,7 @@ import org.apache.nifi.util.LogMessage;
import org.apache.nifi.util.MockFlowFile;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
+import org.apache.nifi.web.util.ssl.SslContextUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
@@ -820,10 +820,10 @@ public class InvokeHTTPTest {
private void setSslContextConfiguration(final TlsConfiguration
serverTlsConfiguration, final TlsConfiguration clientTlsConfiguration) throws
InitializationException, TlsException {
final SSLContextService sslContextService = setSslContextService();
- final SSLContext serverSslContext =
getSslContext(serverTlsConfiguration);
+ final SSLContext serverSslContext =
SslContextUtils.createSslContext(serverTlsConfiguration);
setMockWebServerSslSocketFactory(serverSslContext);
- final SSLContext clientSslContext =
getSslContext(clientTlsConfiguration);
+ final SSLContext clientSslContext =
SslContextUtils.createSslContext(clientTlsConfiguration);
when(sslContextService.createContext()).thenReturn(clientSslContext);
when(sslContextService.createTlsConfiguration()).thenReturn(clientTlsConfiguration);
}
@@ -848,12 +848,4 @@ public class InvokeHTTPTest {
}
mockWebServer.useHttps(sslSocketFactory, false);
}
-
- private SSLContext getSslContext(final TlsConfiguration configuration)
throws TlsException {
- final SSLContext sslContext =
SslContextFactory.createSslContext(configuration);
- if (sslContext == null) {
- throw new IllegalArgumentException("SSLContext not found for TLS
Configuration");
- }
- return sslContext;
- }
}
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenHTTP.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenHTTP.java
index f56ccd0..ce5a02b 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenHTTP.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenHTTP.java
@@ -16,25 +16,20 @@
*/
package org.apache.nifi.processors.standard;
-import com.google.common.base.Charsets;
-import java.io.DataOutputStream;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Socket;
-import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.GeneralSecurityException;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Random;
-import java.util.concurrent.TimeUnit;
-import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
@@ -42,6 +37,7 @@ import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
import javax.servlet.http.HttpServletResponse;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
@@ -49,7 +45,6 @@ import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
-import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.nifi.processor.ProcessContext;
import org.apache.nifi.processor.ProcessSessionFactory;
@@ -64,6 +59,7 @@ import org.apache.nifi.ssl.SSLContextService;
import org.apache.nifi.util.MockFlowFile;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
+import org.apache.nifi.web.util.ssl.SslContextUtils;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.thread.ThreadPool;
import org.junit.After;
@@ -83,7 +79,7 @@ public class TestListenHTTP {
private static final String SSL_CONTEXT_SERVICE_IDENTIFIER = "ssl-context";
- private static final String HTTP_POST_METHOD = "POST";
+ private static final MediaType APPLICATION_OCTET_STREAM =
MediaType.get("application/octet-stream");
private static final String HTTP_BASE_PATH = "basePath";
private final static String PORT_VARIABLE = "HTTP_PORT";
@@ -99,6 +95,7 @@ public class TestListenHTTP {
private static final int SOCKET_CONNECT_TIMEOUT = 100;
private static final long SERVER_START_TIMEOUT = 1200000;
+ private static final Duration CLIENT_CALL_TIMEOUT = Duration.ofSeconds(10);
private static TlsConfiguration tlsConfiguration;
private static TlsConfiguration serverConfiguration;
@@ -108,6 +105,7 @@ public class TestListenHTTP {
private static SSLContext serverKeyStoreNoTrustStoreSslContext;
private static SSLContext keyStoreSslContext;
private static SSLContext trustStoreSslContext;
+ private static X509TrustManager trustManager;
private ListenHTTP proc;
private TestRunner runner;
@@ -150,11 +148,11 @@ public class TestListenHTTP {
TLS_1_2
);
- serverKeyStoreSslContext =
SslContextFactory.createSslContext(serverConfiguration);
- final TrustManager[] defaultTrustManagers =
SslContextFactory.getTrustManagers(serverNoTruststoreConfiguration);
- serverKeyStoreNoTrustStoreSslContext =
SslContextFactory.createSslContext(serverNoTruststoreConfiguration,
defaultTrustManagers);
+ serverKeyStoreSslContext =
SslContextUtils.createSslContext(serverConfiguration);
+ trustManager =
SslContextFactory.getX509TrustManager(serverConfiguration);
+ serverKeyStoreNoTrustStoreSslContext =
SslContextFactory.createSslContext(serverNoTruststoreConfiguration, new
TrustManager[]{trustManager});
- keyStoreSslContext = SslContextFactory.createSslContext(new
StandardTlsConfiguration(
+ keyStoreSslContext = SslContextUtils.createSslContext(new
StandardTlsConfiguration(
tlsConfiguration.getKeystorePath(),
tlsConfiguration.getKeystorePassword(),
tlsConfiguration.getKeystoreType(),
@@ -162,7 +160,7 @@ public class TestListenHTTP {
tlsConfiguration.getTruststorePassword(),
tlsConfiguration.getTruststoreType())
);
- trustStoreSslContext = SslContextFactory.createSslContext(new
StandardTlsConfiguration(
+ trustStoreSslContext = SslContextUtils.createSslContext(new
StandardTlsConfiguration(
null,
null,
null,
@@ -354,21 +352,15 @@ public class TestListenHTTP {
public void
testSecureServerTrustStoreConfiguredClientAuthenticationRequired() throws
Exception {
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.REQUIRED,
serverConfiguration);
startSecureServer();
- final HttpsURLConnection connection =
getSecureConnection(trustStoreSslContext);
- assertThrows(SSLException.class, connection::getResponseCode);
-
- final HttpsURLConnection clientCertificateConnection =
getSecureConnection(keyStoreSslContext);
- final int responseCode = clientCertificateConnection.getResponseCode();
- assertEquals(HttpServletResponse.SC_METHOD_NOT_ALLOWED, responseCode);
+ assertThrows(SSLException.class, () -> postMessage(null, true, false));
}
@Test
public void
testSecureServerTrustStoreNotConfiguredClientAuthenticationNotRequired() throws
Exception {
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO,
serverNoTruststoreConfiguration);
startSecureServer();
- final HttpsURLConnection connection =
getSecureConnection(trustStoreSslContext);
- final int responseCode = connection.getResponseCode();
- assertEquals(HttpServletResponse.SC_METHOD_NOT_ALLOWED, responseCode);
+ final int responseCode = postMessage(null, true, true);
+ assertEquals(HttpServletResponse.SC_NO_CONTENT, responseCode);
}
@Test
@@ -462,37 +454,34 @@ public class TestListenHTTP {
startWebServer();
}
- private HttpsURLConnection getSecureConnection(final SSLContext
sslContext) throws Exception {
- final URL url = new URL(buildUrl(true));
- final HttpsURLConnection connection = (HttpsURLConnection)
url.openConnection();
- connection.setSSLSocketFactory(sslContext.getSocketFactory());
- return connection;
- }
-
private int postMessage(String message, boolean secure, boolean
clientAuthRequired) throws Exception {
- String endpointUrl = buildUrl(secure);
- final URL url = new URL(endpointUrl);
- final HttpURLConnection connection = (HttpURLConnection)
url.openConnection();
+ final OkHttpClient okHttpClient = getOkHttpClient(secure,
clientAuthRequired);
+ final Request.Builder requestBuilder = new Request.Builder();
+ final String url = buildUrl(secure);
+ requestBuilder.url(url);
+
+ final byte[] bytes = message == null ? new byte[]{} :
message.getBytes(StandardCharsets.UTF_8);
+ final RequestBody requestBody = RequestBody.create(bytes,
APPLICATION_OCTET_STREAM);
+ final Request request = requestBuilder.post(requestBody).build();
+
+ try (final Response response =
okHttpClient.newCall(request).execute()) {
+ return response.code();
+ }
+ }
- if (connection instanceof HttpsURLConnection) {
- final HttpsURLConnection httpsConnection = (HttpsURLConnection)
connection;
+ private OkHttpClient getOkHttpClient(final boolean secure, final boolean
clientAuthRequired) {
+ final OkHttpClient.Builder builder = new OkHttpClient.Builder();
+ if (secure) {
if (clientAuthRequired) {
-
httpsConnection.setSSLSocketFactory(keyStoreSslContext.getSocketFactory());
+
builder.sslSocketFactory(keyStoreSslContext.getSocketFactory(), trustManager);
} else {
-
httpsConnection.setSSLSocketFactory(trustStoreSslContext.getSocketFactory());
+
builder.sslSocketFactory(trustStoreSslContext.getSocketFactory(), trustManager);
}
}
- connection.setRequestMethod(HTTP_POST_METHOD);
- connection.setDoOutput(true);
- final DataOutputStream wr = new
DataOutputStream(connection.getOutputStream());
+ builder.callTimeout(CLIENT_CALL_TIMEOUT);
- if (message != null) {
- wr.writeBytes(message);
- }
- wr.flush();
- wr.close();
- return connection.getResponseCode();
+ return builder.build();
}
private String buildUrl(final boolean secure) {
@@ -603,20 +592,13 @@ public class TestListenHTTP {
.post(multipartBody)
.build();
- int timeout = 3000;
- OkHttpClient client = new OkHttpClient.Builder()
- .readTimeout(timeout, TimeUnit.MILLISECONDS)
- .writeTimeout(timeout, TimeUnit.MILLISECONDS)
- .build();
-
+ final OkHttpClient client = getOkHttpClient(false, false);
try (Response response = client.newCall(request).execute()) {
Files.deleteIfExists(Paths.get(String.valueOf(file1)));
Files.deleteIfExists(Paths.get(String.valueOf(file2)));
Assert.assertTrue(String.format("Unexpected code: %s, body: %s",
response.code(), response.body()), response.isSuccessful());
}
-
-
runner.assertAllFlowFilesTransferred(ListenHTTP.RELATIONSHIP_SUCCESS,
5);
List<MockFlowFile> flowFilesForRelationship =
runner.getFlowFilesForRelationship(ListenHTTP.RELATIONSHIP_SUCCESS);
// Part fragments are not processed in the order we submitted them.
@@ -673,9 +655,7 @@ public class TestListenHTTP {
final File textFile =
Files.createTempFile(TestListenHTTP.class.getSimpleName(), ".txt").toFile();
textFile.deleteOnExit();
- try (FileOutputStream fos = new FileOutputStream(textFile)) {
- IOUtils.writeLines(Arrays.asList(lines), System.lineSeparator(),
fos, Charsets.UTF_8);
- }
+ Files.write(textFile.toPath(), Arrays.asList(lines));
return textFile;
}
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCP.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCP.java
index 1745002..bcdb4c3 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCP.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCP.java
@@ -16,6 +16,7 @@
*/
package org.apache.nifi.processors.standard;
+import org.apache.commons.lang3.StringUtils;
import org.apache.nifi.remote.io.socket.NetworkUtils;
import org.apache.nifi.reporting.InitializationException;
import org.apache.nifi.security.util.ClientAuth;
@@ -26,7 +27,6 @@ import org.apache.nifi.util.MockFlowFile;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
import org.apache.nifi.web.util.ssl.SslContextUtils;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -76,7 +76,7 @@ public class TestListenTCP {
}
@Test
- public void testListenTCP() throws IOException {
+ public void testRun() throws IOException {
final List<String> messages = new ArrayList<>();
messages.add("This is message 1\n");
messages.add("This is message 2\n");
@@ -93,7 +93,7 @@ public class TestListenTCP {
}
@Test
- public void testListenTCPBatching() throws IOException {
+ public void testRunBatching() throws IOException {
runner.setProperty(ListenTCP.MAX_BATCH_SIZE, "3");
final List<String> messages = new ArrayList<>();
@@ -115,7 +115,7 @@ public class TestListenTCP {
}
@Test
- public void testTLSClientAuthRequiredAndClientCertProvided() throws
IOException, InitializationException {
+ public void testRunClientAuthRequired() throws IOException,
InitializationException {
runner.setProperty(ListenTCP.CLIENT_AUTH, ClientAuth.REQUIRED.name());
enableSslContextService(keyStoreSslContext);
@@ -135,24 +135,7 @@ public class TestListenTCP {
}
@Test
- public void testTLSClientAuthRequiredAndClientCertNotProvided() throws
InitializationException {
- runner.setProperty(ListenTCP.CLIENT_AUTH, ClientAuth.REQUIRED.name());
- enableSslContextService(keyStoreSslContext);
-
- final List<String> messages = new ArrayList<>();
- messages.add("This is message 1\n");
- messages.add("This is message 2\n");
- messages.add("This is message 3\n");
- messages.add("This is message 4\n");
- messages.add("This is message 5\n");
-
- Assert.assertThrows(IOException.class, () ->
- run(messages, messages.size(), trustStoreSslContext)
- );
- }
-
- @Test
- public void testTLSClientAuthNoneAndClientCertNotProvided() throws
IOException, InitializationException {
+ public void testRunClientAuthNone() throws IOException,
InitializationException {
runner.setProperty(ListenTCP.CLIENT_AUTH, ClientAuth.NONE.name());
enableSslContextService(keyStoreSslContext);
@@ -180,11 +163,11 @@ public class TestListenTCP {
// Run Processor and start Dispatcher without shutting down
runner.run(1, false, true);
+ final String message = StringUtils.join(messages, null);
+ final byte[] bytes = message.getBytes(StandardCharsets.UTF_8);
try (final Socket socket = getSocket(port, sslContext)) {
final OutputStream outputStream = socket.getOutputStream();
- for (final String message : messages) {
- outputStream.write(message.getBytes(StandardCharsets.UTF_8));
- }
+ outputStream.write(bytes);
outputStream.flush();
// Run Processor for number of responses
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTCP.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTCP.java
index d6c806f..f1d8a1e 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTCP.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTCP.java
@@ -20,11 +20,11 @@ package org.apache.nifi.processors.standard;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.nifi.processors.standard.util.TCPTestServer;
import org.apache.nifi.security.util.KeyStoreUtils;
-import org.apache.nifi.security.util.SslContextFactory;
import org.apache.nifi.security.util.TlsConfiguration;
import org.apache.nifi.ssl.SSLContextService;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
+import org.apache.nifi.web.util.ssl.SslContextUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -34,8 +34,6 @@ import javax.net.ServerSocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocketFactory;
import java.net.InetAddress;
-import java.nio.file.Files;
-import java.nio.file.Paths;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
@@ -82,7 +80,7 @@ public class TestPutTCP {
@After
public void cleanup() {
runner.shutdown();
- removeTestServer(server);
+ shutdownServer();
}
@Test
@@ -106,35 +104,30 @@ public class TestPutTCP {
configureProperties(TCP_SERVER_ADDRESS, OUTGOING_MESSAGE_DELIMITER,
false);
sendTestData(VALID_FILES);
assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
+ assertServerConnections(1);
}
@Test(timeout = LONG_TEST_TIMEOUT_PERIOD)
public void testRunSuccessSslContextService() throws Exception {
final TlsConfiguration tlsConfiguration =
KeyStoreUtils.createTlsConfigAndNewKeystoreTruststore();
- try {
- final SSLContext sslContext =
SslContextFactory.createSslContext(tlsConfiguration);
- assertNotNull("SSLContext not found", sslContext);
-
- final String identifier = SSLContextService.class.getName();
- final SSLContextService sslContextService =
Mockito.mock(SSLContextService.class);
-
Mockito.when(sslContextService.getIdentifier()).thenReturn(identifier);
-
Mockito.when(sslContextService.createContext()).thenReturn(sslContext);
- runner.addControllerService(identifier, sslContextService);
- runner.enableControllerService(sslContextService);
- runner.setProperty(PutTCP.SSL_CONTEXT_SERVICE, identifier);
-
- final SSLServerSocketFactory serverSocketFactory =
sslContext.getServerSocketFactory();
- createTestServer(OUTGOING_MESSAGE_DELIMITER, false,
serverSocketFactory);
- configureProperties(TCP_SERVER_ADDRESS,
OUTGOING_MESSAGE_DELIMITER, false);
- sendTestData(VALID_FILES);
- assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
- } finally {
-
Files.deleteIfExists(Paths.get(tlsConfiguration.getKeystorePath()));
-
Files.deleteIfExists(Paths.get(tlsConfiguration.getTruststorePath()));
- }
+ final SSLContext sslContext =
SslContextUtils.createSslContext(tlsConfiguration);
+ assertNotNull("SSLContext not found", sslContext);
+
+ final String identifier = SSLContextService.class.getName();
+ final SSLContextService sslContextService =
Mockito.mock(SSLContextService.class);
+ Mockito.when(sslContextService.getIdentifier()).thenReturn(identifier);
+ Mockito.when(sslContextService.createContext()).thenReturn(sslContext);
+ runner.addControllerService(identifier, sslContextService);
+ runner.enableControllerService(sslContextService);
+ runner.setProperty(PutTCP.SSL_CONTEXT_SERVICE, identifier);
+
+ final SSLServerSocketFactory serverSocketFactory =
sslContext.getServerSocketFactory();
+ createTestServer(OUTGOING_MESSAGE_DELIMITER, false,
serverSocketFactory);
+ configureProperties(TCP_SERVER_ADDRESS, OUTGOING_MESSAGE_DELIMITER,
false);
+ sendTestData(VALID_FILES);
+ assertMessagesReceived(VALID_FILES);
+ assertServerConnections(1);
}
@Test(timeout = DEFAULT_TEST_TIMEOUT_PERIOD)
@@ -143,7 +136,7 @@ public class TestPutTCP {
configureProperties(TCP_SERVER_ADDRESS_EL, OUTGOING_MESSAGE_DELIMITER,
false);
sendTestData(VALID_FILES);
assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
+ assertServerConnections(1);
}
@Test(timeout = DEFAULT_TEST_TIMEOUT_PERIOD)
@@ -153,14 +146,14 @@ public class TestPutTCP {
sendTestData(VALID_FILES);
assertTransfers(VALID_FILES.length);
assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
+
runner.setProperty(PutTCP.IDLE_EXPIRATION, "500 ms");
Thread.sleep(1000);
runner.run(1, false, false);
runner.clearTransferState();
sendTestData(VALID_FILES);
assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections after prune senders not matched",
server.getTotalNumConnections(), 2);
+ assertServerConnections(2);
}
@Test(timeout = DEFAULT_TEST_TIMEOUT_PERIOD)
@@ -169,7 +162,7 @@ public class TestPutTCP {
configureProperties(TCP_SERVER_ADDRESS,
OUTGOING_MESSAGE_DELIMITER_MULTI_CHAR, false);
sendTestData(VALID_FILES);
assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
+ assertServerConnections(1);
}
@Test(timeout = LONG_TEST_TIMEOUT_PERIOD)
@@ -178,7 +171,7 @@ public class TestPutTCP {
configureProperties(TCP_SERVER_ADDRESS, OUTGOING_MESSAGE_DELIMITER,
true);
sendTestData(VALID_FILES);
assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), VALID_FILES.length);
+ assertServerConnections(VALID_FILES.length);
}
@Test(timeout = DEFAULT_TEST_TIMEOUT_PERIOD)
@@ -187,19 +180,17 @@ public class TestPutTCP {
configureProperties(TCP_SERVER_ADDRESS, OUTGOING_MESSAGE_DELIMITER,
false);
sendTestData(VALID_FILES);
assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
- removeTestServer(server);
- runner.clearTransferState();
+
+ shutdownServer();
sendTestData(VALID_FILES);
Thread.sleep(500);
- assertNull("Unexpected Data Received", received.poll());
runner.assertQueueEmpty();
- assertEquals("Server Connections after restart not matched",
server.getTotalNumConnections(), 1);
+
createTestServer(OUTGOING_MESSAGE_DELIMITER);
configureProperties(TCP_SERVER_ADDRESS, OUTGOING_MESSAGE_DELIMITER,
false);
sendTestData(VALID_FILES);
assertMessagesReceived(VALID_FILES);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
+ assertServerConnections(1);
}
@Test(timeout = DEFAULT_TEST_TIMEOUT_PERIOD)
@@ -207,9 +198,9 @@ public class TestPutTCP {
createTestServer(OUTGOING_MESSAGE_DELIMITER);
configureProperties(TCP_SERVER_ADDRESS, OUTGOING_MESSAGE_DELIMITER,
false);
sendTestData(EMPTY_FILE);
- assertTransfers(EMPTY_FILE.length);
+ assertTransfers(1);
runner.assertQueueEmpty();
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
+ assertServerConnections(1);
}
@Test(timeout = DEFAULT_TEST_TIMEOUT_PERIOD)
@@ -219,7 +210,7 @@ public class TestPutTCP {
final String[] testData = createContent(VALID_LARGE_FILE_SIZE);
sendTestData(testData);
assertMessagesReceived(testData);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), testData.length);
+ assertServerConnections(testData.length);
}
@Test(timeout = LONG_TEST_TIMEOUT_PERIOD)
@@ -230,7 +221,7 @@ public class TestPutTCP {
configureProperties(TCP_SERVER_ADDRESS, OUTGOING_MESSAGE_DELIMITER,
false);
sendTestData(testData, LOAD_TEST_ITERATIONS, LOAD_TEST_THREAD_COUNT);
assertMessagesReceived(testData, LOAD_TEST_ITERATIONS);
- assertEquals("Server Connections not matched",
server.getTotalNumConnections(), 1);
+ assertServerConnections(1);
}
private void createTestServer(final String delimiter) throws Exception {
@@ -247,7 +238,7 @@ public class TestPutTCP {
port = server.getPort();
}
- private void removeTestServer(final TCPTestServer server) {
+ private void shutdownServer() {
if (server != null) {
server.shutdown();
}
@@ -291,9 +282,9 @@ public class TestPutTCP {
private void assertMessagesReceived(final String[] sentData, final int
iterations) throws Exception {
for (int i = 0; i < iterations; i++) {
for (String item : sentData) {
- List<Byte> message = received.take();
+ final List<Byte> message = received.take();
assertNotNull(String.format("Message [%d] not found", i),
message);
- Byte[] messageBytes = new Byte[message.size()];
+ final Byte[] messageBytes = new Byte[message.size()];
assertArrayEquals(item.getBytes(),
ArrayUtils.toPrimitive(message.toArray(messageBytes)));
}
}
@@ -304,6 +295,12 @@ public class TestPutTCP {
assertNull("Unexpected Message Found", received.poll());
}
+ private void assertServerConnections(final int connections) {
+ // Shutdown server to get completed number of connections
+ shutdownServer();
+ assertEquals("Server Connections not matched",
server.getTotalNumConnections(), connections);
+ }
+
private String[] createContent(final int size) {
final char[] content = new char[size];
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/ssl/SslContextUtils.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/ssl/SslContextUtils.java
index e527da9..b647b1a 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/ssl/SslContextUtils.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/ssl/SslContextUtils.java
@@ -16,15 +16,37 @@
*/
package org.apache.nifi.web.util.ssl;
+import org.apache.commons.lang3.StringUtils;
import org.apache.nifi.security.util.KeystoreType;
import org.apache.nifi.security.util.SslContextFactory;
import org.apache.nifi.security.util.StandardTlsConfiguration;
import org.apache.nifi.security.util.TlsConfiguration;
import org.apache.nifi.security.util.TlsException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.security.Security;
public class SslContextUtils {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(SslContextUtils.class);
+
+ private static final String TLS_DISABLED_ALGORITHMS_PROPERTY =
"jdk.tls.disabledAlgorithms";
+
+ private static final String DISABLED_ALGORITHMS = "SSLv3, RC4, DES,
MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL,
include jdk.disabled.namedCurves";
+
+ static {
+ final String disabledAlgorithms =
Security.getProperty(TLS_DISABLED_ALGORITHMS_PROPERTY);
+ if (DISABLED_ALGORITHMS.equals(disabledAlgorithms)) {
+ LOGGER.debug("Found Expected Default TLS Disabled Algorithms: {}",
DISABLED_ALGORITHMS);
+ } else {
+ LOGGER.warn("Found System Default TLS Disabled Algorithms: {}",
disabledAlgorithms);
+ LOGGER.warn("Setting TLS Disabled Algorithms: {}",
DISABLED_ALGORITHMS);
+ Security.setProperty(TLS_DISABLED_ALGORITHMS_PROPERTY,
DISABLED_ALGORITHMS);
+ }
+ }
+
private static final String KEYSTORE_PATH =
"src/test/resources/keystore.jks";
private static final String KEYSTORE_AND_TRUSTSTORE_PASSWORD =
"passwordpassword";
@@ -72,4 +94,31 @@ public class SslContextUtils {
public static SSLContext createTrustStoreSslContext() throws TlsException {
return
SslContextFactory.createSslContext(TRUSTSTORE_TLS_CONFIGURATION);
}
+
+ /**
+ * Create SSLContext using Keystore and Truststore with deleteOnExit() for
files
+ *
+ * @param tlsConfiguration TLS Configuration
+ * @return SSLContext configured with generated Keystore and Truststore
+ * @throws TlsException Thrown on SslContextFactory.createSslContext()
+ */
+ public static SSLContext createSslContext(final TlsConfiguration
tlsConfiguration) throws TlsException {
+ final String keystorePath = tlsConfiguration.getKeystorePath();
+ if (StringUtils.isNotBlank(keystorePath)) {
+ final File keystoreFile = new File(keystorePath);
+ keystoreFile.deleteOnExit();
+ }
+
+ final String truststorePath = tlsConfiguration.getTruststorePath();
+ if (StringUtils.isNotBlank(truststorePath)) {
+ final File truststoreFile = new File(truststorePath);
+ truststoreFile.deleteOnExit();
+ }
+
+ final SSLContext sslContext =
SslContextFactory.createSslContext(tlsConfiguration);
+ if (sslContext == null) {
+ throw new TlsException(String.format("Failed to create SSLContext
from Configuration %s", tlsConfiguration));
+ }
+ return sslContext;
+ }
}