1
0
mirror of https://github.com/square/okhttp.git synced 2025-08-07 12:42:57 +03:00

Run CircleCI with multiple platforms (#4864)

Run in CircleCI.
Also conditionally disables tests that show issues with Conscrypt/OkHttp (client auth etc).
This commit is contained in:
Yuri Schimke
2019-04-03 15:45:05 +01:00
committed by GitHub
parent b0bc07f9ac
commit 1f93359f15
9 changed files with 114 additions and 29 deletions

View File

@@ -5,8 +5,6 @@ jobs:
docker: docker:
- image: circleci/openjdk:8u171-jdk - image: circleci/openjdk:8u171-jdk
working_directory: ~/repo
environment: environment:
JVM_OPTS: -Xmx768m JVM_OPTS: -Xmx768m
TERM: dumb TERM: dumb
@@ -36,8 +34,6 @@ jobs:
docker: docker:
- image: circleci/openjdk:8u171-jdk - image: circleci/openjdk:8u171-jdk
working_directory: ~/repo
environment: environment:
JVM_OPTS: -Xmx1g JVM_OPTS: -Xmx1g
TERM: dumb TERM: dumb
@@ -72,8 +68,6 @@ jobs:
docker: docker:
- image: circleci/openjdk:8u171-jdk - image: circleci/openjdk:8u171-jdk
working_directory: ~/testrepo
environment: environment:
JVM_OPTS: -Xmx1g JVM_OPTS: -Xmx1g
TERM: dumb TERM: dumb
@@ -126,8 +120,6 @@ jobs:
docker: docker:
- image: circleci/openjdk:11.0.2-jdk - image: circleci/openjdk:11.0.2-jdk
working_directory: ~/testrepo11
environment: environment:
JVM_OPTS: -Xmx1g JVM_OPTS: -Xmx1g
TERM: dumb TERM: dumb
@@ -146,7 +138,7 @@ jobs:
name: Run tests name: Run tests
command: ./gradlew --build-cache --parallel test command: ./gradlew --build-cache --parallel test
environment: environment:
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=3 -Xmx1G GRADLE_OPTS: -Dorg.gradle.daemon=false -Dokhttp.platform=jdk9 -Dorg.gradle.workers.max=3 -Xmx1G
- save_cache: - save_cache:
paths: paths:
@@ -157,24 +149,76 @@ jobs:
- run: - run:
name: Save test results name: Save test results
command: | command: |
mkdir -p ~/testrepo11/test-results/junit/ mkdir -p ~/test-results/junit/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/testrepo11/test-results/junit/ \; find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/junit/ \;
when: always when: always
- store_test_results: - store_test_results:
name: Store test results name: Store test results
path: ~/testrepo11/test-results path: ~/test-results
- run: - run:
name: Save gradle reports name: Save gradle reports
command: | command: |
mkdir -p ~/testrepo11/reports/ mkdir -p ~/reports/
tar cf - */build/reports | (cd ~/testrepo11/reports/; tar xf -) tar cf - */build/reports | (cd ~/reports/; tar xf -)
when: always when: always
- store_artifacts: - store_artifacts:
name: Store gradle reports name: Store gradle reports
path: ~/testrepo11/reports path: ~/reports
testconscrypt:
docker:
- image: circleci/openjdk:11.0.2-jdk
environment:
JVM_OPTS: -Xmx1g
TERM: dumb
steps:
- checkout
- restore_cache:
keys:
- v3-{{ checksum "build.gradle" }}-{{ .Branch }}-testconscrypt
- v3-{{ checksum "build.gradle" }}-{{ .Branch }}
- v3-{{ checksum "build.gradle" }}-master
- v3-{{ checksum "build.gradle" }}
- run:
name: Run tests
command: ./gradlew --build-cache --parallel test
environment:
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dokhttp.platform=conscrypt -Dorg.gradle.workers.max=3 -Xmx1G
- save_cache:
paths:
- ~/.gradle/caches
- ~/.gradle/wrapper
key: v3-{{ checksum "build.gradle" }}-{{ .Branch }}-testconscrypt
- run:
name: Save test results
command: |
mkdir -p ~/test-results/junit/
find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/test-results/junit/ \;
when: always
- store_test_results:
name: Store test results
path: ~/test-results
- run:
name: Save gradle reports
command: |
mkdir -p ~/reports/
tar cf - */build/reports | (cd ~/reports/; tar xf -)
when: always
- store_artifacts:
name: Store gradle reports
path: ~/reports
workflows: workflows:
version: 2 version: 2
@@ -196,6 +240,12 @@ workflows:
filters: filters:
branches: branches:
only: master only: master
- testconscrypt:
requires:
- compile
filters:
branches:
only: master
nightly: nightly:
triggers: triggers:
- schedule: - schedule:
@@ -214,3 +264,6 @@ workflows:
- testjdk11: - testjdk11:
requires: requires:
- compile - compile
- testconscrypt:
requires:
- compile

View File

@@ -103,24 +103,32 @@ subprojects { project ->
signature 'org.codehaus.mojo.signature:java18:1.0@signature' signature 'org.codehaus.mojo.signature:java18:1.0@signature'
} }
def platform = System.getProperty("okhttp.platform", "platform")
test { test {
jvmArgs += "-Dlistener=okhttp3.testing.InstallUncaughtExceptionHandlerListener" jvmArgs += "-Dlistener=okhttp3.testing.InstallUncaughtExceptionHandlerListener"
jvmArgs += "-Dokhttp.platform=platform" jvmArgs += "-Dokhttp.platform=$platform"
testLogging { testLogging {
exceptionFormat = 'full' exceptionFormat = 'full'
} }
} }
// Add alpn-boot on Java 8 so we can use HTTP/2 without a stable API. if (platform == "platform") {
def alpnBootVersion = alpnBootVersion() // Add alpn-boot on Java 8 so we can use HTTP/2 without a stable API.
if (alpnBootVersion != null) { def alpnBootVersion = alpnBootVersion()
dependencies { if (alpnBootVersion != null) {
testCompile "org.mortbay.jetty.alpn:alpn-boot:$alpnBootVersion" dependencies {
testCompile "org.mortbay.jetty.alpn:alpn-boot:$alpnBootVersion"
}
def alpnBootJar = configurations.testCompile.find { it.name.startsWith("alpn-boot-") }
test {
jvmArgs += "-Xbootclasspath/p:${alpnBootJar}"
}
} }
def alpnBootJar = configurations.testCompile.find { it.name.startsWith("alpn-boot-") } } else if (platform == "conscrypt") {
test { dependencies {
jvmArgs += "-Xbootclasspath/p:${alpnBootJar}" testRuntime "org.conscrypt:conscrypt-openjdk-uber:${versions.conscrypt}"
} }
} }

