summaryrefslogtreecommitdiff
path: root/gadu/lqsoft/cstruct/test/test_complex.py
blob: bbb87769352a235c38df57095ea177eb321c0a56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/env python
# -*- coding: utf-8

import unittest
import struct

from lqsoft.cstruct.common import CStruct
from lqsoft.cstruct.fields.complex import *
from lqsoft.cstruct.fields.numeric import IntField, UIntField
from lqsoft.cstruct.fields.text import NullStringField
from lqsoft.cstruct.constraints import *

__author__="lreqc"
__date__ ="$2009-07-21 00:43:44$"

class ArrayFieldTest(unittest.TestCase):

    def setUp(self):
        self.svalue = [1,1,2,3,5,8]
        self.slen = len(self.svalue)
        self.sdata = struct.pack("<"+str(self.slen)+"i", *self.svalue)
        # self.sdata_ext = struct.pack("<I", self.slen) + self.sdata

    def testArrayPack(self):
        class TestStruct(CStruct):
            array = ArrayField(0, length = self.slen, subfield=IntField(0))

        s = TestStruct(array=self.svalue)
        try:
            s.array[1] = 'ala ma kota' # this should fail
            self.fail('Integer array accepted a string')
        except ValueError:
            pass

        self.assertEqual( s.array , self.svalue)
        self.assertEqual( s.pack(), self.sdata)

    def testArrayUnpack(self):
        class TestStruct(CStruct):
            array = ArrayField(0, length = self.slen, subfield=IntField(0))

        s, offset = TestStruct.unpack(self.sdata)

        self.assertEqual(s.array, self.svalue)
        for i in xrange(0, self.slen):
            self.assertEqual( s.array[i], self.svalue[i])

class StructFieldTest(unittest.TestCase):
    
    def setUp(self):
        class InnerStruct(CStruct):
            one = IntField(0, default=13)
            two = IntField(1, default=42)

        class OuterStruct(CStruct):
            pad = NullStringField(0, default='KOT\0')
            inner = StructField(1, struct=InnerStruct)
            post = UIntField(2, default=0xbebafeca)

        self.OuterStruct = OuterStruct
        self.InnerStruct = InnerStruct

        self.inner = InnerStruct()
        self.inner_data = self.inner.pack()

    def testAccess(self):        
        s = self.OuterStruct(inner=self.inner)
        self.assertEqual(s.pad, 'KOT\0')
        self.assertEqual(s.post, 0xbebafeca)
        self.assertEqual(s.inner, self.inner)

    def testPack(self):
        s = self.OuterStruct(inner=self.inner)
        data = s.pack()
        print repr(data)
        self.assertEqual( data[4:-4], self.inner_data )

    def testGaduMsgOut(self):
        from lqsoft.pygadu.network import *
        import time

        html_text = """<span style="color:#000000; font-family:'MS Shell Dlg 2'; font-size:12pt; ">ala</span>"""
        rcpt = 1849224
        klass = MessageOutPacket
        attrs = StructMsgAttrs()
        attrs.richtext = StructRichText()

        payload = StructMessage(klass=StructMessage.CLASS.CHAT, \
            html_message=html_text, plain_message='ala\0', \
            attrs = attrs)

        packet = klass( recipient=rcpt, seq=int(time.time()), content=payload)
        data = packet.as_packet()
        print
        for (i, b) in enumerate(data):           
            print '%02x' % ord(b),
            if (i+1)%8 == 0: print

        print packet.content.offset_plain
        print repr(data[8+packet.content.offset_plain:])
        print packet.content.offset_attrs

if __name__ == '__main__':
    import lqsoft.cstruct.test.test_complex
    
    suite = unittest.TestLoader().loadTestsFromName('StructFieldTest.testGaduMsgOut', lqsoft.cstruct.test.test_complex)
    unittest.TextTestRunner(verbosity=2).run(suite)