/**
* The MIT License
* Copyright © 2010 JmxTrans team
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.googlecode.jmxtrans.model.output;
import com.google.common.collect.ImmutableMap;
import com.googlecode.jmxtrans.model.Query;
import com.googlecode.jmxtrans.model.Result;
import com.googlecode.jmxtrans.model.Server;
import com.googlecode.jmxtrans.test.RequiresIO;
import org.apache.commons.pool.impl.GenericKeyedObjectPool;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.slf4j.Logger;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import static com.googlecode.jmxtrans.model.QueryFixtures.dummyQuery;
import static com.googlecode.jmxtrans.model.ResultFixtures.dummyResults;
import static com.googlecode.jmxtrans.model.ResultFixtures.singleNumericResult;
import static com.googlecode.jmxtrans.model.ServerFixtures.dummyServer;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link OpenTSDBWriter}.
*/
@Category(RequiresIO.class)
public class OpenTSDBWriterTests {
protected OpenTSDBWriter writer;
protected Query mockQuery;
protected Result mockResult;
protected Socket mockSocket;
protected DataOutputStream mockOut;
protected InputStreamReader mockInStreamRdr;
protected BufferedReader mockBufRdr;
protected Logger mockLog;
protected ImmutableMap<String, Object> testValues;
@Test(expected = NullPointerException.class)
public void exceptionThrownIfHostIsNotDefined() throws Exception {
OpenTSDBWriter.builder()
.setPort(4242)
.build();
}
@Test(expected = NullPointerException.class)
public void exceptionThrownIfPortIsNotDefined() throws Exception {
OpenTSDBWriter.builder()
.setHost("localhost")
.build();
}
@Test
public void socketInvalidatedWhenError() throws Exception {
GenericKeyedObjectPool<InetSocketAddress, Socket> pool = Mockito.mock(GenericKeyedObjectPool.class);
Socket socket = Mockito.mock(Socket.class);
Mockito.when(pool.borrowObject(Matchers.any(InetSocketAddress.class))).thenReturn(socket);
UnflushableByteArrayOutputStream out = new UnflushableByteArrayOutputStream();
Mockito.when(socket.getOutputStream()).thenReturn(out);
OpenTSDBWriter writer = OpenTSDBWriter.builder()
.setHost("localhost")
.setPort(4243)
.build();
writer.setPool(pool);
writer.doWrite(dummyServer(), dummyQuery(), dummyResults());
Mockito.verify(pool).invalidateObject(Matchers.any(InetSocketAddress.class), Matchers.eq(socket));
Mockito.verify(pool, Mockito.never()).returnObject(Matchers.any(InetSocketAddress.class), Matchers.eq(socket));
}
private static OpenTSDBWriter getOpenTSDBWriter(OutputStream out) throws Exception {
return getOpenTSDBWriter(out, new ArrayList<String>());
}
private static OpenTSDBWriter getOpenTSDBWriter(OutputStream out, List<String> typeNames) throws Exception {
GenericKeyedObjectPool<InetSocketAddress, Socket> pool = Mockito.mock(GenericKeyedObjectPool.class);
Socket socket = Mockito.mock(Socket.class);
Mockito.when(pool.borrowObject(Matchers.any(InetSocketAddress.class))).thenReturn(socket);
Mockito.when(socket.getOutputStream()).thenReturn(out);
OpenTSDBWriter writer = OpenTSDBWriter.builder()
.setHost("localhost")
.setPort(4243)
.addTypeNames(typeNames)
.build();
writer.setPool(pool);
return writer;
}
@Test
public void writeSingleResult() throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
OpenTSDBWriter writer = getOpenTSDBWriter(out);
writer.doWrite(dummyServer(), dummyQuery(), singleNumericResult());
// check that OpenTSDB format is respected
assertThat(out.toString()).startsWith("put MemoryAlias.ObjectPendingFinalizationCount ")
.contains("host=") // hostname is added by default
.endsWith("\n");
}
private static class UnflushableByteArrayOutputStream extends ByteArrayOutputStream {
@Override
public void flush() throws IOException {
throw new IOException();
}
}
}