View File

@@ -53,6 +53,7 @@ import static okhttp3.tls.internal.TlsUtil.localhost;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.data.Offset.offset; import static org.assertj.core.data.Offset.offset;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.junit.Assume.assumeFalse;
public final class MockWebServerTest { public final class MockWebServerTest {
@Rule public final MockWebServer server = new MockWebServer(); @Rule public final MockWebServer server = new MockWebServer();
@@ -533,6 +534,8 @@ public final class MockWebServerTest {
} }
@Test public void httpsWithClientAuth() throws Exception { @Test public void httpsWithClientAuth() throws Exception {
assumeFalse(getPlatform().equals("conscrypt"));
HeldCertificate clientCa = new HeldCertificate.Builder() HeldCertificate clientCa = new HeldCertificate.Builder()
.certificateAuthority(0) .certificateAuthority(0)
.build(); .build();
@@ -579,4 +582,8 @@ public final class MockWebServerTest {
assertThat(handshake.peerPrincipal()).isNotNull(); assertThat(handshake.peerPrincipal()).isNotNull();
assertThat(handshake.peerCertificates().size()).isEqualTo(1); assertThat(handshake.peerCertificates().size()).isEqualTo(1);
} }
public static String getPlatform() {
return System.getProperty("okhttp.platform", "platform");
}
} }

View File

@@ -19,6 +19,7 @@ import java.io.IOException;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Pattern;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HostnameVerifier;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
@@ -853,7 +854,7 @@ public final class HttpLoggingInterceptorTest {
LogRecorder assertLogMatch(String pattern) { LogRecorder assertLogMatch(String pattern) {
assertThat(index).overridingErrorMessage("No more messages found").isLessThan(logs.size()); assertThat(index).overridingErrorMessage("No more messages found").isLessThan(logs.size());
String actual = logs.get(index++); String actual = logs.get(index++);
assertThat(actual).matches(pattern); assertThat(actual).matches(Pattern.compile(pattern, Pattern.DOTALL));
return this; return this;
} }

View File

@@ -209,9 +209,9 @@ public final class LoggingEventListenerTest {
.assertLogMatch("connectStart: " + url.host() + "/.+ DIRECT") .assertLogMatch("connectStart: " + url.host() + "/.+ DIRECT")
.assertLogMatch("secureConnectStart") .assertLogMatch("secureConnectStart")
.assertLogMatch( .assertLogMatch(
"connectFailed: null javax\\.net\\.ssl\\.SSLProtocolException: (?:Unexpected handshake message: client_hello|Handshake message sequence violation, 1)") "connectFailed: null javax\\.net\\.ssl\\.(?:SSLProtocolException|SSLHandshakeException): (?:Unexpected handshake message: client_hello|Handshake message sequence violation, 1|Read error).*")
.assertLogMatch( .assertLogMatch(
"callFailed: javax\\.net\\.ssl\\.SSLProtocolException: (?:Unexpected handshake message: client_hello|Handshake message sequence violation, 1)") "callFailed: javax\\.net\\.ssl\\.(?:SSLProtocolException|SSLHandshakeException): (?:Unexpected handshake message: client_hello|Handshake message sequence violation, 1|Read error).*")
.assertNoMoreLogs(); .assertNoMoreLogs();
} }

View File

