package biz.paluch.logging.gelf.intern.sender;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import biz.paluch.logging.gelf.intern.ErrorReporter;
import biz.paluch.logging.gelf.intern.GelfMessage;
import biz.paluch.logging.gelf.netty.NettyLocalServer;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
/**
* @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
*/
public class GelfTCPSSLSenderIntegrationTests {
private static NettyLocalServer server = new NettyLocalServer(NioServerSocketChannel.class);
private static SSLContext sslContext;
@BeforeAll
public static void setupClass() throws Exception {
File file = new File("work/keystore.jks");
assumeTrue(file.exists());
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(new FileInputStream(file), "changeit".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "changeit".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
final SslContext sslContext = SslContextBuilder.forServer(kmf).build();
GelfTCPSSLSenderIntegrationTests.sslContext = SSLContext.getInstance("TLSv1");
GelfTCPSSLSenderIntegrationTests.sslContext.init(new KeyManager[0], tmf.getTrustManagers(), null);
server.run(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(sslContext.newHandler(ch.alloc()));
ch.pipeline().addLast(server.getHandler());
}
});
}
@Test
public void shouldSendTCPMessagesViaSsl() throws Exception {
GelfTCPSSLSender tcpsslSender = new GelfTCPSSLSender("localhost", server.getPort(), 1000, 1000, 1, true,
new ErrorReporter() {
@Override
public void reportError(String message, Exception e) {
System.out.println(message);
if (e != null) {
e.printStackTrace();
}
}
}, sslContext);
tcpsslSender.connect();
GelfMessage gelfMessage = new GelfMessage("hello", "world", 1234, "7");
tcpsslSender.write(gelfMessage.toTCPBuffer());
for (int i = 0; i < 100; i++) {
if (!server.getJsonValues().isEmpty()) {
continue;
}
Thread.sleep(100);
}
assertThat(server.getJsonValues()).isNotEmpty();
tcpsslSender.close();
}
@AfterAll
public static void afterClass() throws Exception {
server.close();
}
}