You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2020/10/06 20:18:00 UTC

[cassandra] branch trunk updated: sstablemetadata unit test, docs and params parsing hardening

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

brandonwilliams 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 e8d3743  sstablemetadata unit test, docs and params parsing hardening
e8d3743 is described below

commit e8d3743b1aa25a23f04726903d0cbf61f9824fe0
Author: Bereng <be...@gmail.com>
AuthorDate: Tue Oct 6 05:40:01 2020 +0200

    sstablemetadata unit test, docs and params parsing hardening
    
    Patch by Bereguer Blasi, reviewed by brandonwilliams for CASSANDRA-16016
---
 doc/source/tools/sstable/sstablemetadata.rst       |  8 +-
 .../cassandra/tools/SSTableLevelResetterTest.java  |  2 +-
 .../cassandra/tools/SSTableMetadataViewerTest.java | 94 ++++++++++++++++------
 .../cassandra/tools/StandaloneSSTableUtilTest.java |  2 +-
 .../cassandra/tools/StandaloneScrubberTest.java    |  2 +-
 .../cassandra/tools/StandaloneUpgraderTest.java    |  4 +-
 .../cassandra/tools/StandaloneVerifierTest.java    |  2 +-
 7 files changed, 83 insertions(+), 31 deletions(-)

diff --git a/doc/source/tools/sstable/sstablemetadata.rst b/doc/source/tools/sstable/sstablemetadata.rst
index 0a7a422..48a1de5 100644
--- a/doc/source/tools/sstable/sstablemetadata.rst
+++ b/doc/source/tools/sstable/sstablemetadata.rst
@@ -29,7 +29,11 @@ Usage
 sstablemetadata <options> <sstable filename(s)>
 
 =========================        ================================================================================
---gc_grace_seconds <arg>         The gc_grace_seconds to use when calculating droppable tombstones
+-c,--colors                      Use ANSI color sequences
+-g,--gc_grace_seconds <arg>      Time to use when calculating droppable tombstones
+-s,--scan                        Full sstable scan for additional details. Only available in 3.0+ sstables. Defaults: false
+-t,--timestamp_unit <arg>        Time unit that cell timestamps are written with
+-u,--unicode                     Use unicode to draw histograms and progress bars
 =========================        ================================================================================
 
 Print all the metadata
@@ -252,7 +256,7 @@ Example::
     sstablemetadata --gc_grace_seconds 4700 /var/lib/cassandra/data/keyspace1/standard1-41b52700b4ed11e896476d2c86545d91/mc-12-big-Data.db | grep "Estimated droppable tombstones"
     Estimated droppable tombstones: 9.61111111111111E-6
 
-    # if gc_grace_seconds was configured at 100, none of the tombstones would be currently droppable 
+    # if gc_grace_seconds was configured at 5000, none of the tombstones would be currently droppable 
     sstablemetadata --gc_grace_seconds 5000 /var/lib/cassandra/data/keyspace1/standard1-41b52700b4ed11e896476d2c86545d91/mc-12-big-Data.db | grep "Estimated droppable tombstones"
     Estimated droppable tombstones: 0.0
 
diff --git a/test/unit/org/apache/cassandra/tools/SSTableLevelResetterTest.java b/test/unit/org/apache/cassandra/tools/SSTableLevelResetterTest.java
index e413b14..3f1c892 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableLevelResetterTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableLevelResetterTest.java
@@ -73,7 +73,7 @@ public class SSTableLevelResetterTest extends OfflineToolUtils
         ToolResult tool = ToolRunner.invokeClass(SSTableLevelResetter.class, "--really-reset", "system_schema", "tables");
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("Found no sstables,"));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
-        assertEquals(0,tool.getExitCode());
+        assertEquals(0, tool.getExitCode());
         assertCorrectEnvPostTest();
     }
 
diff --git a/test/unit/org/apache/cassandra/tools/SSTableMetadataViewerTest.java b/test/unit/org/apache/cassandra/tools/SSTableMetadataViewerTest.java
index db0c958..7fd1353 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableMetadataViewerTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableMetadataViewerTest.java
@@ -18,11 +18,14 @@
 
 package org.apache.cassandra.tools;
 
+import java.io.IOException;
 import java.util.Arrays;
 
