1# Copyright (C) 2011  Jeff Forcier <jeff@bitprophet.org>
2#
3# This file is part of ssh.
4#
5# 'ssh' is free software; you can redistribute it and/or modify it under the
6# terms of the GNU Lesser General Public License as published by the Free
7# Software Foundation; either version 2.1 of the License, or (at your option)
8# any later version.
9#
10# 'ssh' is distrubuted in the hope that it will be useful, but WITHOUT ANY
11# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12# A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
13# details.
14#
15# You should have received a copy of the GNU Lesser General Public License
16# along with 'ssh'; if not, write to the Free Software Foundation, Inc.,
17# 51 Franklin Street, Suite 500, Boston, MA  02110-1335  USA.
18
19"""
20Some unit tests for ssh protocol message blocks.
21"""
22
23import unittest
24from ssh.message import Message
25
26
27class MessageTest (unittest.TestCase):
28
29    __a = '\x00\x00\x00\x17\x07\x60\xe0\x90\x00\x00\x00\x01q\x00\x00\x00\x05hello\x00\x00\x03\xe8' + ('x' * 1000)
30    __b = '\x01\x00\xf3\x00\x3f\x00\x00\x00\x10huey,dewey,louie'
31    __c = '\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\xf5\xe4\xd3\xc2\xb1\x09\x00\x00\x00\x01\x11\x00\x00\x00\x07\x00\xf5\xe4\xd3\xc2\xb1\x09\x00\x00\x00\x06\x9a\x1b\x2c\x3d\x4e\xf7'
32    __d = '\x00\x00\x00\x05\x00\x00\x00\x05\x11\x22\x33\x44\x55\x01\x00\x00\x00\x03cat\x00\x00\x00\x03a,b'
33
34    def test_1_encode(self):
35        msg = Message()
36        msg.add_int(23)
37        msg.add_int(123789456)
38        msg.add_string('q')
39        msg.add_string('hello')
40        msg.add_string('x' * 1000)
41        self.assertEquals(str(msg), self.__a)
42
43        msg = Message()
44        msg.add_boolean(True)
45        msg.add_boolean(False)
46        msg.add_byte('\xf3')
47        msg.add_bytes('\x00\x3f')
48        msg.add_list(['huey', 'dewey', 'louie'])
49        self.assertEquals(str(msg), self.__b)
50
51        msg = Message()
52        msg.add_int64(5)
53        msg.add_int64(0xf5e4d3c2b109L)
54        msg.add_mpint(17)
55        msg.add_mpint(0xf5e4d3c2b109L)
56        msg.add_mpint(-0x65e4d3c2b109L)
57        self.assertEquals(str(msg), self.__c)
58
59    def test_2_decode(self):
60        msg = Message(self.__a)
61        self.assertEquals(msg.get_int(), 23)
62        self.assertEquals(msg.get_int(), 123789456)
63        self.assertEquals(msg.get_string(), 'q')
64        self.assertEquals(msg.get_string(), 'hello')
65        self.assertEquals(msg.get_string(), 'x' * 1000)
66
67        msg = Message(self.__b)
68        self.assertEquals(msg.get_boolean(), True)
69        self.assertEquals(msg.get_boolean(), False)
70        self.assertEquals(msg.get_byte(), '\xf3')
71        self.assertEquals(msg.get_bytes(2), '\x00\x3f')
72        self.assertEquals(msg.get_list(), ['huey', 'dewey', 'louie'])
73
74        msg = Message(self.__c)
75        self.assertEquals(msg.get_int64(), 5)
76        self.assertEquals(msg.get_int64(), 0xf5e4d3c2b109L)
77        self.assertEquals(msg.get_mpint(), 17)
78        self.assertEquals(msg.get_mpint(), 0xf5e4d3c2b109L)
79        self.assertEquals(msg.get_mpint(), -0x65e4d3c2b109L)
80
81    def test_3_add(self):
82        msg = Message()
83        msg.add(5)
84        msg.add(0x1122334455L)
85        msg.add(True)
86        msg.add('cat')
87        msg.add(['a', 'b'])
88        self.assertEquals(str(msg), self.__d)
89
90    def test_4_misc(self):
91        msg = Message(self.__d)
92        self.assertEquals(msg.get_int(), 5)
93        self.assertEquals(msg.get_mpint(), 0x1122334455L)
94        self.assertEquals(msg.get_so_far(), self.__d[:13])
95        self.assertEquals(msg.get_remainder(), self.__d[13:])
96        msg.rewind()
97        self.assertEquals(msg.get_int(), 5)
98        self.assertEquals(msg.get_so_far(), self.__d[:4])
99        self.assertEquals(msg.get_remainder(), self.__d[4:])
100
101