@@ -22,7 +22,6 @@ import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@@ -40,6 +39,7 @@ import org.junit.Test;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static okhttp3.internal.Util.closeQuietly; import static okhttp3.internal.Util.closeQuietly;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assume.assumeFalse;
public final class HandshakeCertificatesTest { public final class HandshakeCertificatesTest {
private ExecutorService executorService; private ExecutorService executorService;
@@ -55,6 +55,8 @@ public final class HandshakeCertificatesTest {
} }
@Test public void clientAndServer() throws Exception { @Test public void clientAndServer() throws Exception {
assumeFalse(getPlatform().equals("conscrypt"));
HeldCertificate clientRoot = new HeldCertificate.Builder() HeldCertificate clientRoot = new HeldCertificate.Builder()
.certificateAuthority(1) .certificateAuthority(1)
.build(); .build();
@@ -188,4 +190,8 @@ public final class HandshakeCertificatesTest {
assertThat(ByteString.of(actual.getEncoded())).isEqualTo( assertThat(ByteString.of(actual.getEncoded())).isEqualTo(
ByteString.of(expected.getEncoded())); ByteString.of(expected.getEncoded()));
} }
public static String getPlatform() {
return System.getProperty("okhttp.platform", "platform");
}
} }

View File

@@ -93,6 +93,7 @@ import static okhttp3.CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256;
import static okhttp3.TestUtil.awaitGarbageCollection; import static okhttp3.TestUtil.awaitGarbageCollection;
import static okhttp3.internal.InternalKtKt.addHeaderLenient; import static okhttp3.internal.InternalKtKt.addHeaderLenient;
import static okhttp3.internal.platform.PlatformTest.getJvmSpecVersion; import static okhttp3.internal.platform.PlatformTest.getJvmSpecVersion;
import static okhttp3.internal.platform.PlatformTest.getPlatform;
import static okhttp3.tls.internal.TlsUtil.localhost; import static okhttp3.tls.internal.TlsUtil.localhost;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.data.Offset.offset; import static org.assertj.core.data.Offset.offset;
@@ -1142,6 +1143,8 @@ public final class CallTest {
} }
@Test public void recoverFromTlsHandshakeFailure_tlsFallbackScsvEnabled() throws Exception { @Test public void recoverFromTlsHandshakeFailure_tlsFallbackScsvEnabled() throws Exception {
assumeFalse(getPlatform().equals("conscrypt"));
final String tlsFallbackScsv = "TLS_FALLBACK_SCSV"; final String tlsFallbackScsv = "TLS_FALLBACK_SCSV";
List<String> supportedCiphers = List<String> supportedCiphers =
asList(handshakeCertificates.sslSocketFactory().getSupportedCipherSuites()); asList(handshakeCertificates.sslSocketFactory().getSupportedCipherSuites());
@@ -1253,6 +1256,8 @@ public final class CallTest {
* man-in-the-middle attacks. https://bugs.openjdk.java.net/browse/JDK-8212823 * man-in-the-middle attacks. https://bugs.openjdk.java.net/browse/JDK-8212823
*/ */
@Test public void anonCipherSuiteUnsupported() throws Exception { @Test public void anonCipherSuiteUnsupported() throws Exception {
assumeFalse(getPlatform().equals("conscrypt"));
// The _anon_ suites became unsupported in "1.8.0_201" and "11.0.2". // The _anon_ suites became unsupported in "1.8.0_201" and "11.0.2".
assumeFalse(System.getProperty("java.version", "unknown").matches("1\\.8\\.0_1\\d\\d")); assumeFalse(System.getProperty("java.version", "unknown").matches("1\\.8\\.0_1\\d\\d"));
assumeFalse(System.getProperty("java.version", "unknown").matches("11")); assumeFalse(System.getProperty("java.version", "unknown").matches("11"));

View File

@@ -34,8 +34,10 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static okhttp3.internal.platform.PlatformTest.getPlatform;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.junit.Assume.assumeFalse;
public final class ConnectionCoalescingTest { public final class ConnectionCoalescingTest {
@Rule public final MockWebServer server = new MockWebServer(); @Rule public final MockWebServer server = new MockWebServer();
@@ -50,6 +52,8 @@ public final class ConnectionCoalescingTest {
private List<InetAddress> serverIps; private List<InetAddress> serverIps;
@Before public void setUp() throws Exception { @Before public void setUp() throws Exception {
assumeFalse(getPlatform().equals("conscrypt"));
rootCa = new HeldCertificate.Builder() rootCa = new HeldCertificate.Builder()
.serialNumber(1L) .serialNumber(1L)
.certificateAuthority(0) .certificateAuthority(0)

View File

@@ -19,7 +19,6 @@ import java.net.SocketException;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.Arrays;
import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException; import javax.net.ssl.SSLException;
@@ -64,6 +63,8 @@ public final class ClientAuthTest {
@Before @Before
public void setUp() { public void setUp() {
assumeFalse(getPlatform().equals("conscrypt"));
serverRootCa = new HeldCertificate.Builder() serverRootCa = new HeldCertificate.Builder()
.serialNumber(1L) .serialNumber(1L)
.certificateAuthority(1) .certificateAuthority(1)