blob: 0cf2ea798d729cda79c4ba8843bd16e829eb16b7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.cassandra.tools.nodetool.stats;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Pattern;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* Tests for {@link StatsPrinter}.
*/
public class StatsPrinterTest
{
@Test
public void testPrintEmpty() throws Throwable
{
TestCase.create()
.validateJson("{}")
.validateYaml("{}");
}
@Test
public void testPrintSimpleTypes() throws Throwable
{
TestCase.create("null", null)
.validateJson("{\"null\":null}")
.validateYaml("'null': null");
TestCase.create("string", "")
.validateJson("{\"string\":\"\"}")
.validateYaml("string: ''");
TestCase.create("string", "test")
.validateJson("{\"string\":\"test\"}")
.validateYaml("string: test");
TestCase.create("bool", true)
.validateJson("{\"bool\":true}")
.validateYaml("bool: true");
TestCase.create("bool", false)
.validateJson("{\"bool\":false}")
.validateYaml("bool: false");
TestCase.create("int", 1)
.validateJson("{\"int\":1}")
.validateYaml("int: 1");
TestCase.create("long", 1L)
.validateJson("{\"long\":1}")
.validateYaml("long: 1");
TestCase.create("float", 1.1f)
.validateJson("{\"float\":1.1}")
.validateYaml("float: 1.1");
TestCase.create("double", 1.1d)
.validateJson("{\"double\":1.1}")
.validateYaml("double: 1.1");
}
@Test
public void testPrintArrays() throws Throwable
{
TestCase.create("ints", new int[]{ -1, 0, 1 })
.validateJson("{\"ints\":[-1, 0, 1]}")
.validateYaml("ints:\n- -1\n- 0\n- 1");
TestCase.create("longs", new long[]{ -1L, 0L, 1L })
.validateJson("{\"longs\":[-1, 0, 1]}")
.validateYaml("longs:\n- -1\n- 0\n- 1");
TestCase.create("floats", new float[]{ -1.1f, 0.1f, 1.1f })
.validateJson("{\"floats\":[-1.1, 0.1, 1.1]}")
.validateYaml("floats:\n- -1.1\n- 0.1\n- 1.1");
TestCase.create("doubles", new double[]{ -1.1d, 0.1d, 1.1d })
.validateJson("{\"doubles\":[-1.1, 0.1, 1.1]}")
.validateYaml("doubles:\n- -1.1\n- 0.1\n- 1.1");
}
@Test
public void testPrintLists() throws Throwable
{
TestCase.create("ints", Arrays.asList(-1, 0, 1))
.validateJson("{\"ints\":[-1,0,1]}")
.validateYaml("ints:\n- -1\n- 0\n- 1");
TestCase.create("longs", Arrays.asList(-1L, 0L, 1L))
.validateJson("{\"longs\":[-1,0,1]}")
.validateYaml("longs:\n- -1\n- 0\n- 1");
TestCase.create("floats", Arrays.asList(-1.1f, 0.1f, 1.1f))
.validateJson("{\"floats\":[-1.1,0.1,1.1]}")
.validateYaml("floats:\n- -1.1\n- 0.1\n- 1.1");
TestCase.create("doubles", Arrays.asList(-1.1d, 0.1d, 1.1d))
.validateJson("{\"doubles\":[-1.1,0.1,1.1]}")
.validateYaml("doubles:\n- -1.1\n- 0.1\n- 1.1");
}
@Test
public void testPrintMultiple() throws Throwable
{
TestCase.create()
.put("string", "test")
.put("array", new int[]{ -1, 0, 1 })
.put("list", Arrays.asList(-1, 0, 1))
.validateJson("{\"array\":[-1,0,1],\"list\":[-1,0,1],\"string\":\"test\"}")
.validateYaml("array:\n- -1\n- 0\n- 1\nlist:\n- -1\n- 0\n- 1\nstring: test");
}
private static class TestCase implements StatsHolder
{
private static final StatsPrinter<TestCase> jsonPrinter = new StatsPrinter.JsonPrinter<>();
private static final StatsPrinter<TestCase> yamlPrinter = new StatsPrinter.YamlPrinter<>();
private final Map<String, Object> map;
private TestCase()
{
this.map = new TreeMap<>();
}
public static TestCase create()
{
return new TestCase();
}
public static TestCase create(String key, Object value)
{
return create().put(key, value);
}
public TestCase put(String key, Object value)
{
map.put(key, value);
return this;
}
@Override
public Map<String, Object> convert2Map()
{
return map;
}
private String print(StatsPrinter<TestCase> printer) throws IOException
{
try (ByteArrayOutputStream stream = new ByteArrayOutputStream())
{
printer.print(this, new PrintStream(stream));
return stream.toString();
}
}
private static String cleanJson(String json)
{
return Pattern.compile("\n|\\s*").matcher(json).replaceAll("");
}
TestCase validateJson(String expectedJson) throws IOException
{
String expected = cleanJson(expectedJson);
String actual = cleanJson(print(jsonPrinter));
assertEquals(expected, actual);
return this;
}
@SuppressWarnings("UnusedReturnValue")
TestCase validateYaml(String expectedYaml) throws IOException
{
assertEquals(expectedYaml + "\n\n", print(yamlPrinter));
return this;
}
}
}