/*
* Copyright 2014 NAVER Corp.
* 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 com.navercorp.pinpoint.plugin.jdk.http;
import static com.navercorp.pinpoint.bootstrap.plugin.test.Expectations.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import com.navercorp.pinpoint.plugin.WebServer;
import com.navercorp.pinpoint.test.plugin.Dependency;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifier;
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifierHolder;
import com.navercorp.pinpoint.test.plugin.JvmVersion;
import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite;
/**
* @author Jongho Moon
*
*/
@RunWith(PinpointPluginTestSuite.class)
@JvmVersion({6, 7, 8})
@Dependency({ "org.nanohttpd:nanohttpd:2.3.1"})
public class HttpURLConnectionIT {
private static WebServer webServer;
@BeforeClass
public static void BeforeClass() throws Exception {
webServer = WebServer.newTestWebServer();
}
@AfterClass
public static void AfterClass() throws Exception {
final WebServer copy = webServer;
if (copy != null) {
copy.stop();
webServer = null;
}
}
@Test
public void test() throws Exception {
URL url = new URL(webServer.getCallHttpUrl());
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.getHeaderFields();
PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance();
verifier.printCache();
Class<?> targetClass = Class.forName("sun.net.www.protocol.http.HttpURLConnection");
Method getInputStream = targetClass.getMethod("getInputStream");
String destinationId = webServer.getHostAndPort();
String httpUrl = webServer.getCallHttpUrl();
verifier.verifyTraceCount(1);
verifier.verifyTrace(event("JDK_HTTPURLCONNECTOR", getInputStream, null, null, destinationId, annotation("http.url", httpUrl)));
}
@Test
public void testConnectTwice() throws Exception {
URL url = new URL(webServer.getCallHttpUrl());
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.connect();
connection.getInputStream();
PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance();
verifier.printCache();
Class<?> targetClass = Class.forName("sun.net.www.protocol.http.HttpURLConnection");
Method connect = targetClass.getMethod("connect");
String destinationId = webServer.getHostAndPort();
String httpUrl = webServer.getCallHttpUrl();
verifier.verifyTraceCount(1);
verifier.verifyTrace(event("JDK_HTTPURLCONNECTOR", connect, null, null, destinationId, annotation("http.url", httpUrl)));
}
@Test
public void testConnecting() throws Exception {
URL url = new URL("http://no.such.url");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
try {
connection.connect();
} catch (UnknownHostException e) {
// ignore
}
try {
connection.connect();
} catch (UnknownHostException e) {
// ignore
}
Field field = null;
try {
field = connection.getClass().getDeclaredField("connecting");
} catch (NoSuchFieldException ignored) {
}
PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance();
verifier.printCache();
Class<?> targetClass = Class.forName("sun.net.www.protocol.http.HttpURLConnection");
Method getInputStream = targetClass.getMethod("connect");
verifier.verifyTrace(event("JDK_HTTPURLCONNECTOR", getInputStream, null, null, "no.such.url", annotation("http.url", "http://no.such.url")));
if (field == null) {
// JDK 6, 7
verifier.verifyTrace(event("JDK_HTTPURLCONNECTOR", getInputStream, null, null, "no.such.url", annotation("http.url", "http://no.such.url")));
}
verifier.verifyTraceCount(0);
}
}