-import org.apache.commons.codec.digest.DigestUtils;
+import com.google.common.base.CharMatcher;
+
 import org.apache.commons.lang3.tuple.Pair;
 
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -34,11 +37,18 @@ import org.hamcrest.CoreMatchers;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 @RunWith(OrderedJUnit4ClassRunner.class)
 public class SSTableMetadataViewerTest extends OfflineToolUtils
 {
+    private static String sstable;
+
+    @BeforeClass
+    public static void setupTest() throws IOException
+    {
+        sstable = findOneSSTable("legacy_sstables", "legacy_ma_simple");
+    }
+
     @Test
     public void testNoArgsPrintsHelp()
     {
@@ -77,36 +87,63 @@ public class SSTableMetadataViewerTest extends OfflineToolUtils
     @Test
     public void testWrongArgFailsAndPrintsHelp()
     {
-        ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, "--debugwrong", "ks", "tab");
+        ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, "--debugwrong", "sstableFile");
         assertTrue(tool.getStdout(), tool.getStdout().isEmpty());
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Options:"));
         assertEquals(1, tool.getExitCode());
     }
 
     @Test
-    public void testDefaultCall()
+    public void testNAFileCall()
     {
-        ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, "ks", "tab");
+        ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, "mockFile");
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("No such file"));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
-        assertEquals(0,tool.getExitCode());
+        assertEquals(0, tool.getExitCode());
+        assertGoodEnvPostTest();
+    }
+
+    @Test
+    public void testOnlySstableArg()
+    {
+        ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, sstable);
+        Assertions.assertThat(tool.getStdout()).doesNotContain(Util.BLUE);
+        assertTrue(tool.getStdout(), CharMatcher.ascii().matchesAllOf(tool.getStdout()));
+        Assertions.assertThat(tool.getStdout()).doesNotContain("Widest Partitions");
+        Assertions.assertThat(tool.getStdout()).contains(sstable.replaceAll("-Data\\.db$", ""));
+        assertTrue(tool.getStderr(), tool.getStderr().isEmpty());
+        assertEquals(0, tool.getExitCode());
         assertGoodEnvPostTest();
     }
 
     @Test
-    public void testFlagArgs()
+    public void testColorArg()
     {
         Arrays.asList("-c",
-                      "--colors",
-                      "-s",
-                      "--scan",
-                      "-u",
+                      "--colors")
+              .stream()
+              .forEach(arg -> {
+                  ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, arg, sstable);
+                  Assertions.assertThat(tool.getStdout()).contains(Util.BLUE);
+                  Assertions.assertThat(tool.getStdout()).contains(sstable.replaceAll("-Data\\.db$", ""));
+                  assertTrue("Arg: [" + arg + "]\n" + tool.getStderr(), tool.getStderr().isEmpty());
+                  assertEquals(0, tool.getExitCode());
+                  assertGoodEnvPostTest();
+              });
+    }
+
+    @Test
+    public void testUnicodeArg()
+    {
+        Arrays.asList("-u",
                       "--unicode")
+              .stream()
               .forEach(arg -> {
-                  ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, arg, "ks", "tab");
-                  assertThat("Arg: [" + arg + "]", tool.getStdout(), CoreMatchers.containsStringIgnoringCase("No such file"));
-                  Assertions.assertThat(tool.getCleanedStderr()).as("Arg: [%s]", arg).isEmpty();
-                  assertEquals(0,tool.getExitCode());
+                  ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, arg, sstable);
+                  assertTrue(tool.getStdout(), !CharMatcher.ascii().matchesAllOf(tool.getStdout()));
+                  Assertions.assertThat(tool.getStdout()).contains(sstable.replaceAll("-Data\\.db$", ""));
+                  assertTrue("Arg: [" + arg + "]\n" + tool.getStderr(), tool.getStderr().isEmpty());
+                  assertEquals(0, tool.getExitCode());
                   assertGoodEnvPostTest();
               });
     }
@@ -122,8 +159,7 @@ public class SSTableMetadataViewerTest extends OfflineToolUtils
                   ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class,
                                                            arg.getLeft(),
                                                            arg.getRight(),
-                                                           "ks",
-                                                           "tab");
+                                                           "mockFile");
                   assertEquals(-1, tool.getExitCode());
                   Assertions.assertThat(tool.getStderr()).contains(NumberFormatException.class.getSimpleName());
               });
@@ -132,8 +168,7 @@ public class SSTableMetadataViewerTest extends OfflineToolUtils
             ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class,
                                                             arg.getLeft(),
                                                             arg.getRight(),
-                                                            "ks",
-                                                            "tab");
+                                                            "mockFile");
             assertThat("Arg: [" + arg + "]", tool.getStdout(), CoreMatchers.containsStringIgnoringCase("No such file"));
             Assertions.assertThat(tool.getCleanedStderr()).as("Arg: [%s]", arg).isEmpty();
             tool.assertOnExitCode();
@@ -152,8 +187,7 @@ public class SSTableMetadataViewerTest extends OfflineToolUtils
                   ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class,
                                                            arg.getLeft(),
                                                            arg.getRight(),
