/* * Copyright 2015 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.thrift.common.client; import static com.navercorp.pinpoint.bootstrap.plugin.test.Expectations.*; import java.lang.reflect.Method; import java.net.InetSocketAddress; import org.apache.thrift.TBase; import org.apache.thrift.TException; import org.apache.thrift.TServiceClient; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import com.navercorp.pinpoint.bootstrap.plugin.test.Expectations; import com.navercorp.pinpoint.bootstrap.plugin.test.ExpectedAnnotation; import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifier; import com.navercorp.pinpoint.plugin.thrift.common.TestEnvironment; import com.navercorp.pinpoint.plugin.thrift.dto.EchoService; /** * @author HyunGil Jeong */ public abstract class SyncEchoTestClient implements EchoTestClient { private final TestEnvironment environment; private final TTransport transport; private SyncEchoTestClient(TestEnvironment environment, TTransport transport) throws TTransportException { this.environment = environment; this.transport = transport; this.transport.open(); } @Override public final String echo(String message) throws TException { TProtocol protocol = this.environment.getProtocolFactory().getProtocol(transport); EchoService.Client client = new EchoService.Client(protocol); return client.echo(message); } @Override public void verifyTraces(PluginTestVerifier verifier, String expectedMessage) throws Exception { final InetSocketAddress actualServerAddress = this.environment.getServerAddress(); // SpanEvent - TServiceClient.sendBase Method sendBase = TServiceClient.class.getDeclaredMethod("sendBase", String.class, TBase.class); // refer to com.navercorp.pinpoint.plugin.thrift.ThriftUtils#getClientServiceName ExpectedAnnotation thriftUrl = Expectations.annotation("thrift.url", actualServerAddress.getHostName() + ":" + actualServerAddress.getPort() + "/com/navercorp/pinpoint/plugin/thrift/dto/EchoService/echo"); ExpectedAnnotation thriftArgs = Expectations.annotation("thrift.args", "echo_args(message:" + expectedMessage + ")"); // SpanEvent - TServiceClient.receiveBase Method receiveBase = TServiceClient.class.getDeclaredMethod("receiveBase", TBase.class, String.class); ExpectedAnnotation thriftResult = Expectations.annotation("thrift.result", "echo_result(success:" + expectedMessage + ")"); verifier.verifyDiscreteTrace(event("THRIFT_CLIENT", // ServiceType sendBase, // Method null, // rpc null, // endPoint actualServerAddress.getHostName() + ":" + actualServerAddress.getPort(), // destinationId thriftUrl, // Annotation("thrift.url") thriftArgs), // Annotation("thrift.args") event("THRIFT_CLIENT_INTERNAL", // ServiceType receiveBase, // Method thriftResult // Annotation("thrift.result") )); } @Override public void close() { if (this.transport.isOpen()) { this.transport.close(); } } public static class Client extends SyncEchoTestClient { public Client(TestEnvironment environment) throws TTransportException { super(environment, new TSocket(environment.getServerIp(), environment.getPort())); } } public static class ClientForNonblockingServer extends SyncEchoTestClient { public ClientForNonblockingServer(TestEnvironment environment) throws TTransportException { super(environment, new TFramedTransport(new TSocket(environment.getServerIp(), environment.getPort()))); } } }