mirror of
https://github.com/square/okhttp.git
synced 2025-08-08 23:42:08 +03:00
Improve PlatformRule autodetection (#4920)
Run more platforms in circleci. Auto detect platform in IDE. Surface more platform assumptions in tests.
This commit is contained in:
@@ -1,5 +1,53 @@
|
|||||||
# Check https://circleci.com/docs/2.0/language-java/ for more details
|
|
||||||
version: 2.1
|
version: 2.1
|
||||||
|
|
||||||
|
commands:
|
||||||
|
runtests:
|
||||||
|
description: "Run tests"
|
||||||
|
parameters:
|
||||||
|
platform:
|
||||||
|
type: string
|
||||||
|
steps:
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
# restore compilation and wrapper from previous branch/job build or master
|
||||||
|
- v4-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
|
||||||
|
- v4-master-compile
|
||||||
|
|
||||||
|
- run:
|
||||||
|
name: Run tests
|
||||||
|
command: ./gradlew --build-cache --parallel --continue test
|
||||||
|
environment:
|
||||||
|
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dokhttp.platform=<< parameters.platform >> -Dorg.gradle.workers.max=3 -Xmx1G
|
||||||
|
|
||||||
|
- save_cache:
|
||||||
|
paths:
|
||||||
|
- ~/.gradle/caches
|
||||||
|
- ~/.gradle/wrapper
|
||||||
|
key: v4-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
|
||||||
|
when: always
|
||||||
|
|
||||||
|
- 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
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
compile:
|
compile:
|
||||||
docker:
|
docker:
|
||||||
@@ -49,7 +97,7 @@ jobs:
|
|||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Run checks
|
name: Run checks
|
||||||
command: ./gradlew --parallel --build-cache check -x test
|
command: ./gradlew --parallel --continue --build-cache check -x test
|
||||||
environment:
|
environment:
|
||||||
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=3 -Xmx1G
|
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=3 -Xmx1G
|
||||||
|
|
||||||
@@ -75,47 +123,22 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
|
||||||
- restore_cache:
|
- runtests:
|
||||||
keys:
|
platform: jdk8
|
||||||
# restore compilation and wrapper from previous branch/job build or master
|
|
||||||
# master-compile is published on each build (cron or master commit) so is fresher
|
testjdk8alpn:
|
||||||
- v4-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
|
docker:
|
||||||
- v4-master-compile
|
- image: circleci/openjdk:8u171-jdk
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Run tests
|
|
||||||
command: ./gradlew --parallel --build-cache test
|
|
||||||
environment:
|
environment:
|
||||||
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=3 -Xmx1G
|
JVM_OPTS: -Xmx1g
|
||||||
|
TERM: dumb
|
||||||
|
|
||||||
- save_cache:
|
steps:
|
||||||
paths:
|
- checkout
|
||||||
- ~/.gradle/caches
|
|
||||||
- ~/.gradle/wrapper
|
|
||||||
key: v4-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
|
|
||||||
when: always
|
|
||||||
|
|
||||||
- run:
|
- runtests:
|
||||||
name: Save test results
|
platform: jdk8alpn
|
||||||
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
|
|
||||||
|
|
||||||
testjdk11:
|
testjdk11:
|
||||||
docker:
|
docker:
|
||||||
@@ -128,46 +151,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
|
||||||
- restore_cache:
|
- runtests:
|
||||||
keys:
|
platform: jdk9
|
||||||
# restore compilation and wrapper from previous branch/job build or master
|
|
||||||
- v4-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
|
|
||||||
- v4-master-compile
|
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Run tests
|
|
||||||
command: ./gradlew --build-cache --parallel test
|
|
||||||
environment:
|
|
||||||
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dokhttp.platform=jdk9 -Dorg.gradle.workers.max=3 -Xmx1G
|
|
||||||
|
|
||||||
- save_cache:
|
|
||||||
paths:
|
|
||||||
- ~/.gradle/caches
|
|
||||||
- ~/.gradle/wrapper
|
|
||||||
key: v4-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
|
|
||||||
when: always
|
|
||||||
|
|
||||||
- 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
|
|
||||||
|
|
||||||
testconscrypt:
|
testconscrypt:
|
||||||
docker:
|
docker:
|
||||||
@@ -180,46 +165,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
|
||||||
- restore_cache:
|
- runtests:
|
||||||
keys:
|
platform: conscrypt
|
||||||
# restore compilation and wrapper from previous branch/job build or master
|
|
||||||
- v4-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
|
|
||||||
- v4-master-compile
|
|
||||||
|
|
||||||
- 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: v4-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
|
|
||||||
when: always
|
|
||||||
|
|
||||||
- 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
|
||||||
@@ -233,7 +180,11 @@ workflows:
|
|||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
ignore: master
|
ignore: master
|
||||||
- testjdk8
|
- testjdk8:
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: master
|
||||||
|
- testjdk8alpn
|
||||||
- testjdk11:
|
- testjdk11:
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
@@ -257,6 +208,9 @@ workflows:
|
|||||||
- testjdk8:
|
- testjdk8:
|
||||||
requires:
|
requires:
|
||||||
- compile
|
- compile
|
||||||
|
- testjdk8alpn:
|
||||||
|
requires:
|
||||||
|
- compile
|
||||||
- testjdk11:
|
- testjdk11:
|
||||||
requires:
|
requires:
|
||||||
- compile
|
- compile
|
||||||
|
@@ -116,7 +116,7 @@ subprojects { project ->
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (platform == "jdk8") {
|
if (platform == "jdk8alpn") {
|
||||||
// Add alpn-boot on Java 8 so we can use HTTP/2 without a stable API.
|
// Add alpn-boot on Java 8 so we can use HTTP/2 without a stable API.
|
||||||
def alpnBootVersion = alpnBootVersion()
|
def alpnBootVersion = alpnBootVersion()
|
||||||
if (alpnBootVersion != null) {
|
if (alpnBootVersion != null) {
|
||||||
|
@@ -25,6 +25,7 @@ import javax.net.ssl.HostnameVerifier;
|
|||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
import okhttp3.MediaType;
|
import okhttp3.MediaType;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.PlatformRule;
|
||||||
import okhttp3.Protocol;
|
import okhttp3.Protocol;
|
||||||
import okhttp3.RecordingHostnameVerifier;
|
import okhttp3.RecordingHostnameVerifier;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
@@ -51,6 +52,7 @@ import static org.junit.Assume.assumeThat;
|
|||||||
public final class HttpLoggingInterceptorTest {
|
public final class HttpLoggingInterceptorTest {
|
||||||
private static final MediaType PLAIN = MediaType.get("text/plain; charset=utf-8");
|
private static final MediaType PLAIN = MediaType.get("text/plain; charset=utf-8");
|
||||||
|
|
||||||
|
@Rule public final PlatformRule platform = new PlatformRule();
|
||||||
@Rule public final MockWebServer server = new MockWebServer();
|
@Rule public final MockWebServer server = new MockWebServer();
|
||||||
|
|
||||||
private final HandshakeCertificates handshakeCertificates = localhost();
|
private final HandshakeCertificates handshakeCertificates = localhost();
|
||||||
@@ -784,6 +786,8 @@ public final class HttpLoggingInterceptorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void duplexRequestsAreNotLogged() throws Exception {
|
@Test public void duplexRequestsAreNotLogged() throws Exception {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
server.useHttps(handshakeCertificates.sslSocketFactory(), false); // HTTP/2
|
server.useHttps(handshakeCertificates.sslSocketFactory(), false); // HTTP/2
|
||||||
url = server.url("/");
|
url = server.url("/");
|
||||||
|
|
||||||
|
@@ -20,6 +20,7 @@ import java.net.UnknownHostException;
|
|||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
import okhttp3.MediaType;
|
import okhttp3.MediaType;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.PlatformRule;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.RequestBody;
|
import okhttp3.RequestBody;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
@@ -41,6 +42,7 @@ import static org.junit.Assert.fail;
|
|||||||
public final class LoggingEventListenerTest {
|
public final class LoggingEventListenerTest {
|
||||||
private static final MediaType PLAIN = MediaType.get("text/plain");
|
private static final MediaType PLAIN = MediaType.get("text/plain");
|
||||||
|
|
||||||
|
@Rule public final PlatformRule platform = new PlatformRule();
|
||||||
@Rule public final MockWebServer server = new MockWebServer();
|
@Rule public final MockWebServer server = new MockWebServer();
|
||||||
|
|
||||||
private final HandshakeCertificates handshakeCertificates = localhost();
|
private final HandshakeCertificates handshakeCertificates = localhost();
|
||||||
@@ -139,6 +141,8 @@ public final class LoggingEventListenerTest {
|
|||||||
assertThat(response.body()).isNotNull();
|
assertThat(response.body()).isNotNull();
|
||||||
response.body().bytes();
|
response.body().bytes();
|
||||||
|
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
logRecorder
|
logRecorder
|
||||||
.assertLogMatch("callStart: Request\\{method=GET, url=" + url + ", tags=\\{\\}\\}")
|
.assertLogMatch("callStart: Request\\{method=GET, url=" + url + ", tags=\\{\\}\\}")
|
||||||
.assertLogMatch("dnsStart: " + url.host())
|
.assertLogMatch("dnsStart: " + url.host())
|
||||||
|
@@ -2,5 +2,7 @@ dependencies {
|
|||||||
api project(':okhttp')
|
api project(':okhttp')
|
||||||
api deps.junit
|
api deps.junit
|
||||||
api deps.assertj
|
api deps.assertj
|
||||||
|
api deps.conscrypt
|
||||||
|
|
||||||
compileOnly deps.jsr305
|
compileOnly deps.jsr305
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package okhttp3
|
package okhttp3
|
||||||
|
|
||||||
|
import okhttp3.internal.platform.ConscryptPlatform
|
||||||
|
import okhttp3.internal.platform.Jdk8WithJettyBootPlatform
|
||||||
|
import okhttp3.internal.platform.Jdk9Platform
|
||||||
import okhttp3.internal.platform.Platform
|
import okhttp3.internal.platform.Platform
|
||||||
import org.conscrypt.Conscrypt
|
import org.conscrypt.Conscrypt
|
||||||
import org.hamcrest.CoreMatchers.equalTo
|
import org.hamcrest.CoreMatchers.equalTo
|
||||||
@@ -29,6 +32,7 @@ import java.security.Security
|
|||||||
*
|
*
|
||||||
* Also allows a test file to state general platform assumptions, or for individual test.
|
* Also allows a test file to state general platform assumptions, or for individual test.
|
||||||
*/
|
*/
|
||||||
|
@Suppress("unused", "MemberVisibilityCanBePrivate")
|
||||||
open class PlatformRule @JvmOverloads constructor(
|
open class PlatformRule @JvmOverloads constructor(
|
||||||
val requiredPlatformName: String? = null,
|
val requiredPlatformName: String? = null,
|
||||||
val platform: Platform? = null
|
val platform: Platform? = null
|
||||||
@@ -55,30 +59,60 @@ open class PlatformRule @JvmOverloads constructor(
|
|||||||
|
|
||||||
fun isJdk9() = getPlatformSystemProperty() == JDK9_PROPERTY
|
fun isJdk9() = getPlatformSystemProperty() == JDK9_PROPERTY
|
||||||
|
|
||||||
fun isJdk8() = getPlatformSystemProperty() == DEFAULT_PROPERTY
|
fun isJdk8() = getPlatformSystemProperty() == JDK8_PROPERTY
|
||||||
|
|
||||||
|
fun isJdk8Alpn() = getPlatformSystemProperty() == JDK8_ALPN_PROPERTY
|
||||||
|
|
||||||
|
fun hasHttp2Support() = !isJdk8()
|
||||||
|
|
||||||
fun assumeConscrypt() {
|
fun assumeConscrypt() {
|
||||||
assumeThat(getPlatformSystemProperty(), equalTo(CONSCRYPT_PROPERTY))
|
assumeThat(getPlatformSystemProperty(), equalTo(
|
||||||
|
CONSCRYPT_PROPERTY))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun assumeJdk9() {
|
fun assumeJdk9() {
|
||||||
assumeThat(getPlatformSystemProperty(), equalTo(JDK9_PROPERTY))
|
assumeThat(getPlatformSystemProperty(), equalTo(
|
||||||
|
JDK9_PROPERTY))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun assumeJdk8() {
|
fun assumeJdk8() {
|
||||||
assumeThat(getPlatformSystemProperty(), equalTo(DEFAULT_PROPERTY))
|
assumeThat(getPlatformSystemProperty(), equalTo(
|
||||||
|
JDK8_PROPERTY))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assumeJdk8Alpn() {
|
||||||
|
assumeThat(getPlatformSystemProperty(), equalTo(
|
||||||
|
JDK8_ALPN_PROPERTY))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assumeHttp2Support() {
|
||||||
|
assumeThat(getPlatformSystemProperty(), not(
|
||||||
|
JDK8_PROPERTY))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun assumeNotConscrypt() {
|
fun assumeNotConscrypt() {
|
||||||
assumeThat(getPlatformSystemProperty(), not(CONSCRYPT_PROPERTY))
|
assumeThat(getPlatformSystemProperty(), not(
|
||||||
|
CONSCRYPT_PROPERTY))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun assumeNotJdk9() {
|
fun assumeNotJdk9() {
|
||||||
assumeThat(getPlatformSystemProperty(), not(JDK9_PROPERTY))
|
assumeThat(getPlatformSystemProperty(), not(
|
||||||
|
JDK9_PROPERTY))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun assumeNotJdk8() {
|
fun assumeNotJdk8() {
|
||||||
assumeThat(getPlatformSystemProperty(), not(DEFAULT_PROPERTY))
|
assumeThat(getPlatformSystemProperty(), not(
|
||||||
|
JDK8_PROPERTY))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assumeNotJdk8Alpn() {
|
||||||
|
assumeThat(getPlatformSystemProperty(), not(
|
||||||
|
JDK8_ALPN_PROPERTY))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assumeNotHttp2Support() {
|
||||||
|
assumeThat(getPlatformSystemProperty(), equalTo(
|
||||||
|
JDK8_PROPERTY))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun assumeJettyBootEnabled() {
|
fun assumeJettyBootEnabled() {
|
||||||
@@ -86,24 +120,46 @@ open class PlatformRule @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val PROPERTY_NAME = "okhttp.platform"
|
const val PROPERTY_NAME = "okhttp.platform"
|
||||||
val CONSCRYPT_PROPERTY = "conscrypt"
|
const val CONSCRYPT_PROPERTY = "conscrypt"
|
||||||
val DEFAULT_PROPERTY = "default"
|
const val JDK9_PROPERTY = "jdk9"
|
||||||
val JDK9_PROPERTY = "jdk9"
|
const val JDK8_ALPN_PROPERTY = "jdk8alpn"
|
||||||
|
const val JDK8_PROPERTY = "jdk8"
|
||||||
|
|
||||||
init {
|
init {
|
||||||
if (getPlatformSystemProperty() == CONSCRYPT_PROPERTY && Security.getProviders()[0].name != "Conscrypt") {
|
if (getPlatformSystemProperty() == CONSCRYPT_PROPERTY && Security.getProviders()[0].name != "Conscrypt") {
|
||||||
|
if (!Conscrypt.isAvailable()) {
|
||||||
|
System.err.println("Warning: Conscrypt not available")
|
||||||
|
}
|
||||||
|
|
||||||
val provider = Conscrypt.newProviderBuilder().provideTrustManager(true).build()
|
val provider = Conscrypt.newProviderBuilder().provideTrustManager(true).build()
|
||||||
Security.insertProviderAt(provider, 1)
|
Security.insertProviderAt(provider, 1)
|
||||||
} else if (getPlatformSystemProperty() == DEFAULT_PROPERTY) {
|
} else if (getPlatformSystemProperty() == JDK8_ALPN_PROPERTY) {
|
||||||
if (!isAlpnBootEnabled()) {
|
if (!isAlpnBootEnabled()) {
|
||||||
System.err.println("Warning: ALPN Boot not enabled")
|
System.err.println("Warning: ALPN Boot not enabled")
|
||||||
}
|
}
|
||||||
|
} else if (getPlatformSystemProperty() == JDK8_PROPERTY) {
|
||||||
|
if (isAlpnBootEnabled()) {
|
||||||
|
System.err.println("Warning: ALPN Boot enabled unintentionally")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun getPlatformSystemProperty(): String = System.getProperty(PROPERTY_NAME, DEFAULT_PROPERTY)
|
fun getPlatformSystemProperty(): String {
|
||||||
|
var property: String? = System.getProperty(PROPERTY_NAME)
|
||||||
|
|
||||||
|
if (property == null) {
|
||||||
|
property = when (Platform.get()) {
|
||||||
|
is ConscryptPlatform -> CONSCRYPT_PROPERTY
|
||||||
|
is Jdk8WithJettyBootPlatform -> CONSCRYPT_PROPERTY
|
||||||
|
is Jdk9Platform -> JDK9_PROPERTY
|
||||||
|
else -> JDK8_PROPERTY
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return property
|
||||||
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun conscrypt() = PlatformRule(CONSCRYPT_PROPERTY)
|
fun conscrypt() = PlatformRule(CONSCRYPT_PROPERTY)
|
||||||
@@ -112,7 +168,10 @@ open class PlatformRule @JvmOverloads constructor(
|
|||||||
fun jdk9() = PlatformRule(JDK9_PROPERTY)
|
fun jdk9() = PlatformRule(JDK9_PROPERTY)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun jdk8() = PlatformRule(DEFAULT_PROPERTY)
|
fun jdk8() = PlatformRule(JDK8_PROPERTY)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun jdk8alpn() = PlatformRule(JDK8_ALPN_PROPERTY)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun isAlpnBootEnabled(): Boolean = try {
|
fun isAlpnBootEnabled(): Boolean = try {
|
@@ -186,7 +186,7 @@ open class Platform {
|
|||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun get(): Platform = platform
|
fun get(): Platform = platform
|
||||||
|
|
||||||
internal fun resetForTests(platform: Platform = findPlatform()) {
|
fun resetForTests(platform: Platform = findPlatform()) {
|
||||||
this.platform = platform
|
this.platform = platform
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2831,6 +2831,8 @@ public final class CallTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void unsuccessfulExpectContinuePermitsConnectionReuseWithHttp2() throws Exception {
|
@Test public void unsuccessfulExpectContinuePermitsConnectionReuseWithHttp2() throws Exception {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
enableProtocol(Protocol.HTTP_2);
|
enableProtocol(Protocol.HTTP_2);
|
||||||
|
|
||||||
server.enqueue(new MockResponse());
|
server.enqueue(new MockResponse());
|
||||||
@@ -3230,6 +3232,8 @@ public final class CallTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void interceptorGetsHttp2() throws Exception {
|
@Test public void interceptorGetsHttp2() throws Exception {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
enableProtocol(Protocol.HTTP_2);
|
enableProtocol(Protocol.HTTP_2);
|
||||||
|
|
||||||
// Capture the protocol as it is observed by the interceptor.
|
// Capture the protocol as it is observed by the interceptor.
|
||||||
@@ -3662,6 +3666,8 @@ public final class CallTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void clientReadsHeadersDataTrailersHttp2() throws IOException {
|
@Test public void clientReadsHeadersDataTrailersHttp2() throws IOException {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
MockResponse mockResponse = new MockResponse()
|
MockResponse mockResponse = new MockResponse()
|
||||||
.clearHeaders()
|
.clearHeaders()
|
||||||
.addHeader("h1", "v1")
|
.addHeader("h1", "v1")
|
||||||
|
@@ -52,6 +52,7 @@ public final class ConnectionCoalescingTest {
|
|||||||
|
|
||||||
@Before public void setUp() throws Exception {
|
@Before public void setUp() throws Exception {
|
||||||
platform.assumeNotConscrypt();
|
platform.assumeNotConscrypt();
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
rootCa = new HeldCertificate.Builder()
|
rootCa = new HeldCertificate.Builder()
|
||||||
.serialNumber(1L)
|
.serialNumber(1L)
|
||||||
|
@@ -35,6 +35,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
public final class ConnectionReuseTest {
|
public final class ConnectionReuseTest {
|
||||||
|
@Rule public final PlatformRule platform = new PlatformRule();
|
||||||
@Rule public final TestRule timeout = new Timeout(30_000);
|
@Rule public final TestRule timeout = new Timeout(30_000);
|
||||||
@Rule public final MockWebServer server = new MockWebServer();
|
@Rule public final MockWebServer server = new MockWebServer();
|
||||||
@Rule public final OkHttpClientTestRule clientTestRule = new OkHttpClientTestRule();
|
@Rule public final OkHttpClientTestRule clientTestRule = new OkHttpClientTestRule();
|
||||||
@@ -347,6 +348,7 @@ public final class ConnectionReuseTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void enableHttp2() {
|
private void enableHttp2() {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
enableHttpsAndAlpn(Protocol.HTTP_2, Protocol.HTTP_1_1);
|
enableHttpsAndAlpn(Protocol.HTTP_2, Protocol.HTTP_1_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,7 +19,6 @@ import okhttp3.internal.platform.ConscryptPlatform
|
|||||||
import okhttp3.internal.platform.Platform
|
import okhttp3.internal.platform.Platform
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
import org.conscrypt.Conscrypt
|
import org.conscrypt.Conscrypt
|
||||||
import org.conscrypt.OpenSSLContextImpl
|
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Assert.assertFalse
|
import org.junit.Assert.assertFalse
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
|
@@ -30,6 +30,7 @@ import okhttp3.mockwebserver.internal.duplex.MockDuplexResponseBody;
|
|||||||
import okhttp3.tls.HandshakeCertificates;
|
import okhttp3.tls.HandshakeCertificates;
|
||||||
import okio.BufferedSink;
|
import okio.BufferedSink;
|
||||||
import okio.BufferedSource;
|
import okio.BufferedSource;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.TestRule;
|
import org.junit.rules.TestRule;
|
||||||
@@ -42,6 +43,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
public final class DuplexTest {
|
public final class DuplexTest {
|
||||||
|
@Rule public final PlatformRule platform = new PlatformRule();
|
||||||
@Rule public final TestRule timeout = new Timeout(30_000, TimeUnit.MILLISECONDS);
|
@Rule public final TestRule timeout = new Timeout(30_000, TimeUnit.MILLISECONDS);
|
||||||
@Rule public final MockWebServer server = new MockWebServer();
|
@Rule public final MockWebServer server = new MockWebServer();
|
||||||
@Rule public OkHttpClientTestRule clientTestRule = new OkHttpClientTestRule();
|
@Rule public OkHttpClientTestRule clientTestRule = new OkHttpClientTestRule();
|
||||||
@@ -53,6 +55,11 @@ public final class DuplexTest {
|
|||||||
.eventListener(listener)
|
.eventListener(listener)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void checkHttp2() {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
}
|
||||||
|
|
||||||
@Test public void http1DoesntSupportDuplex() throws IOException {
|
@Test public void http1DoesntSupportDuplex() throws IOException {
|
||||||
Call call = client.newCall(new Request.Builder()
|
Call call = client.newCall(new Request.Builder()
|
||||||
.url(server.url("/"))
|
.url(server.url("/"))
|
||||||
|
@@ -72,6 +72,8 @@ import static org.junit.Assume.assumeThat;
|
|||||||
|
|
||||||
public final class EventListenerTest {
|
public final class EventListenerTest {
|
||||||
public static final Matcher<Response> anyResponse = CoreMatchers.any(Response.class);
|
public static final Matcher<Response> anyResponse = CoreMatchers.any(Response.class);
|
||||||
|
|
||||||
|
@Rule public final PlatformRule platform = new PlatformRule();
|
||||||
@Rule public final MockWebServer server = new MockWebServer();
|
@Rule public final MockWebServer server = new MockWebServer();
|
||||||
@Rule public final OkHttpClientTestRule clientTestRule = new OkHttpClientTestRule();
|
@Rule public final OkHttpClientTestRule clientTestRule = new OkHttpClientTestRule();
|
||||||
@Rule public final Timeout timeoutRule = new Timeout(20, TimeUnit.SECONDS);
|
@Rule public final Timeout timeoutRule = new Timeout(20, TimeUnit.SECONDS);
|
||||||
@@ -859,6 +861,8 @@ public final class EventListenerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void responseBodyFailHttp2OverHttps() throws IOException {
|
@Test public void responseBodyFailHttp2OverHttps() throws IOException {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
enableTlsWithTunnel(false);
|
enableTlsWithTunnel(false);
|
||||||
server.setProtocols(asList(Protocol.HTTP_2, Protocol.HTTP_1_1));
|
server.setProtocols(asList(Protocol.HTTP_2, Protocol.HTTP_1_1));
|
||||||
responseBodyFail(Protocol.HTTP_2);
|
responseBodyFail(Protocol.HTTP_2);
|
||||||
@@ -955,6 +959,8 @@ public final class EventListenerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void requestBodyFailHttp2OverHttps() {
|
@Test public void requestBodyFailHttp2OverHttps() {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
enableTlsWithTunnel(false);
|
enableTlsWithTunnel(false);
|
||||||
server.setProtocols(asList(Protocol.HTTP_2, Protocol.HTTP_1_1));
|
server.setProtocols(asList(Protocol.HTTP_2, Protocol.HTTP_1_1));
|
||||||
|
|
||||||
@@ -1074,6 +1080,8 @@ public final class EventListenerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void requestBodySuccessHttp2OverHttps() throws IOException {
|
@Test public void requestBodySuccessHttp2OverHttps() throws IOException {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
enableTlsWithTunnel(false);
|
enableTlsWithTunnel(false);
|
||||||
server.setProtocols(asList(Protocol.HTTP_2, Protocol.HTTP_1_1));
|
server.setProtocols(asList(Protocol.HTTP_2, Protocol.HTTP_1_1));
|
||||||
requestBodySuccess(RequestBody.create(MediaType.get("text/plain"), "Hello"), equalTo(5L),
|
requestBodySuccess(RequestBody.create(MediaType.get("text/plain"), "Hello"), equalTo(5L),
|
||||||
|
35
okhttp/src/test/java/okhttp3/PlatformRuleTest.kt
Normal file
35
okhttp/src/test/java/okhttp3/PlatformRuleTest.kt
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 Square, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package okhttp3
|
||||||
|
|
||||||
|
import okhttp3.internal.platform.Platform
|
||||||
|
import org.junit.Rule
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sanity test for checking which environment and IDE is picking up.
|
||||||
|
*/
|
||||||
|
class PlatformRuleTest {
|
||||||
|
@Suppress("RedundantVisibilityModifier")
|
||||||
|
@JvmField
|
||||||
|
@Rule public val platform = PlatformRule()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testMode() {
|
||||||
|
println(PlatformRule.getPlatformSystemProperty())
|
||||||
|
println(Platform.get().javaClass.simpleName)
|
||||||
|
}
|
||||||
|
}
|
@@ -1567,6 +1567,8 @@ public final class URLConnectionTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void postBodyRetransmittedAfterAuthorizationFail_HTTP_2() throws Exception {
|
@Test public void postBodyRetransmittedAfterAuthorizationFail_HTTP_2() throws Exception {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
enableProtocol(Protocol.HTTP_2);
|
enableProtocol(Protocol.HTTP_2);
|
||||||
postBodyRetransmittedAfterAuthorizationFail("abc");
|
postBodyRetransmittedAfterAuthorizationFail("abc");
|
||||||
}
|
}
|
||||||
@@ -1577,6 +1579,8 @@ public final class URLConnectionTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void postEmptyBodyRetransmittedAfterAuthorizationFail_HTTP_2() throws Exception {
|
@Test public void postEmptyBodyRetransmittedAfterAuthorizationFail_HTTP_2() throws Exception {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
enableProtocol(Protocol.HTTP_2);
|
enableProtocol(Protocol.HTTP_2);
|
||||||
postBodyRetransmittedAfterAuthorizationFail("");
|
postBodyRetransmittedAfterAuthorizationFail("");
|
||||||
}
|
}
|
||||||
@@ -3297,6 +3301,8 @@ public final class URLConnectionTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void setsNegotiatedProtocolHeader_HTTP_2() throws Exception {
|
@Test public void setsNegotiatedProtocolHeader_HTTP_2() throws Exception {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
setsNegotiatedProtocolHeader(Protocol.HTTP_2);
|
setsNegotiatedProtocolHeader(Protocol.HTTP_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3608,6 +3614,8 @@ public final class URLConnectionTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test public void streamedBodyIsRetriedOnHttp2Shutdown() throws Exception {
|
@Test public void streamedBodyIsRetriedOnHttp2Shutdown() throws Exception {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
|
||||||
enableProtocol(Protocol.HTTP_2);
|
enableProtocol(Protocol.HTTP_2);
|
||||||
server.enqueue(new MockResponse()
|
server.enqueue(new MockResponse()
|
||||||
.setSocketPolicy(SocketPolicy.DISCONNECT_AT_END)
|
.setSocketPolicy(SocketPolicy.DISCONNECT_AT_END)
|
||||||
|
@@ -41,6 +41,7 @@ import okhttp3.Interceptor;
|
|||||||
import okhttp3.MediaType;
|
import okhttp3.MediaType;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.OkHttpClientTestRule;
|
import okhttp3.OkHttpClientTestRule;
|
||||||
|
import okhttp3.PlatformRule;
|
||||||
import okhttp3.Protocol;
|
import okhttp3.Protocol;
|
||||||
import okhttp3.RecordingCookieJar;
|
import okhttp3.RecordingCookieJar;
|
||||||
import okhttp3.RecordingHostnameVerifier;
|
import okhttp3.RecordingHostnameVerifier;
|
||||||
@@ -98,6 +99,7 @@ public final class HttpOverHttp2Test {
|
|||||||
return asList(Protocol.H2_PRIOR_KNOWLEDGE, Protocol.HTTP_2);
|
return asList(Protocol.H2_PRIOR_KNOWLEDGE, Protocol.HTTP_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Rule public final PlatformRule platform = new PlatformRule();
|
||||||
@Rule public final TemporaryFolder tempDir = new TemporaryFolder();
|
@Rule public final TemporaryFolder tempDir = new TemporaryFolder();
|
||||||
@Rule public final MockWebServer server = new MockWebServer();
|
@Rule public final MockWebServer server = new MockWebServer();
|
||||||
@Rule public final OkHttpClientTestRule clientTestRule = new OkHttpClientTestRule();
|
@Rule public final OkHttpClientTestRule clientTestRule = new OkHttpClientTestRule();
|
||||||
@@ -116,6 +118,13 @@ public final class HttpOverHttp2Test {
|
|||||||
this.protocol = protocol;
|
this.protocol = protocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void checkHttp2() {
|
||||||
|
if (protocol == Protocol.HTTP_2) {
|
||||||
|
platform.assumeHttp2Support();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private OkHttpClient buildH2PriorKnowledgeClient() {
|
private OkHttpClient buildH2PriorKnowledgeClient() {
|
||||||
return clientTestRule.client.newBuilder()
|
return clientTestRule.client.newBuilder()
|
||||||
.protocols(asList(Protocol.H2_PRIOR_KNOWLEDGE))
|
.protocols(asList(Protocol.H2_PRIOR_KNOWLEDGE))
|
||||||
|
Reference in New Issue
Block a user