-                                                           "ks",
-                                                           "tab");
+                                                           "mockFile");
                   assertEquals(-1, tool.getExitCode());
                   Assertions.assertThat(tool.getStderr()).contains(IllegalArgumentException.class.getSimpleName());
               });
@@ -162,8 +196,7 @@ public class SSTableMetadataViewerTest extends OfflineToolUtils
             ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class,
                                                        arg.getLeft(),
                                                        arg.getRight(),
-                                                       "ks",
-                                                       "tab");
+                                                       "mockFile");
             assertThat("Arg: [" + arg + "]", tool.getStdout(), CoreMatchers.containsStringIgnoringCase("No such file"));
             Assertions.assertThat(tool.getCleanedStderr()).as("Arg: [%s]", arg).isEmpty();
             tool.assertOnExitCode();
@@ -171,6 +204,21 @@ public class SSTableMetadataViewerTest extends OfflineToolUtils
         });
     }
 
+    @Test
+    public void testScanArg()
+    {
+        Arrays.asList("-s",
+                      "--scan")
+              .stream()
+              .forEach(arg -> {
+                  ToolResult tool = ToolRunner.invokeClass(SSTableMetadataViewer.class, arg, sstable);
+                  Assertions.assertThat(tool.getStdout()).contains("Widest Partitions");
+                  Assertions.assertThat(tool.getStdout()).contains(sstable.replaceAll("-Data\\.db$", ""));
+                  assertTrue("Arg: [" + arg + "]\n" + tool.getStderr(), tool.getStderr().isEmpty());
+                  assertEquals(0, tool.getExitCode());
+              });
+    }
+
     private void assertGoodEnvPostTest()
     {
         assertNoUnexpectedThreadsStarted(null, OPTIONAL_THREADS_WITH_SCHEMA);
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneSSTableUtilTest.java b/test/unit/org/apache/cassandra/tools/StandaloneSSTableUtilTest.java
index 460fb10..efe7396 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneSSTableUtilTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneSSTableUtilTest.java
@@ -86,7 +86,7 @@ public class StandaloneSSTableUtilTest extends OfflineToolUtils
         ToolResult tool = ToolRunner.invokeClass(StandaloneSSTableUtil.class, "system_schema", "tables");
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("Listing files..."));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
-        assertEquals(0,tool.getExitCode());
+        assertEquals(0, tool.getExitCode());
         assertCorrectEnvPostTest();
     }
 
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneScrubberTest.java b/test/unit/org/apache/cassandra/tools/StandaloneScrubberTest.java
index 3593025..f0b996f 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneScrubberTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneScrubberTest.java
@@ -101,7 +101,7 @@ public class StandaloneScrubberTest extends OfflineToolUtils
         ToolResult tool = ToolRunner.invokeClass(StandaloneScrubber.class, "system_schema", "tables");
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("Pre-scrub sstables snapshotted into snapshot"));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
-        assertEquals(0,tool.getExitCode());
+        assertEquals(0, tool.getExitCode());
         assertCorrectEnvPostTest();
     }
 
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneUpgraderTest.java b/test/unit/org/apache/cassandra/tools/StandaloneUpgraderTest.java
index 3a4177b..0f0c6b3 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneUpgraderTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneUpgraderTest.java
@@ -87,7 +87,7 @@ public class StandaloneUpgraderTest extends OfflineToolUtils
         ToolResult tool = ToolRunner.invokeClass(StandaloneUpgrader.class, "system_schema", "tables");
         Assertions.assertThat(tool.getStdout()).isEqualTo("Found 0 sstables that need upgrading.\n");
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
-        assertEquals(0,tool.getExitCode());
+        assertEquals(0, tool.getExitCode());
         assertCorrectEnvPostTest();
     }
 
@@ -101,7 +101,7 @@ public class StandaloneUpgraderTest extends OfflineToolUtils
                                                        "tables");
             Assertions.assertThat(tool.getStdout()).as("Arg: [%s]", arg).isEqualTo("Found 0 sstables that need upgrading.\n");
             Assertions.assertThat(tool.getCleanedStderr()).as("Arg: [%s]", arg).isEmpty();
-            assertEquals(0,tool.getExitCode());
+            assertEquals(0, tool.getExitCode());
             assertCorrectEnvPostTest();
         });
     }
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneVerifierTest.java b/test/unit/org/apache/cassandra/tools/StandaloneVerifierTest.java
index f736edd..0494f1f 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneVerifierTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneVerifierTest.java
@@ -87,7 +87,7 @@ public class StandaloneVerifierTest extends OfflineToolUtils
         ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "system_schema", "tables");
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("using the following options"));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
-        assertEquals(0,tool.getExitCode());
+        assertEquals(0, tool.getExitCode());
         assertCorrectEnvPostTest();
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org