Blame test/cmdparse.py

Packit b802ec
#!/usr/bin/env python
Packit b802ec
#
Packit b802ec
#   mtr  --  a network diagnostic tool
Packit b802ec
#   Copyright (C) 2016  Matt Kimball
Packit b802ec
#
Packit b802ec
#   This program is free software; you can redistribute it and/or modify
Packit b802ec
#   it under the terms of the GNU General Public License version 2 as
Packit b802ec
#   published by the Free Software Foundation.
Packit b802ec
#
Packit b802ec
#   This program is distributed in the hope that it will be useful,
Packit b802ec
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b802ec
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit b802ec
#   GNU General Public License for more details.
Packit b802ec
#
Packit b802ec
#   You should have received a copy of the GNU General Public License
Packit b802ec
#   along with this program; if not, write to the Free Software
Packit b802ec
#   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Packit b802ec
#
Packit b802ec
Packit b802ec
'''Test mtr-packet's command parsing.'''
Packit b802ec
Packit b802ec
Packit b802ec
import time
Packit b802ec
import unittest
Packit b802ec
Packit b802ec
import mtrpacket
Packit b802ec
Packit b802ec
Packit b802ec
class TestCommandParse(mtrpacket.MtrPacketTest):
Packit b802ec
    '''Test cases with malformed commands and version checks'''
Packit b802ec
Packit b802ec
    def test_unknown_command(self):
Packit b802ec
        'Test sending a command unknown to mtr-packet'
Packit b802ec
Packit b802ec
        self.write_command('13 argle-bargle')
Packit b802ec
        self.assertEqual(self.read_reply(), '13 unknown-command')
Packit b802ec
Packit b802ec
    def test_malformed_command(self):
Packit b802ec
        'Test sending a malformed command request to mtr-packet'
Packit b802ec
Packit b802ec
        self.write_command('malformed')
Packit b802ec
        self.assertEqual(self.read_reply(), '0 command-parse-error')
Packit b802ec
Packit b802ec
    def test_exit_on_stdin_closed(self):
Packit b802ec
        '''Test that the packet process terminates after stdin is closed
Packit b802ec
Packit b802ec
        Test that, when outstanding requests are complete, the process
Packit b802ec
        terminates following stdin being closed.'''
Packit b802ec
Packit b802ec
        self.write_command('15 send-probe ip-4 8.8.254.254 timeout 1')
Packit b802ec
        self.packet_process.stdin.close()
Packit b802ec
        time.sleep(2)
Packit b802ec
        self.read_reply()
Packit b802ec
        exit_code = self.packet_process.poll()
Packit b802ec
        self.assertIsNotNone(exit_code)
Packit b802ec
Packit b802ec
    def test_invalid_argument(self):
Packit b802ec
        'Test sending invalid arguments with probe requests'
Packit b802ec
Packit b802ec
        bad_commands = [
Packit b802ec
            '22 send-probe',
Packit b802ec
            '23 send-probe ip-4 str-value',
Packit b802ec
            '24 send-probe ip-4 8.8.8.8 timeout str-value',
Packit b802ec
            '25 send-probe ip-4 8.8.8.8 ttl str-value',
Packit b802ec
        ]
Packit b802ec
Packit b802ec
        for cmd in bad_commands:
Packit b802ec
            self.write_command(cmd)
Packit b802ec
            reply = self.parse_reply()
Packit b802ec
            self.assertEqual(reply.command_name, 'invalid-argument')
Packit b802ec
Packit b802ec
    def test_versioning(self):
Packit b802ec
        'Test version checks and feature support checks'
Packit b802ec
Packit b802ec
        feature_tests = [
Packit b802ec
            ('31 check-support feature ip-4', 'ok'),
Packit b802ec
            ('32 check-support feature send-probe', 'ok'),
Packit b802ec
            ('33 check-support feature bogus-feature', 'no')
Packit b802ec
        ]
Packit b802ec
Packit b802ec
        self.write_command('30 check-support feature version')
Packit b802ec
        reply = self.parse_reply()
Packit b802ec
        self.assertEqual(reply.token, 30)
Packit b802ec
        self.assertEqual(reply.command_name, 'feature-support')
Packit b802ec
        self.assertIn('support', reply.argument)
Packit b802ec
Packit b802ec
        for (request, expected) in feature_tests:
Packit b802ec
            self.write_command(request)
Packit b802ec
            reply = self.parse_reply()
Packit b802ec
            self.assertEqual(reply.command_name, 'feature-support')
Packit b802ec
            self.assertIn('support', reply.argument)
Packit b802ec
            self.assertEqual(reply.argument['support'], expected)
Packit b802ec
Packit b802ec
    def test_command_overflow(self):
Packit b802ec
        'Test overflowing the incoming command buffer'
Packit b802ec
Packit b802ec
        big_buffer = 'x' * (64 * 1024)
Packit b802ec
        self.write_command(big_buffer)
Packit b802ec
Packit b802ec
        reply = self.read_reply()
Packit b802ec
        self.assertEqual(reply, '0 command-buffer-overflow')
Packit b802ec
Packit b802ec
Packit b802ec
if __name__ == '__main__':
Packit b802ec
    mtrpacket.check_running_as_root()
Packit b802ec
    unittest.main()