This is an automated email from the ASF dual-hosted git repository.

blerer pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 5fc8112  Refactor NodeTool commands tests
5fc8112 is described below

commit 5fc811210b70889084b2be5a6a3577963fd5f3c4
Author: Aleksei Zotov <[email protected]>
AuthorDate: Sat Apr 24 14:25:56 2021 +0400

    Refactor NodeTool commands tests
    
    patch by Aleksei Zoto; reviewed by Benjamin Lerer for CASSANDRA-16629
---
 .../cassandra/tools/NodeToolGossipInfoTest.java    | 130 ---------------------
 .../tools/{ => nodetool}/ClearSnapshotTest.java    |  51 ++++----
 .../tools/{ => nodetool}/GetFullQueryLogTest.java  |  58 ++++-----
 .../cassandra/tools/nodetool/GossipInfoTest.java   | 124 ++++++++++++++++++++
 .../NetStatsTest.java}                             |  48 +++-----
 .../apache/cassandra/tools/nodetool/RingTest.java  |  75 +++++-------
 .../apache/cassandra/tools/nodetool/SjkTest.java   |   4 +-
 .../cassandra/tools/nodetool/StatusTest.java       |  57 ++++-----
 ...toolTableStatsTest.java => TableStatsTest.java} | 103 +++++++---------
 .../TpStatsTest.java}                              |  86 ++++++--------
 10 files changed, 332 insertions(+), 404 deletions(-)

diff --git a/test/unit/org/apache/cassandra/tools/NodeToolGossipInfoTest.java 
b/test/unit/org/apache/cassandra/tools/NodeToolGossipInfoTest.java
deleted file mode 100644
index caca5ae..0000000
--- a/test/unit/org/apache/cassandra/tools/NodeToolGossipInfoTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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;
-
-import java.io.IOException;
-
-import org.apache.commons.lang3.StringUtils;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import org.apache.cassandra.OrderedJUnit4ClassRunner;
-import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.net.NoPayload;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.apache.cassandra.utils.FBUtilities;
-import org.assertj.core.api.Assertions;
-
-import static org.apache.cassandra.net.Verb.ECHO_REQ;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(OrderedJUnit4ClassRunner.class)
-public class NodeToolGossipInfoTest extends CQLTester
-{
-    private static NodeProbe probe;
-
-    @BeforeClass
-    public static void setup() throws Exception
-    {
-        requireNetwork();
-        startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
-    }
-
-    @Test
-    public void testMaybeChangeDocs()
-    {
-        // If you added, modified options or help, please update docs if 
necessary
-        ToolResult tool = ToolRunner.invokeNodetool("help", "gossipinfo");
-        String help =   "NAME\n" + 
-                        "        nodetool gossipinfo - Shows the gossip 
information for the cluster\n" + 
-                        "\n" + 
-                        "SYNOPSIS\n" + 
-                        "        nodetool [(-h <host> | --host <host>)] [(-p 
<port> | --port <port>)]\n" + 
-                        "                [(-pp | --print-port)] [(-pw 
<password> | --password <password>)]\n" + 
-                        "                [(-pwf <passwordFilePath> | 
--password-file <passwordFilePath>)]\n" + 
-                        "                [(-u <username> | --username 
<username>)] gossipinfo\n" + 
-                        "\n" + 
-                        "OPTIONS\n" + 
-                        "        -h <host>, --host <host>\n" + 
-                        "            Node hostname or ip address\n" + 
-                        "\n" + 
-                        "        -p <port>, --port <port>\n" + 
-                        "            Remote jmx agent port number\n" + 
-                        "\n" + 
-                        "        -pp, --print-port\n" + 
-                        "            Operate in 4.0 mode with hosts 
disambiguated by port number\n" + 
-                        "\n" + 
-                        "        -pw <password>, --password <password>\n" + 
-                        "            Remote jmx agent password\n" + 
-                        "\n" + 
-                        "        -pwf <passwordFilePath>, --password-file 
<passwordFilePath>\n" + 
-                        "            Path to the JMX password file\n" + 
-                        "\n" + 
-                        "        -u <username>, --username <username>\n" + 
-                        "            Remote jmx agent username\n" + 
-                        "\n" + 
-                        "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
-    }
-
-    @Test
-    public void testGossipInfo() throws Throwable
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("gossipinfo");
-        Assertions.assertThat(tool.getStdout()).contains("/127.0.0.1");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("heartbeat:[0-9]+");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("STATUS:[0-9]+:NORMAL,.+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("SCHEMA:.+");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("DC:[0-9]+:datacenter1");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("RACK:[0-9]+:rack1");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("RELEASE_VERSION:.+");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("RPC_ADDRESS:[0-9]+:127.0.0.1");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("NET_VERSION:[0-9]+:.+");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("HOST_ID:[0-9]+:.+");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("NATIVE_ADDRESS_AND_PORT:[0-9]+:127.0.0.1:[0-9]+");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("STATUS_WITH_PORT:[0-9]+:NORMAL,.+");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("TOKENS:[0-9]+:<hidden>");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-
-        // Make sure heartbeats are detected
-        Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, 
NoPayload.noPayload);
-        MessagingService.instance().send(echoMessageOut, 
FBUtilities.getBroadcastAddressAndPort());
-
-        String origHeartbeatCount = 
StringUtils.substringBetween(tool.getStdout(), "heartbeat:", "\n");
-        tool = ToolRunner.invokeNodetool("gossipinfo");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-        String newHeartbeatCount = 
StringUtils.substringBetween(tool.getStdout(), "heartbeat:", "\n");
-        assertTrue(Integer.parseInt(origHeartbeatCount) <= 
Integer.parseInt(newHeartbeatCount));
-    }
-}
diff --git a/test/unit/org/apache/cassandra/tools/ClearSnapshotTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java
similarity index 62%
rename from test/unit/org/apache/cassandra/tools/ClearSnapshotTest.java
rename to test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java
index 975e45b..07a89d7 100644
--- a/test/unit/org/apache/cassandra/tools/ClearSnapshotTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java
@@ -16,26 +16,25 @@
  * limitations under the License.
  */
 
