/*
* 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.it;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TTransportException;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifier;
import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifierHolder;
import com.navercorp.pinpoint.plugin.thrift.common.TestEnvironment;
import com.navercorp.pinpoint.plugin.thrift.common.client.EchoTestClient;
import com.navercorp.pinpoint.plugin.thrift.common.server.EchoTestServer;
/**
* @author HyunGil Jeong
*/
public abstract class EchoTestRunner<T extends TServer> {
private static ExecutorService SERVER_EXECUTOR;
private EchoTestServer<T> echoServer;
PluginTestVerifier verifier;
@BeforeClass
public static void setUpBeforeClass() throws InterruptedException {
SERVER_EXECUTOR = Executors.newSingleThreadExecutor();
}
@Before
public void setUp() throws TTransportException, InterruptedException {
this.echoServer = createEchoServer(new TestEnvironment());
this.verifier = PluginTestVerifierHolder.getInstance();
this.echoServer.start(SERVER_EXECUTOR);
}
@After
public void tearDown() {
if (this.echoServer != null) {
this.echoServer.stop();
}
}
@AfterClass
public static void tearDownAfterClass() {
SERVER_EXECUTOR.shutdown();
}
protected String invokeEcho(String message) throws Exception {
final EchoTestClient echoClient = this.echoServer.getSynchronousClient();
return invokeAndVerify(echoClient, message);
}
protected String invokeEchoAsync(String message) throws Exception {
final EchoTestClient echoClient = this.echoServer.getAsynchronousClient();
return invokeAndVerify(echoClient, message);
}
private String invokeAndVerify(EchoTestClient echoClient, String message) throws Exception {
try {
return echoClient.echo(message);
} finally {
echoClient.close();
// give a chance to flush out span data
Thread.sleep(500L);
this.verifyTraces(echoClient, message);
}
}
protected abstract EchoTestServer<T> createEchoServer(TestEnvironment environment) throws TTransportException;
private void verifyTraces(EchoTestClient echoClient, String expectedMessage) throws Exception {
this.verifier.printCache(System.out);
echoClient.verifyTraces(this.verifier, expectedMessage);
this.echoServer.verifyTraces(this.verifier);
}
}