tshark: Print the packets' comments in the expert info
authorVasil Velichkov <vasko@vvelichkov2.dev.opencode.com>
Wed, 7 Nov 2018 19:33:41 +0000 (21:33 +0200)
committerGuy Harris <guy@alum.mit.edu>
Tue, 13 Nov 2018 21:18:30 +0000 (21:18 +0000)
Previously 'tshark -z expert' was failing with abort when a packet
contains a comment

- Add a new comment parameter and update the tshark's manual page
- Add a new comment_level severity and change the default lavel to it.
- Add various 'tshark -z expert' tests

Change-Id: I188317da5e00019b8f2b725f0fe84942f774520f
Reviewed-on: https://code.wireshark.org/review/30610
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot
Reviewed-by: Guy Harris <guy@alum.mit.edu>
doc/tshark.pod
test/suite_clopts.py
ui/cli/tap-expert.c

index b3e0924b74eac844f258a02e021b99098de79372..ac60b273019fb22f581dddb715578c20c4198056 100644 (file)
@@ -1178,7 +1178,7 @@ the number of packets/bytes in each direction as well as the total
 number of packets/bytes.  The table is sorted according to the total
 number of frames.
 
-=item B<-z> expert[I<,error|,warn|,note|,chat>][I<,filter>]
+=item B<-z> expert[I<,error|,warn|,note|,chat|,comment>][I<,filter>]
 
 Collects information about all expert info, and will display them in order,
 grouped by severity.
index aa6ec95cccd7b8443fa68c75ba8a7e1a3b8e5a97..98981ad8caf1cbf6afb7f36b2816ee39be6a4bd9 100644 (file)
@@ -192,6 +192,75 @@ class case_tshark_dump_glossaries(subprocesstest.SubprocessTestCase):
         self.runProcess((config.cmd_tshark, '-G', 'plugins'), env=config.baseEnv())
         self.assertGreaterEqual(self.countOutput('dissector'), 10, 'Fewer than 10 dissector plugins found')
 
+class case_tshark_z_expert(subprocesstest.SubprocessTestCase):
+    def test_tshark_z_expert_all(self):
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert',
+            '-r', os.path.join(config.capture_dir, 'http-ooo.pcap')))
+        self.assertTrue(self.grepOutput('Errors'))
+        self.assertTrue(self.grepOutput('Warns'))
+        self.assertTrue(self.grepOutput('Chats'))
+
+    def test_tshark_z_expert_error(self):
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,error',
+            '-r', os.path.join(config.capture_dir, 'http-ooo.pcap')))
+        self.assertTrue(self.grepOutput('Errors'))
+        self.assertFalse(self.grepOutput('Warns'))
+        self.assertFalse(self.grepOutput('Chats'))
+
+    def test_tshark_z_expert_warn(self):
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,warn',
+            '-r', os.path.join(config.capture_dir, 'http-ooo.pcap')))
+        self.assertTrue(self.grepOutput('Errors'))
+        self.assertTrue(self.grepOutput('Warns'))
+        self.assertFalse(self.grepOutput('Chats'))
+
+    def test_tshark_z_expert_note(self):
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,note',
+            '-r', os.path.join(config.capture_dir, 'http2-data-reassembly.pcap')))
+        self.assertTrue(self.grepOutput('Warns'))
+        self.assertTrue(self.grepOutput('Notes'))
+        self.assertFalse(self.grepOutput('Chats'))
+
+    def test_tshark_z_expert_chat(self):
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,chat',
+            '-r', os.path.join(config.capture_dir, 'http-ooo.pcap')))
+        self.assertTrue(self.grepOutput('Errors'))
+        self.assertTrue(self.grepOutput('Warns'))
+        self.assertTrue(self.grepOutput('Chats'))
+
+    def test_tshark_z_expert_comment(self):
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,comment',
+            '-r', os.path.join(config.capture_dir, 'sip.pcapng')))
+        self.assertTrue(self.grepOutput('Notes'))
+        self.assertTrue(self.grepOutput('Comments'))
+
+    def test_tshark_z_expert_invalid_filter(self):
+        invalid_filter = '__invalid_protocol'
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,' + invalid_filter,
+            '-r', os.path.join(config.capture_dir, 'http-ooo.pcap')),
+            expected_return=self.exit_command_line)
+        self.assertTrue(self.grepOutput('Filter "' + invalid_filter + '" is invalid'))
+
+    def test_tshark_z_expert_error_invalid_filter(self):
+        invalid_filter = '__invalid_protocol'
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,error,' + invalid_filter,
+            '-r', os.path.join(config.capture_dir, 'http-ooo.pcap')),
+            expected_return=self.exit_command_line)
+        self.assertTrue(self.grepOutput('Filter "' + invalid_filter + '" is invalid'))
+
+    def test_tshark_z_expert_filter(self):
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,udp', #udp is a filter
+            '-r', os.path.join(config.capture_dir, 'http-ooo.pcap')))
+        self.assertFalse(self.grepOutput('Errors'))
+        self.assertFalse(self.grepOutput('Warns'))
+        self.assertFalse(self.grepOutput('Chats'))
+
+    def test_tshark_z_expert_error_filter(self):
+        self.assertRun((config.cmd_tshark, '-q', '-z', 'expert,error,udp', #udp is a filter
+            '-r', os.path.join(config.capture_dir, 'http-ooo.pcap')))
+        self.assertFalse(self.grepOutput('Errors'))
+        self.assertFalse(self.grepOutput('Warns'))
+        self.assertFalse(self.grepOutput('Chats'))
 
 # Purposefully fail a test. Used for testing the test framework.
 # class case_fail_on_purpose(subprocesstest.SubprocessTestCase):
index 21622abaa3af0835c0f83d5ba3c2ba60185d7447..3dc33aae2c7900ad76dbcd5c8d82d79ec60dec8b 100644 (file)
@@ -24,7 +24,8 @@ void register_tap_listener_expert_info(void);
 
 /* Tap data */
 typedef enum severity_level_t {
-    chat_level = 0,
+    comment_level = 0,
+    chat_level,
     note_level,
     warn_level,
     error_level,
@@ -33,7 +34,7 @@ typedef enum severity_level_t {
 
 /* This variable stores the lowest level that will be displayed.
    May be changed from the command line */
-static severity_level_t lowest_report_level = chat_level;
+static severity_level_t lowest_report_level = comment_level;
 
 typedef struct expert_entry
 {
@@ -81,6 +82,9 @@ expert_stat_packet(void *tapdata, packet_info *pinfo _U_, epan_dissect_t *edt _U
     guint                n;
 
     switch (ei->severity) {
+        case PI_COMMENT:
+            severity_level = comment_level;
+            break;
         case PI_CHAT:
             severity_level = chat_level;
             break;
@@ -176,6 +180,7 @@ expert_stat_draw(void *phs _U_)
     draw_items_for_severity(hs->ei_array[warn_level],  "Warns");
     draw_items_for_severity(hs->ei_array[note_level],  "Notes");
     draw_items_for_severity(hs->ei_array[chat_level],  "Chats");
+    draw_items_for_severity(hs->ei_array[comment_level],  "Comments");
 }
 
 static void
@@ -222,6 +227,9 @@ static void expert_stat_init(const char *opt_arg, void *userdata _U_)
         } else if (g_ascii_strncasecmp(args, ",chat", 5) == 0) {
             lowest_report_level = chat_level;
             args += 5;
+        } else if (g_ascii_strncasecmp(args, ",comment", 8) == 0) {
+            lowest_report_level = comment_level;
+            args += 8;
         }
     }