Add 'sdk/java-v2/' from commit '55f103e336ca9fb8bf1720d2ef4ee8dd4e221118'
[arvados.git] / sdk / java-v2 / src / test / java / org / arvados / client / api / client / factory / OkHttpClientFactoryTest.java
diff --git a/sdk/java-v2/src/test/java/org/arvados/client/api/client/factory/OkHttpClientFactoryTest.java b/sdk/java-v2/src/test/java/org/arvados/client/api/client/factory/OkHttpClientFactoryTest.java
new file mode 100644 (file)
index 0000000..f7e1813
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) The Arvados Authors. All rights reserved.
+ *
+ * SPDX-License-Identifier: AGPL-3.0 OR Apache-2.0
+ *
+ */
+
+package org.arvados.client.api.client.factory;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.mockwebserver.MockResponse;
+import org.arvados.client.test.utils.ArvadosClientMockedWebServerTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManagerFactory;
+import java.io.FileInputStream;
+import java.security.KeyStore;
+
+
+@RunWith(MockitoJUnitRunner.class)
+public class OkHttpClientFactoryTest extends ArvadosClientMockedWebServerTest {
+
+    @Test(expected = javax.net.ssl.SSLHandshakeException.class)
+    public void secureOkHttpClientIsCreated() throws Exception {
+
+        // given
+        OkHttpClientFactory factory = OkHttpClientFactory.builder().build();
+        // * configure HTTPS server
+        SSLSocketFactory sf = getSSLSocketFactoryWithSelfSignedCertificate();
+        server.useHttps(sf, false);
+        server.enqueue(new MockResponse().setBody("OK"));
+        // * prepare client HTTP request
+        Request request = new Request.Builder()
+                .url("https://localhost:9000/")
+                .build();
+
+        // when - then (SSL certificate is verified)
+        OkHttpClient actual = factory.create(false);
+        Response response = actual.newCall(request).execute();
+    }
+
+    @Test
+    public void insecureOkHttpClientIsCreated() throws Exception {
+        // given
+        OkHttpClientFactory factory = OkHttpClientFactory.builder().build();
+        // * configure HTTPS server
+        SSLSocketFactory sf = getSSLSocketFactoryWithSelfSignedCertificate();
+        server.useHttps(sf, false);
+        server.enqueue(new MockResponse().setBody("OK"));
+        // * prepare client HTTP request
+        Request request = new Request.Builder()
+                .url("https://localhost:9000/")
+                .build();
+
+        // when (SSL certificate is not verified)
+        OkHttpClient actual = factory.create(true);
+        Response response = actual.newCall(request).execute();
+
+        // then
+        Assert.assertEquals(response.body().string(),"OK");
+    }
+
+
+    /*
+        This ugly boilerplate is needed to enable self signed certificate.
+
+        It requires selfsigned.keystore.jks file. It was generated with:
+        keytool -genkey -v -keystore mystore.keystore.jks -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
+     */
+    public SSLSocketFactory getSSLSocketFactoryWithSelfSignedCertificate() throws Exception {
+
+        FileInputStream stream = new FileInputStream("src/test/resources/selfsigned.keystore.jks");
+        char[] serverKeyStorePassword = "123456".toCharArray();
+        KeyStore serverKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+        serverKeyStore.load(stream, serverKeyStorePassword);
+
+        String kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance(kmfAlgorithm);
+        kmf.init(serverKeyStore, serverKeyStorePassword);
+
+        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(kmfAlgorithm);
+        trustManagerFactory.init(serverKeyStore);
+
+        SSLContext sslContext = SSLContext.getInstance("SSL");
+        sslContext.init(kmf.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
+        return sslContext.getSocketFactory();
+    }
+}