private static GraphiteWriter getGraphiteWriter(OutputStream out, List<String> typeNames) throws Exception { GenericKeyedObjectPool<InetSocketAddress, Socket> pool = mock(GenericKeyedObjectPool.class); Socket socket = mock(Socket.class); when(pool.borrowObject(Matchers.any(InetSocketAddress.class))).thenReturn(socket); when(socket.getOutputStream()).thenReturn(out); GraphiteWriter writer = GraphiteWriter.builder().setHost("localhost").setPort(2003).addTypeNames(typeNames).build(); writer.setPool(pool); return writer; }
@Test public void socketInvalidatedWhenError() throws Exception { GenericKeyedObjectPool<InetSocketAddress, Socket> pool = mock(GenericKeyedObjectPool.class); Socket socket = mock(Socket.class); when(pool.borrowObject(Matchers.any(InetSocketAddress.class))).thenReturn(socket); UnflushableByteArrayOutputStream out = new UnflushableByteArrayOutputStream(); when(socket.getOutputStream()).thenReturn(out); GraphiteWriter writer = GraphiteWriter.builder().setHost("localhost").setPort(2003).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)); }
@Test(expected = NullPointerException.class) public void portIsRequired() throws ValidationException { try { GraphiteWriter.builder().setHost("localhost").build(); } catch (NullPointerException npe) { assertThat(npe).hasMessage("Port cannot be null."); throw npe; } }
@Test public void booleanAsNumberWorks() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); GenericKeyedObjectPool<InetSocketAddress, Socket> pool = mock(GenericKeyedObjectPool.class); Socket socket = mock(Socket.class); when(pool.borrowObject(Matchers.any(InetSocketAddress.class))).thenReturn(socket); when(socket.getOutputStream()).thenReturn(out); GraphiteWriter writer = GraphiteWriter.builder().setHost("localhost").setPort(123).setBooleanAsNumber(true).build(); writer.setPool(pool); writer.doWrite(dummyServer(), dummyQuery(), singleTrueResult()); // check that the booleanAsNumber property was picked up from the JSON assertThat(out.toString()) .startsWith("servers.host_example_net_4321.VerboseMemory.Verbose 1 0"); }
private static String getOutput(Server server, Query query, Result result) throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); GraphiteWriter writer = getGraphiteWriter(out); writer.doWrite(server, query, of(result)); return out.toString(); }
@Test public void checkEmptyTypeNamesAreIgnored() throws Exception { Server server = serverWithNoQuery(); // Set useObjDomain to true Query query = Query.builder() .setUseObjDomainAsKey(true) .setAllowDottedKeys(true) .setObj("\"yammer.metrics\":name=\"uniqueName\",type=\"\"") .build(); Result result = new Result( System.currentTimeMillis(), "Attribute", "com.yammer.metrics.reporting.JmxReporter$Counter", "yammer.metrics", null, "name=\"uniqueName\",type=\"\"", ImmutableMap.of("Attribute", (Object) 0)); ByteArrayOutputStream out = new ByteArrayOutputStream(); ArrayList<String> typeNames = new ArrayList<String>(); typeNames.add("name"); typeNames.add("type"); GraphiteWriter writer = getGraphiteWriter(out, typeNames); writer.doWrite(server, query, of(result)); // check that the empty type "type" is ignored when allowDottedKeys is true assertThat(out.toString()) .startsWith("servers.host_example_net_4321.yammer.metrics.uniqueName.Attribute 0 "); // check that this also works when literal " characters aren't included in the JMX ObjectName query = Query.builder() .setUseObjDomainAsKey(true) .setAllowDottedKeys(true) .setObj("yammer.metrics:name=uniqueName,type=") .build(); out = new ByteArrayOutputStream(); writer = getGraphiteWriter(out, typeNames); writer.doWrite(server, query, of(result)); assertThat(out.toString()) .startsWith("servers.host_example_net_4321.yammer.metrics.uniqueName.Attribute 0 "); // check that the empty type "type" is ignored when allowDottedKeys is false query = Query.builder() .setUseObjDomainAsKey(true) .setAllowDottedKeys(false) .setObj("\"yammer.metrics\":name=\"uniqueName\",type=\"\"") .build(); out = new ByteArrayOutputStream(); writer = getGraphiteWriter(out, typeNames); writer.doWrite(server, query, of(result)); assertThat(out.toString()) .startsWith("servers.host_example_net_4321.yammer_metrics.uniqueName.Attribute 0 "); }