-package org.apache.cassandra.tools;
+package org.apache.cassandra.tools.nodetool;
 
 import java.io.IOException;
 import java.util.Map;
-
 import javax.management.openmbean.TabularData;
 
 import org.junit.AfterClass;
-import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
+import org.apache.cassandra.OrderedJUnit4ClassRunner;
 import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.hamcrest.CoreMatchers;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.ToolRunner;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 
+@RunWith(OrderedJUnit4ClassRunner.class)
 public class ClearSnapshotTest extends CQLTester
 {
     private static NodeProbe probe;
@@ -56,9 +55,9 @@ public class ClearSnapshotTest extends CQLTester
     @Test
     public void testClearSnapshot_NoArgs()
     {
-        ToolResult tool = ToolRunner.invokeNodetool("clearsnapshot");
-        assertEquals(2, tool.getExitCode());
-        assertTrue("Tool stderr: " +  tool.getCleanedStderr(), 
tool.getCleanedStderr().contains("Specify snapshot name or --all"));
+        ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("clearsnapshot");
+        assertThat(tool.getExitCode()).isEqualTo(2);
+        assertThat(tool.getCleanedStderr()).contains("Specify snapshot name or 
--all");
         
         tool = ToolRunner.invokeNodetool("clearsnapshot", "--all");
         tool.assertOnCleanExit();
@@ -67,49 +66,49 @@ public class ClearSnapshotTest extends CQLTester
     @Test
     public void testClearSnapshot_AllAndName()
     {
-        ToolResult tool = ToolRunner.invokeNodetool("clearsnapshot", "-t", 
"some-name", "--all");
-        assertEquals(2, tool.getExitCode());
-        assertThat(tool.getCleanedStderr(), 
CoreMatchers.containsStringIgnoringCase("Specify only one of snapshot name or 
--all"));
+        ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("clearsnapshot", "-t", "some-name", "--all");
+        assertThat(tool.getExitCode()).isEqualTo(2);
+        assertThat(tool.getCleanedStderr()).contains("Specify only one of 
snapshot name or --all");
     }
 
     @Test
     public void testClearSnapshot_RemoveByName()
     {
-        ToolResult tool = 
ToolRunner.invokeNodetool("snapshot","-t","some-name");
+        ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("snapshot","-t","some-name");
         tool.assertOnCleanExit();
-        assertTrue(!tool.getStdout().isEmpty());
+        assertThat(tool.getStdout()).isNotEmpty();
         
         Map<String, TabularData> snapshots_before = probe.getSnapshotDetails();
-        Assert.assertTrue(snapshots_before.containsKey("some-name"));
-        
+        assertThat(snapshots_before).containsKey("some-name");
+
         tool = ToolRunner.invokeNodetool("clearsnapshot","-t","some-name");
         tool.assertOnCleanExit();
-        assertTrue(!tool.getStdout().isEmpty());
+        assertThat(tool.getStdout()).isNotEmpty();
         
         Map<String, TabularData> snapshots_after = probe.getSnapshotDetails();
-        Assert.assertFalse(snapshots_after.containsKey("some-name"));
+        assertThat(snapshots_after).doesNotContainKey("some-name");
     }
 
     @Test
     public void testClearSnapshot_RemoveMultiple()
     {
-        ToolResult tool = 
ToolRunner.invokeNodetool("snapshot","-t","some-name");
+        ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("snapshot","-t","some-name");
         tool.assertOnCleanExit();
-        assertTrue(!tool.getStdout().isEmpty());
+        assertThat(tool.getStdout()).isNotEmpty();
 
         tool = ToolRunner.invokeNodetool("snapshot","-t","some-other-name");
         tool.assertOnCleanExit();
-            assertTrue(!tool.getStdout().isEmpty());
+        assertThat(tool.getStdout()).isNotEmpty();
 
         Map<String, TabularData> snapshots_before = probe.getSnapshotDetails();
-        Assert.assertTrue(snapshots_before.size() == 2);
+        assertThat(snapshots_before).hasSize(2);
 
         tool = ToolRunner.invokeNodetool("clearsnapshot","--all");
         tool.assertOnCleanExit();
-        assertTrue(!tool.getStdout().isEmpty());
+        assertThat(tool.getStdout()).isNotEmpty();
         
         Map<String, TabularData> snapshots_after = probe.getSnapshotDetails();
-        Assert.assertTrue(snapshots_after.size() == 0);
+        assertThat(snapshots_after).isEmpty();
     }
     
 }
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/tools/GetFullQueryLogTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java
similarity index 68%
rename from test/unit/org/apache/cassandra/tools/GetFullQueryLogTest.java
rename to test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java
index 44007a5..c4eb70c 100644
--- a/test/unit/org/apache/cassandra/tools/GetFullQueryLogTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java
@@ -16,28 +16,25 @@
  * limitations under the License.
  */
 
-package org.apache.cassandra.tools;
-
-import java.io.IOException;
+package org.apache.cassandra.tools.nodetool;
 
 import org.junit.After;
-import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
 
+import org.apache.cassandra.OrderedJUnit4ClassRunner;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.fql.FullQueryLoggerOptions;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
+import org.apache.cassandra.tools.ToolRunner;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 
+@RunWith(OrderedJUnit4ClassRunner.class)
 public class GetFullQueryLogTest extends CQLTester
 {
-    private static NodeProbe probe;
-
     @ClassRule
     public static TemporaryFolder temporaryFolder = new TemporaryFolder();
 
@@ -45,13 +42,6 @@ public class GetFullQueryLogTest extends CQLTester
     public static void setup() throws Exception
     {
         startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
     }
 
     @After
@@ -87,7 +77,7 @@ public class GetFullQueryLogTest extends CQLTester
 
     private String getFullQueryLog()
     {
-        ToolResult tool = ToolRunner.invokeNodetool("getfullquerylog");
+        ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("getfullquerylog");
         tool.assertOnCleanExit();
         return tool.getStdout();
     }
@@ -122,30 +112,32 @@ public class GetFullQueryLogTest extends CQLTester
                   .assertOnCleanExit();
     }
 
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
     private void testChangedOutput(final String getFullQueryLogOutput)
     {
         final String output = getFullQueryLogOutput.replaceAll("( )+", " 
").trim();
-        assertTrue(output.contains("enabled true"));
-        assertTrue(output.contains("log_dir " + 
temporaryFolder.getRoot().toString()));
-        assertTrue(output.contains("archive_command /path/to/script.sh 
%path"));
-        assertTrue(output.contains("roll_cycle DAILY"));
-        assertTrue(output.contains("max_log_size 100000"));
-        assertTrue(output.contains("max_queue_weight 10000"));
-        assertTrue(output.contains("max_archive_retries 5"));
-        assertTrue(output.contains("block false"));
+        assertThat(output).contains("enabled true");
+        assertThat(output).contains("log_dir " + 
temporaryFolder.getRoot().toString());
+        assertThat(output).contains("archive_command /path/to/script.sh 
%path");
+        assertThat(output).contains("roll_cycle DAILY");
+        assertThat(output).contains("max_log_size 100000");
+        assertThat(output).contains("max_queue_weight 10000");
+        assertThat(output).contains("max_archive_retries 5");
+        assertThat(output).contains("block false");
     }
 
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
     private void testDefaultOutput(final String getFullQueryLogOutput)
     {
         final FullQueryLoggerOptions options = new FullQueryLoggerOptions();
         final String output = getFullQueryLogOutput.replaceAll("( )+", " 
").trim();
-        assertTrue(output.contains("enabled false"));
-        assertFalse(output.contains("log_dir " + 
temporaryFolder.getRoot().toString()));
-        assertFalse(output.contains("archive_command /path/to/script.sh 
%path"));
-        assertTrue(output.contains("roll_cycle " + options.roll_cycle));
-        assertTrue(output.contains("max_log_size " + options.max_log_size));
-        assertTrue(output.contains("max_queue_weight " + 
options.max_queue_weight));
-        assertTrue(output.contains("max_archive_retries " + 
options.max_archive_retries));
-        assertTrue(output.contains("block " + options.block));
+        assertThat(output).contains("enabled false");
+        assertThat(output).doesNotContain("log_dir " + 
temporaryFolder.getRoot().toString());
+        assertThat(output).doesNotContain("archive_command /path/to/script.sh 
%path");
+        assertThat(output).contains("roll_cycle " + options.roll_cycle);
+        assertThat(output).contains("max_log_size " + options.max_log_size);
+        assertThat(output).contains("max_queue_weight " + 
options.max_queue_weight);
+        assertThat(output).contains("max_archive_retries " + 
options.max_archive_retries);
+        assertThat(output).contains("block " + options.block);
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/GossipInfoTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/GossipInfoTest.java
new file mode 100644
index 0000000..7a48db8
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GossipInfoTest.java
@@ -0,0 +1,124 @@
+/*
+ * 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;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.cassandra.OrderedJUnit4ClassRunner;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.NoPayload;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.tools.ToolRunner;
+import org.apache.cassandra.utils.FBUtilities;
+import org.assertj.core.api.Assertions;
+
+import static org.apache.cassandra.net.Verb.ECHO_REQ;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(OrderedJUnit4ClassRunner.class)
+public class GossipInfoTest extends CQLTester
+{
+    private static String token;
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+        token = StorageService.instance.getTokens().get(0);
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if 
necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", 
"gossipinfo");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                "        nodetool gossipinfo - Shows the gossip information 
for the cluster\n" +
+                "\n" +
+                "SYNOPSIS\n" +
+                "        nodetool [(-h <host> | --host <host>)] [(-p <port> | 
--port <port>)]\n" +
+                "                [(-pp | --print-port)] [(-pw <password> | 
--password <password>)]\n" +
+                "                [(-pwf <passwordFilePath> | --password-file 
<passwordFilePath>)]\n" +
+                "                [(-u <username> | --username <username>)] 
gossipinfo\n" +
+                "\n" +
+                "OPTIONS\n" +
+                "        -h <host>, --host <host>\n" +
+                "            Node hostname or ip address\n" +
+                "\n" +
+                "        -p <port>, --port <port>\n" +
+                "            Remote jmx agent port number\n" +
+                "\n" +
+                "        -pp, --print-port\n" +
+                "            Operate in 4.0 mode with hosts disambiguated by 
port number\n" +
+                "\n" +
+                "        -pw <password>, --password <password>\n" +
+                "            Remote jmx agent password\n" +
+                "\n" +
+                "        -pwf <passwordFilePath>, --password-file 
<passwordFilePath>\n" +
+                "            Path to the JMX password file\n" +
+                "\n" +
+                "        -u <username>, --username <username>\n" +
+                "            Remote jmx agent username\n" +
+                "\n" +
+                "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testGossipInfo()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("gossipinfo");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        Assertions.assertThat(stdout).contains("/127.0.0.1");
+        Assertions.assertThat(stdout).containsPattern("\\s+generation:[0-9]+");
+        Assertions.assertThat(stdout).containsPattern("heartbeat:[0-9]+");
+        Assertions.assertThat(stdout).containsPattern("STATUS:[0-9]+:NORMAL," 
+ token);
+        Assertions.assertThat(stdout).containsPattern("SCHEMA:.+");
+        Assertions.assertThat(stdout).containsPattern("DC:[0-9]+:datacenter1");
+        Assertions.assertThat(stdout).containsPattern("RACK:[0-9]+:rack1");
+        Assertions.assertThat(stdout).containsPattern("RELEASE_VERSION:.+");
+        
Assertions.assertThat(stdout).containsPattern("RPC_ADDRESS:[0-9]+:127.0.0.1");
+        Assertions.assertThat(stdout).containsPattern("NET_VERSION:[0-9]+:.+");
+        Assertions.assertThat(stdout).containsPattern("HOST_ID:[0-9]+:.+");
+        
Assertions.assertThat(stdout).containsPattern("NATIVE_ADDRESS_AND_PORT:[0-9]+:127.0.0.1:[0-9]+");
+        
Assertions.assertThat(stdout).containsPattern("SSTABLE_VERSIONS:[0-9]+:");
+        
Assertions.assertThat(stdout).containsPattern("STATUS_WITH_PORT:[0-9]+:NORMAL,.+");
+        
Assertions.assertThat(stdout).containsPattern("TOKENS:[0-9]+:<hidden>");
+
+        // Make sure heartbeats are detected
+        Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, 
NoPayload.noPayload);
+        MessagingService.instance().send(echoMessageOut, 
FBUtilities.getBroadcastAddressAndPort());
+
+        String origHeartbeatCount = StringUtils.substringBetween(stdout, 
"heartbeat:", "\n");
+        tool = ToolRunner.invokeNodetool("gossipinfo");
+        tool.assertOnCleanExit();
+        String newHeartbeatCount = StringUtils.substringBetween(stdout, 
"heartbeat:", "\n");
+        
assertThat(Integer.parseInt(origHeartbeatCount)).isLessThanOrEqualTo(Integer.parseInt(newHeartbeatCount));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/NodetoolNetStatsTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/NetStatsTest.java
similarity index 82%
rename from test/unit/org/apache/cassandra/tools/NodetoolNetStatsTest.java
rename to test/unit/org/apache/cassandra/tools/nodetool/NetStatsTest.java
index 7ef2195..330a555 100644
--- a/test/unit/org/apache/cassandra/tools/NodetoolNetStatsTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/NetStatsTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.cassandra.tools;
+package org.apache.cassandra.tools.nodetool;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -25,7 +25,6 @@ import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -37,44 +36,34 @@ import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.NoPayload;
 import org.apache.cassandra.schema.TableId;
-import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.streaming.SessionInfo;
 import org.apache.cassandra.streaming.StreamSession.State;
 import org.apache.cassandra.streaming.StreamSummary;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.apache.cassandra.tools.nodetool.NetStats;
+import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.utils.FBUtilities;
-import org.assertj.core.api.Assertions;
-import org.hamcrest.CoreMatchers;
 
 import static org.apache.cassandra.net.Verb.ECHO_REQ;
-import static org.junit.Assert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 
 @RunWith(OrderedJUnit4ClassRunner.class)
-public class NodetoolNetStatsTest extends CQLTester
+public class NetStatsTest extends CQLTester
 {
-    private static NodeProbe probe;
-
     @BeforeClass
     public static void setup() throws Exception
     {
-        StorageService.instance.initServer();
+        requireNetwork();
         startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
     }
 
     @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
     public void testMaybeChangeDocs()
     {
         // If you added, modified options or help, please update docs if 
necessary
-        ToolResult tool = ToolRunner.invokeNodetool("help", "netstats");
-        String help =   "NAME\n" + 
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", 
"netstats");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
                         "        nodetool netstats - Print network information 
on provided host\n" + 
                         "        (connecting node by default)\n" + 
                         "\n" + 
@@ -108,8 +97,7 @@ public class NodetoolNetStatsTest extends CQLTester
                         "            Remote jmx agent username\n" + 
                         "\n" + 
                         "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
-        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEqualTo(help);
     }
 
     @Test
@@ -117,10 +105,10 @@ public class NodetoolNetStatsTest extends CQLTester
     {
         Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, 
NoPayload.noPayload);
         MessagingService.instance().send(echoMessageOut, 
FBUtilities.getBroadcastAddressAndPort());
-        
-        ToolResult tool = ToolRunner.invokeNodetool("netstats");
-        assertThat(tool.getStdout(), CoreMatchers.containsString("Gossip 
messages                 n/a         0              2         0"));
+
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("netstats");
         tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Gossip messages                 
n/a         0              2         0");
     }
 
     @Test
@@ -140,22 +128,22 @@ public class NodetoolNetStatsTest extends CQLTester
 
             nstats.printReceivingSummaries(out, info, false);
             String stdout = getSummariesStdout(baos, out);
-            Assertions.assertThat(stdout).doesNotContain("Kib");
+            assertThat(stdout).doesNotContain("Kib");
 
             baos.reset();
             nstats.printSendingSummaries(out, info, false);
             stdout = getSummariesStdout(baos, out);
-            Assertions.assertThat(stdout).doesNotContain("KiB");
+            assertThat(stdout).doesNotContain("Kib");
 
             baos.reset();
             nstats.printReceivingSummaries(out, info, true);
             stdout = getSummariesStdout(baos, out);
-            Assertions.assertThat(stdout).contains("KiB");
+            assertThat(stdout).contains("KiB");
 
             baos.reset();
             nstats.printSendingSummaries(out, info, true);
             stdout = getSummariesStdout(baos, out);
-            Assertions.assertThat(stdout).contains("KiB");            
+            assertThat(stdout).contains("KiB");
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/RingTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/RingTest.java
index 83771f6..5ab492b 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/RingTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/RingTest.java
@@ -30,13 +30,8 @@ import org.apache.cassandra.locator.SimpleSnitch;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.utils.FBUtilities;
-import org.assertj.core.api.Assertions;
 
-import static org.hamcrest.CoreMatchers.*;
-import static org.hamcrest.Matchers.matchesPattern;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 
 @RunWith(OrderedJUnit4ClassRunner.class)
 public class RingTest extends CQLTester
@@ -46,9 +41,9 @@ public class RingTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
-        StorageService.instance.initServer();
-        token = StorageService.instance.getTokens().get(0);
+        requireNetwork();
         startJMXServer();
+        token = StorageService.instance.getTokens().get(0);
     }
 
     /**
@@ -59,27 +54,21 @@ public class RingTest extends CQLTester
     {
         final HostStatWithPort host = new HostStatWithPort(null, 
FBUtilities.getBroadcastAddressAndPort(),
                                                            false, null);
-        validateRingOutput(host.ipOrDns(false),
-                            "ring");
-        Arrays.asList("-pp", "--print-port").forEach(arg -> {
-            validateRingOutput(host.ipOrDns(true),
-                               "-pp", "ring");
-        });
+        validateRingOutput(host.ipOrDns(false), "ring");
+        Arrays.asList("-pp", "--print-port").forEach(arg -> 
validateRingOutput(host.ipOrDns(true), "-pp", "ring"));
 
         final HostStatWithPort hostResolved = new HostStatWithPort(null, 
FBUtilities.getBroadcastAddressAndPort(),
                                                                    true, null);
-        Arrays.asList("-r", "--resolve-ip").forEach(arg -> {
-            validateRingOutput(hostResolved.ipOrDns(false),
-                               "ring", "-r");
-        });
-        validateRingOutput(hostResolved.ipOrDns(true),
-                            "-pp", "ring", "-r");
+        Arrays.asList("-r", "--resolve-ip").forEach(arg ->
+                validateRingOutput(hostResolved.ipOrDns(false), "ring", "-r"));
+        validateRingOutput(hostResolved.ipOrDns(true), "-pp", "ring", "-r");
     }
 
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
     private void validateRingOutput(String hostForm, String... args)
     {
-        ToolRunner.ToolResult nodetool = ToolRunner.invokeNodetool(args);
-        nodetool.assertOnCleanExit();
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(args);
+        tool.assertOnCleanExit();
         /*
          Datacenter: datacenter1
          ==========
@@ -88,35 +77,37 @@ public class RingTest extends CQLTester
          127.0.0.1       rack1       Up     Normal  45.71 KiB       100.00%    
         4652409154190094022
 
          */
-        String[] lines = nodetool.getStdout().split("\\R");
-        assertThat(lines[1].trim(), endsWith(SimpleSnitch.DATA_CENTER_NAME));
-        assertThat(lines[3], matchesPattern("Address *Rack *Status *State 
*Load *Owns *Token *"));
+        String[] lines = tool.getStdout().split("\\R");
+        assertThat(lines[1].trim()).endsWith(SimpleSnitch.DATA_CENTER_NAME);
+        assertThat(lines[3]).containsPattern("Address *Rack *Status *State 
*Load *Owns *Token *");
         String hostRing = lines[lines.length-4].trim(); // this command has a 
couple extra newlines and an empty error message at the end. Not messing with 
it.
-        assertThat(hostRing, startsWith(hostForm));
-        assertThat(hostRing, containsString(SimpleSnitch.RACK_NAME));
-        assertThat(hostRing, containsString("Up"));
-        assertThat(hostRing, containsString("Normal"));
-        assertThat(hostRing, matchesPattern(".*\\d+\\.\\d+ KiB.*"));
-        assertThat(hostRing, matchesPattern(".*\\d+\\.\\d+%.*"));
-        assertThat(hostRing, endsWith(token));
-        assertThat(hostRing, not(containsString("?")));
+        assertThat(hostRing).startsWith(hostForm);
+        assertThat(hostRing).contains(SimpleSnitch.RACK_NAME);
+        assertThat(hostRing).contains("Up");
+        assertThat(hostRing).contains("Normal");
+        assertThat(hostRing).containsPattern("\\d+\\.\\d+ KiB");
+        assertThat(hostRing).containsPattern("\\d+\\.\\d+%");
+        assertThat(hostRing).endsWith(token);
+        assertThat(hostRing).doesNotContain("?");
     }
 
     @Test
     public void testWrongArgFailsAndPrintsHelp()
     {
         ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("--wrongarg", 
"ring");
-        Assertions.assertThat(tool.getStdout()).containsIgnoringCase("nodetool 
help");
-        assertEquals(1, tool.getExitCode());
-        assertTrue(tool.getCleanedStderr().isEmpty());
+        tool.assertCleanStdErr();
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("nodetool help");
     }
 
     @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
     public void testMaybeChangeDocs()
     {
         // If you added, modified options or help, please update docs if 
necessary
 
         ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "ring");
+        tool.assertOnCleanExit();
 
         String help = "NAME\n" + "        nodetool ring - Print information 
about the token ring\n"
                       + "\n"
@@ -159,7 +150,7 @@ public class RingTest extends CQLTester
                       + "            awareness)\n"
                       + "\n"
                       + "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
+        assertThat(tool.getStdout()).isEqualTo(help);
     }
 
     @Test
@@ -167,14 +158,12 @@ public class RingTest extends CQLTester
     {
         // Bad KS
         ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("ring", 
"mockks");
-        Assertions.assertThat(tool.getStdout()).contains("The keyspace mockks, 
does not exist");
-        assertEquals(0, tool.getExitCode());
-        assertTrue(tool.getCleanedStderr().isEmpty());
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("The keyspace mockks, does not 
exist");
 
         // Good KS
         tool = ToolRunner.invokeNodetool("ring", "system_schema");
-        Assertions.assertThat(tool.getStdout()).contains("Datacenter: 
datacenter1");
-        assertEquals(0, tool.getExitCode());
-        assertTrue(tool.getCleanedStderr().isEmpty());
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Datacenter: datacenter1");
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SjkTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/SjkTest.java
index c183edf..9812ef2 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/SjkTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SjkTest.java
@@ -26,7 +26,7 @@ public class SjkTest
     @Test
     public void sjkHelpReturnsRc0()
     {
-        ToolRunner.ToolResult result = ToolRunner.invokeNodetool("sjk", 
"--help");
-        result.assertOnExitCode();
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("sjk", 
"--help");
+        tool.assertOnExitCode();
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/StatusTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/StatusTest.java
index f7bc937..494d365 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/StatusTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/StatusTest.java
@@ -30,9 +30,7 @@ import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static org.hamcrest.CoreMatchers.*;
-import static org.hamcrest.Matchers.matchesPattern;
-import static org.junit.Assert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 
 @RunWith(OrderedJUnit4ClassRunner.class)
 public class StatusTest extends CQLTester
@@ -43,10 +41,10 @@ public class StatusTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
-        StorageService.instance.initServer();
+        requireNetwork();
+        startJMXServer();
         localHostId = StorageService.instance.getLocalHostId();
         token = StorageService.instance.getTokens().get(0);
-        startJMXServer();
     }
 
     /**
@@ -71,6 +69,7 @@ public class StatusTest extends CQLTester
      * Validate output, making sure even when bootstrapping any available info 
is displayed (c16412)
      */
     @Test
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
     public void testOutputWhileBootstrapping()
     {
         // Deleting these tables will simulate we're bootstrapping
@@ -78,26 +77,28 @@ public class StatusTest extends CQLTester
         schemaChange("DROP KEYSPACE " + CQLTester.KEYSPACE);
         schemaChange("DROP KEYSPACE " + CQLTester.KEYSPACE_PER_TEST);
 
-        ToolRunner.ToolResult nodetool = ToolRunner.invokeNodetool("status");
-        nodetool.assertOnCleanExit();
-        String[] lines = nodetool.getStdout().split("\\R");
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("status");
+        tool.assertOnCleanExit();
+        String[] lines = tool.getStdout().split("\\R");
 
         String hostStatus = lines[lines.length-3].trim();
-        assertThat(hostStatus, startsWith("UN"));
-        assertThat(hostStatus, 
containsString(FBUtilities.getJustLocalAddress().getHostAddress()));
-        assertThat(hostStatus, matchesPattern(".*\\d+\\.\\d+ KiB.*"));
-        assertThat(hostStatus, containsString(localHostId));
-        assertThat(hostStatus, containsString(token));
-        assertThat(hostStatus, endsWith(SimpleSnitch.RACK_NAME));
+        assertThat(hostStatus).startsWith("UN");
+        
assertThat(hostStatus).contains(FBUtilities.getJustLocalAddress().getHostAddress());
+        assertThat(hostStatus).containsPattern("\\d+\\.\\d+ KiB");
+        assertThat(hostStatus).contains(localHostId);
+        assertThat(hostStatus).contains(token);
+        assertThat(hostStatus).endsWith(SimpleSnitch.RACK_NAME);
 
-        String bootstrappingWarn = lines[lines.length-1].trim();;
-        assertThat(bootstrappingWarn, containsString("probably still 
bootstrapping. Effective ownership information is meaningless."));
+        String bootstrappingWarn = lines[lines.length-1].trim();
+        assertThat(bootstrappingWarn)
+                .contains("probably still bootstrapping. Effective ownership 
information is meaningless.");
     }
 
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
     private void validateStatusOutput(String hostForm, String... args)
     {
-        ToolRunner.ToolResult nodetool = ToolRunner.invokeNodetool(args);
-        nodetool.assertOnCleanExit();
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(args);
+        tool.assertOnCleanExit();
         /*
          Datacenter: datacenter1
          =======================
@@ -106,16 +107,16 @@ public class StatusTest extends CQLTester
          --  Address    Load       Owns (effective)  Host ID                   
            Token                Rack
          UN  localhost  45.71 KiB  100.0%            
0b1b5e91-ad3b-444e-9c24-50578486978a  1849950853373272258  rack1
          */
-        String[] lines = nodetool.getStdout().split("\\R");
-        assertThat(lines[0].trim(), endsWith(SimpleSnitch.DATA_CENTER_NAME));
+        String[] lines = tool.getStdout().split("\\R");
+        assertThat(lines[0].trim()).endsWith(SimpleSnitch.DATA_CENTER_NAME);
         String hostStatus = lines[lines.length-1].trim();
-        assertThat(hostStatus, startsWith("UN"));
-        assertThat(hostStatus, containsString(hostForm));
-        assertThat(hostStatus, matchesPattern(".*\\d+\\.\\d+ KiB.*"));
-        assertThat(hostStatus, matchesPattern(".*\\d+\\.\\d+%.*"));
-        assertThat(hostStatus, containsString(localHostId));
-        assertThat(hostStatus, containsString(token));
-        assertThat(hostStatus, endsWith(SimpleSnitch.RACK_NAME));
-        assertThat(hostStatus, not(containsString("?")));
+        assertThat(hostStatus).startsWith("UN");
+        assertThat(hostStatus).contains(hostForm);
+        assertThat(hostStatus).containsPattern("\\d+\\.\\d+ KiB");
+        assertThat(hostStatus).containsPattern("\\d+\\.\\d+%");
+        assertThat(hostStatus).contains(localHostId);
+        assertThat(hostStatus).contains(token);
+        assertThat(hostStatus).endsWith(SimpleSnitch.RACK_NAME);
+        assertThat(hostStatus).doesNotContain("?");
     }
 }
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/stats/NodetoolTableStatsTest.java
 b/test/unit/org/apache/cassandra/tools/nodetool/TableStatsTest.java
similarity index 67%
rename from 
test/unit/org/apache/cassandra/tools/nodetool/stats/NodetoolTableStatsTest.java
rename to test/unit/org/apache/cassandra/tools/nodetool/TableStatsTest.java
index a459f0f..ccdb16a 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/stats/NodetoolTableStatsTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/TableStatsTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.cassandra.tools.nodetool.stats;
+package org.apache.cassandra.tools.nodetool;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -25,39 +25,34 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.StringUtils;
-
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import org.apache.cassandra.OrderedJUnit4ClassRunner;
 import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.tools.ToolRunner;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.assertj.core.api.Assertions;
-import org.hamcrest.CoreMatchers;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 
 @RunWith(OrderedJUnit4ClassRunner.class)
-public class NodetoolTableStatsTest extends CQLTester
+public class TableStatsTest extends CQLTester
 {
     @BeforeClass
     public static void setup() throws Exception
     {
-        StorageService.instance.initServer();
+        requireNetwork();
         startJMXServer();
     }
 
     @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
     public void testMaybeChangeDocs()
     {
         // If you added, modified options or help, please update docs if 
necessary
-        ToolResult tool = ToolRunner.invokeNodetool("help", "tablestats");
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", 
"tablestats");
+        tool.assertOnCleanExit();
+
         String help =   "NAME\n" +
                         "        nodetool tablestats - Print statistics on 
tables\n" + 
                         "\n" + 
@@ -134,50 +129,41 @@ public class NodetoolTableStatsTest extends CQLTester
                         "            List of tables (or keyspace) names\n" + 
                         "\n" + 
                         "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
-        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEqualTo(help);
     }
 
     @Test
     public void testTableStats()
     {
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats");
-
-        assertThat(tool.getStdout(), CoreMatchers.containsString("Keyspace : 
system_schema"));
-        assertTrue(StringUtils.countMatches(tool.getStdout(), "Table:") > 1);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats");
         tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace : system_schema");
+        assertThat(StringUtils.countMatches(tool.getStdout(), 
"Table:")).isGreaterThan(1);
 
         tool = ToolRunner.invokeNodetool("tablestats", "system_distributed");
-        assertThat(tool.getStdout(), CoreMatchers.containsString("Keyspace : 
system_distributed"));
-        assertThat(tool.getStdout(), 
CoreMatchers.not(CoreMatchers.containsString("Keyspace : system_schema")));
-        assertTrue(StringUtils.countMatches(tool.getStdout(), "Table:") > 1);
         tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace : system_distributed");
+        assertThat(tool.getStdout()).doesNotContain("Keyspace : 
system_schema");
+        assertThat(StringUtils.countMatches(tool.getStdout(), 
"Table:")).isGreaterThan(1);
     }
 
     @Test
     public void testTableIgnoreArg()
     {
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-i", 
"system_schema.aggregates");
-
-        assertThat(tool.getStdout(), CoreMatchers.containsString("Keyspace : 
system_schema"));
-        assertThat(tool.getStdout(), 
CoreMatchers.not(CoreMatchers.containsString("Table: 
system_schema.aggregates")));
-        assertTrue(StringUtils.countMatches(tool.getStdout(), "Table:") > 1);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", 
"-i", "system_schema.aggregates");
         tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace : system_schema");
+        assertThat(tool.getStdout()).doesNotContain("Table: 
system_schema.aggregates");
+        assertThat(StringUtils.countMatches(tool.getStdout(), 
"Table:")).isGreaterThan(1);
     }
 
     @Test
     public void testHumanReadableArg()
     {
         Arrays.asList("-H", "--human-readable").forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg);
-            assertThat(argFormat(arg), tool.getStdout(), 
CoreMatchers.containsString(" KiB"));
-            assertTrue(String.format("Expected empty stderr for option [%s] 
but found: %s",
-                                     arg,
-                                     tool.getCleanedStderr()),
-                       tool.getCleanedStderr().isEmpty());
-            assertEquals(String.format("Expected exit code 0 for option [%s] 
but found: %s", arg, tool.getExitCode()),
-                         0,
-                         tool.getExitCode());
+            ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("tablestats", arg);
+            tool.assertOnCleanExit();
+            assertThat(tool.getStdout()).contains(" KiB");
         });
     }
 
@@ -187,66 +173,57 @@ public class NodetoolTableStatsTest extends CQLTester
         Pattern regExp = Pattern.compile("((?m)Table: .*$)");
 
         Arrays.asList("-s", "--sort").forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, 
"table_name");
+            ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("tablestats", arg, "table_name");
             Matcher m = regExp.matcher(tool.getStdout());
             ArrayList<String> orig = new ArrayList<>();
             while (m.find())
                 orig.add(m.group(1));
 
             tool = ToolRunner.invokeNodetool("tablestats", arg, 
"sstable_count");
+            tool.assertOnCleanExit();
             m = regExp.matcher(tool.getStdout());
             ArrayList<String> sorted = new ArrayList<>();
             while (m.find())
                 sorted.add(m.group(1));
 
-            assertNotEquals(argFormat(arg), orig, sorted);
+            assertThat(sorted).isNotEqualTo(orig);
             Collections.sort(orig);
             Collections.sort(sorted);
-            assertEquals(argFormat(arg), orig, sorted);
-            assertTrue(argFormat(arg), tool.getCleanedStderr().isEmpty());
-            assertEquals(0, tool.getExitCode());
+            assertThat(sorted).isEqualTo(orig);
         });
 
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", 
"wrongSort");
-        assertThat(tool.getStdout(), CoreMatchers.containsString("argument for 
sort must be one of"));
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", 
"-s", "wrongSort");
+        assertThat(tool.getStdout()).contains("argument for sort must be one 
of");
         tool.assertCleanStdErr();
-        assertEquals(1, tool.getExitCode());
+        assertThat(tool.getExitCode()).isEqualTo(1);
     }
 
     @Test
     public void testTopArg()
     {
         Arrays.asList("-t", "--top").forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", 
"table_name", arg, "1");
-            assertEquals(argFormat(arg), 
StringUtils.countMatches(tool.getStdout(), "Table:"), 1);
-            assertTrue(argFormat(arg), tool.getCleanedStderr().isEmpty());
-            assertEquals(argFormat(arg), 0, tool.getExitCode());
+            ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("tablestats", "-s", "table_name", arg, "1");
+            tool.assertOnCleanExit();
+            assertThat(StringUtils.countMatches(tool.getStdout(), 
"Table:")).isEqualTo(1);
         });
 
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", 
"table_name", "-t", "-1");
-        assertThat(tool.getStdout(), CoreMatchers.containsString("argument for 
top must be a positive integer"));
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", 
"-s", "table_name", "-t", "-1");
         tool.assertCleanStdErr();
-        assertEquals(1, tool.getExitCode());
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("argument for top must be a 
positive integer");
     }
 
     @Test
     public void testSSTableLocationCheckArg()
     {
         Arrays.asList("-l", "--sstable-location-check").forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, 
"system.local");
-            assertEquals(argFormat(arg), 
StringUtils.countMatches(tool.getStdout(), "SSTables in correct location: "), 
1);
-            assertTrue(argFormat(arg), tool.getCleanedStderr().isEmpty());
-            assertEquals(argFormat(arg), 0, tool.getExitCode());
+            ToolRunner.ToolResult tool = 
ToolRunner.invokeNodetool("tablestats", arg, "system.local");
+            tool.assertOnCleanExit();
+            assertThat(StringUtils.countMatches(tool.getStdout(), "SSTables in 
correct location: ")).isEqualTo(1);
         });
 
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats", 
"system.local");
-        assertThat(tool.getStdout(), 
CoreMatchers.not(CoreMatchers.containsString("SSTables in correct location: 
")));
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", 
"system.local");
         tool.assertCleanStdErr();
-        assertEquals(0, tool.getExitCode());
-    }
-
-    private String argFormat(String arg)
-    {
-        return "Arg: [" + arg + ']';
+        assertThat(tool.getStdout()).doesNotContain("SSTables in correct 
location: ");
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/NodeToolTPStatsTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/TpStatsTest.java
similarity index 69%
rename from test/unit/org/apache/cassandra/tools/NodeToolTPStatsTest.java
rename to test/unit/org/apache/cassandra/tools/nodetool/TpStatsTest.java
index 31423a4..0cbcb49 100644
--- a/test/unit/org/apache/cassandra/tools/NodeToolTPStatsTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/TpStatsTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.cassandra.tools;
+package org.apache.cassandra.tools.nodetool;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -26,8 +26,6 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.tuple.Pair;
-
-import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -38,41 +36,33 @@ import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.NoPayload;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
+import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.utils.FBUtilities;
-import org.assertj.core.api.Assertions;
 import org.yaml.snakeyaml.Yaml;
 
 import static org.apache.cassandra.net.Verb.ECHO_REQ;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 
 @RunWith(OrderedJUnit4ClassRunner.class)
-public class NodeToolTPStatsTest extends CQLTester
+public class TpStatsTest extends CQLTester
 {
-    private static NodeProbe probe;
 
     @BeforeClass
     public static void setup() throws Exception
     {
         requireNetwork();
         startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
     }
 
     @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
     public void testMaybeChangeDocs()
     {
         // If you added, modified options or help, please update docs if 
necessary
-        ToolResult tool = ToolRunner.invokeNodetool("help", "tpstats");
-        String help =   "NAME\n" + 
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", 
"tpstats");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
                         "        nodetool tpstats - Print usage statistics of 
thread pools\n" + 
                         "\n" + 
                         "SYNOPSIS\n" + 
@@ -105,66 +95,64 @@ public class NodeToolTPStatsTest extends CQLTester
                         "            Remote jmx agent username\n" +  
                         "\n" + 
                         "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
+        assertThat(tool.getStdout()).isEqualTo(help);
     }
 
     @Test
-    public void testTPStats() throws Throwable
+    public void testTpStats() throws Throwable
     {
-        ToolResult tool = ToolRunner.invokeNodetool("tpstats");
-        Assertions.assertThat(tool.getStdout()).containsPattern("Pool Name 
\\s* Active Pending Completed Blocked All time blocked");
-        
Assertions.assertThat(tool.getStdout()).containsIgnoringCase("Latencies waiting 
in queue (micros) per dropped message types");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tpstats");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).containsPattern("Pool Name \\s+ Active Pending 
Completed Blocked All time blocked");
+        assertThat(stdout).contains("Latencies waiting in queue (micros) per 
dropped message types");
 
         // Does inserting data alter tpstats?
         String nonZeroedThreadsRegExp = "((?m)\\D.*[1-9].*)";
-        ArrayList<String> origStats = 
getAllGroupMatches(nonZeroedThreadsRegExp, tool.getStdout());
+        ArrayList<String> origStats = 
getAllGroupMatches(nonZeroedThreadsRegExp, stdout);
         Collections.sort(origStats);
 
         createTable("CREATE TABLE %s (pk int, c int, PRIMARY KEY(pk))");
         execute("INSERT INTO %s (pk, c) VALUES (?, ?)", 1, 1);
         tool = ToolRunner.invokeNodetool("tpstats");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-        ArrayList<String> newStats = 
getAllGroupMatches(nonZeroedThreadsRegExp, tool.getStdout());
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        ArrayList<String> newStats = 
getAllGroupMatches(nonZeroedThreadsRegExp, stdout);
         Collections.sort(newStats);
 
-        assertNotEquals(origStats, newStats);
+        assertThat(origStats).isNotEqualTo(newStats);
 
         // Does sending a message alter Gossip & ECHO stats?
-        String origGossip = getAllGroupMatches("((?m)GossipStage.*)", 
tool.getStdout()).get(0);
-        
Assertions.assertThat(tool.getStdout()).doesNotContainPattern("ECHO_REQ\\D.*[1-9].*");
-        
Assertions.assertThat(tool.getStdout()).doesNotContainPattern("ECHO_RSP\\D.*[1-9].*");
+        String origGossip = getAllGroupMatches("((?m)GossipStage.*)", 
stdout).get(0);
+        assertThat(stdout).doesNotContainPattern("ECHO_REQ\\D.*[1-9].*");
+        assertThat(stdout).doesNotContainPattern("ECHO_RSP\\D.*[1-9].*");
 
         Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, 
NoPayload.noPayload);
         MessagingService.instance().send(echoMessageOut, 
FBUtilities.getBroadcastAddressAndPort());
 
         tool = ToolRunner.invokeNodetool("tpstats");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-        String newGossip = getAllGroupMatches("((?m)GossipStage.*)", 
tool.getStdout()).get(0);
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        String newGossip = getAllGroupMatches("((?m)GossipStage.*)", 
stdout).get(0);
 
-        assertNotEquals(origGossip, newGossip);
-        
Assertions.assertThat(tool.getStdout()).containsPattern("ECHO_REQ\\D.*[1-9].*");
-        
Assertions.assertThat(tool.getStdout()).containsPattern("ECHO_RSP\\D.*[1-9].*");
+        assertThat(origGossip).isNotEqualTo(newGossip);
+        assertThat(stdout).containsPattern("ECHO_REQ\\D.*[1-9].*");
+        assertThat(stdout).containsPattern("ECHO_RSP\\D.*[1-9].*");
     }
 
     @Test
-    public void testFromatArg() throws Throwable
+    public void testFromatArg()
     {
         Arrays.asList(Pair.of("-F", "json"), Pair.of("--format", 
"json")).forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tpstats", 
arg.getLeft(), arg.getRight());
-            assertTrue(isJSONString(tool.getStdout()));
-            assertTrue(tool.getCleanedStderr().isEmpty());
-            assertEquals(0, tool.getExitCode());
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tpstats", 
arg.getLeft(), arg.getRight());
+            tool.assertOnCleanExit();
+            assertThat(isJSONString(tool.getStdout())).isTrue();
         });
 
         Arrays.asList( Pair.of("-F", "yaml"), Pair.of("--format", 
"yaml")).forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tpstats", 
arg.getLeft(), arg.getRight());
-            assertTrue(isYAMLString(tool.getStdout()));
-            assertTrue(tool.getCleanedStderr().isEmpty());
-            assertEquals(0, tool.getExitCode());
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tpstats", 
arg.getLeft(), arg.getRight());
+            tool.assertOnCleanExit();
+            assertThat(isYAMLString(tool.getStdout())).isTrue();
         });
     }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to