Esempio n. 1
0
class ElementCountTests(CalculatedTestCase):

    __meta__ = False

    def setUp(self, cls=ElementCount):
        super(ElementCountTests, self).setUp(cls)
        self.length = 32
        self.bit_field = BitField(value=0, length=self.length)

    def get_default_field(self, fuzzable=False, correction=None):
        return self.cls(self.depends_on_name,
                        correction=correction,
                        length=self.length,
                        fuzzable=fuzzable,
                        name=self.uut_name)

    def calculate(self, field):
        self.bit_field.set_current_value(len(field.get_rendered_fields()))
        return self.bit_field.render()

    def testContainerWithInternalContainer(self):
        container = Container(name=self.depends_on_name,
                              fields=[
                                  String('abc'),
                                  String('def'),
                                  Container(name='counts_as_one',
                                            fields=[
                                                String('ghi'),
                                                String('jkl'),
                                            ])
                              ])
        uut = self.get_default_field()
        full = Container([container, uut])
        full.render()
        self.assertEqual(uut.render(), self.calculate(container))
        del full

    def testInternalContainer(self):
        internal_container = Container(name=self.depends_on_name,
                                       fields=[
                                           String('ghi', name='field3'),
                                           String('jkl', name='field4'),
                                       ])
        container = Container(name='this_doesnt_count',
                              fields=[
                                  String('abc', name='field1'),
                                  String('def', name='field2'),
                                  internal_container
                              ])
        uut = self.get_default_field()
        full = Container([container, uut])
        full.render()
        self.assertEqual(uut.render(), self.calculate(internal_container))
        del full

    def testInvalidCorrectionStr(self):
        with self.assertRaises(KittyException):
            self.get_default_field(correction='boom')
class SizeTests(CalculatedTestCase):
    __meta__ = False

    def setUp(self, cls=Size, length=32):
        super(SizeTests, self).setUp(cls)
        self.bit_field = BitField(value=0, length=length)
        self.length = length

    def get_default_field(self, length=None, calc_func=None, fuzzable=False):
        if length is None:
            length = self.length
        if calc_func is None:
            return self.cls(self.depends_on_name, length=length, fuzzable=fuzzable)
        else:
            return self.cls(self.depends_on_name, length=length, calc_func=calc_func, fuzzable=fuzzable)

    def calculate(self, value, calc_func=None):
        if calc_func:
            val = calc_func(value)
        else:
            val = len(value.bytes)
        self.bit_field.set_current_value(val)
        return self.bit_field.render()

    def test_custom_func_valid(self):
        func = lambda x: len(x)
        original_field = self.get_original_field()
        calculated_field = self.get_default_field(calc_func=func)
        container = Container([original_field, calculated_field])
        original_rendered = original_field.render()
        expected = self.calculate(original_rendered, calc_func=func)
        actual = calculated_field.render()
        self.assertEqual(expected, actual)
        while container.mutate():
            original_rendered = original_field.render()
            expected = self.calculate(original_rendered, calc_func=func)
            actual = calculated_field.render()
            self.assertEqual(expected, actual)

    def test_custom_func_invalid_arguments(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=8, calc_func=lambda x, y: 1)

    def test_custom_func_invalid_return_type_str(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=8, calc_func=lambda x: "")

    def test_custom_func_invalid_return_type_bits(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=8, calc_func=lambda x: Bits())

    def test_invalid_length_0(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=0)

    def test_invalid_length_negative(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=-3)
class ElementCountTests(CalculatedTestCase):

    __meta__ = False

    def setUp(self, cls=ElementCount):
        super(ElementCountTests, self).setUp(cls)
        self.length = 32
        self.bit_field = BitField(value=0, length=self.length)

    def get_default_field(self, fuzzable=False, correction=None):
        return self.cls(self.depends_on_name, correction=correction, length=self.length, fuzzable=fuzzable, name=self.uut_name)

    def calculate(self, field):
        self.bit_field.set_current_value(len(field.get_rendered_fields()))
        return self.bit_field.render()

    def testContainerWithInternalContainer(self):
        container = Container(
            name=self.depends_on_name,
            fields=[
                String('abc'),
                String('def'),
                Container(
                    name='counts_as_one',
                    fields=[
                        String('ghi'),
                        String('jkl'),
                    ])
            ])
        uut = self.get_default_field()
        full = Container([container, uut])
        full.render()
        self.assertEqual(uut.render(), self.calculate(container))
        del full

    def testInternalContainer(self):
        internal_container = Container(
            name=self.depends_on_name,
            fields=[
                String('ghi', name='field3'),
                String('jkl', name='field4'),
            ])
        container = Container(
            name='this_doesnt_count',
            fields=[
                String('abc', name='field1'),
                String('def', name='field2'),
                internal_container
            ])
        uut = self.get_default_field()
        full = Container([container, uut])
        full.render()
        self.assertEqual(uut.render(), self.calculate(internal_container))
        del full

    def testInvalidCorrectionStr(self):
        with self.assertRaises(KittyException):
            self.get_default_field(correction='boom')
class SizeTests(CalculatedTestCase):
    __meta__ = False

    def setUp(self, cls=Size, length=32):
        super(SizeTests, self).setUp(cls)
        self.bit_field = BitField(value=0, length=length)
        self.length = length

    def get_default_field(self, length=None, calc_func=None, fuzzable=False):
        if length is None:
            length = self.length
        if calc_func is None:
            return self.cls(self.depends_on_name, length=length, fuzzable=fuzzable, name='uut')
        else:
            return self.cls(self.depends_on_name, length=length, calc_func=calc_func, fuzzable=fuzzable, name='uut')

    def calculate(self, field, calc_func=None):
        value = field.render()
        if calc_func:
            val = calc_func(value)
        else:
            val = len(value.bytes)
        self.bit_field.set_current_value(val)
        return self.bit_field.render()

    def testCustomFuncValid(self):
        def func(x):
            return len(x)
        original_field = self.get_original_field()
        calculated_field = self.get_default_field(calc_func=func)
        container = Container([original_field, calculated_field])
        expected = self.calculate(original_field, calc_func=func)
        actual = calculated_field.render()
        self.assertEqual(expected, actual)
        while container.mutate():
            expected = self.calculate(original_field, calc_func=func)
            actual = calculated_field.render()
            self.assertEqual(expected, actual)

    def testInvalidLength0(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=0)

    def testInvalidLengthNegative(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=-3)

    def testSizeInclusiveAlone(self):
        self.length = 32
        container = Container(
            name=self.depends_on_name,
            fields=[
                self.get_default_field()
            ])
        rendered = container.render()
        self.assertEqual(len(rendered), self.length)
        self.assertEquals(unpack('>I', rendered.tobytes())[0], self.length / 8)
class SizeTests(CalculatedTestCase):
    __meta__ = False

    def setUp(self, cls=Size, length=32):
        super(SizeTests, self).setUp(cls)
        self.bit_field = BitField(value=0, length=length)
        self.length = length

    def get_default_field(self, length=None, calc_func=None, fuzzable=False):
        if length is None:
            length = self.length
        if calc_func is None:
            return self.cls(self.depends_on_name, length=length, fuzzable=fuzzable, name=self.uut_name)
        else:
            return self.cls(self.depends_on_name, length=length, calc_func=calc_func, fuzzable=fuzzable, name=self.uut_name)

    def calculate(self, field, calc_func=None):
        value = field.render()
        if calc_func:
            val = calc_func(value)
        else:
            val = len(value.bytes)
        self.bit_field.set_current_value(val)
        return self.bit_field.render()

    def testCustomFuncValid(self):
        def func(x):
            return len(x)
        original_field = self.get_original_field()
        calculated_field = self.get_default_field(calc_func=func)
        container = Container([original_field, calculated_field])
        expected = self.calculate(original_field, calc_func=func)
        actual = calculated_field.render()
        self.assertEqual(expected, actual)
        while container.mutate():
            expected = self.calculate(original_field, calc_func=func)
            actual = calculated_field.render()
            self.assertEqual(expected, actual)

    def testInvalidLength0(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=0)

    def testInvalidLengthNegative(self):
        with self.assertRaises(KittyException):
            self.cls(self.depends_on_name, length=-3)

    def testSizeInclusiveAlone(self):
        self.length = 32
        container = Container(
            name=self.depends_on_name,
            fields=[
                self.get_default_field()
            ])
        rendered = container.render()
        self.assertEqual(len(rendered), self.length)
        self.assertEquals(unpack('>I', rendered.tobytes())[0], self.length / 8)
class SizeInBytesTest(CalculatedTestCase):
    __meta__ = False

    def setUp(self, cls=SizeInBytes, length=32):
        super(SizeInBytesTest, self).setUp(cls)
        self.bit_field = BitField(value=0, length=length)
        self.length = length

    def get_default_field(self, fuzzable=False):
        return self.cls(self.depends_on_name, length=self.length, fuzzable=fuzzable)

    def calculate(self, value):
        self.bit_field.set_current_value(len(value.bytes))
        return self.bit_field.render()
class SizeInBytesTest(CalculatedTestCase):
    __meta__ = False

    def setUp(self, cls=SizeInBytes, length=32):
        super(SizeInBytesTest, self).setUp(cls)
        self.bit_field = BitField(value=0, length=length)
        self.length = length

    def get_default_field(self, fuzzable=False):
        return self.cls(self.depends_on_name, length=self.length, fuzzable=fuzzable, name=self.uut_name)

    def calculate(self, field):
        value = field.render()
        self.bit_field.set_current_value(len(value.bytes))
        return self.bit_field.render()
class IndexOfTestCase(CalculatedTestCase):

    __meta__ = False

    def setUp(self, cls=IndexOf):
        super(IndexOfTestCase, self).setUp(cls)
        self.length = 32
        self.bit_field = BitField(value=0, length=self.length)

    def get_default_field(self, fuzzable=False):
        return self.cls(self.depends_on_name, length=self.length, fuzzable=fuzzable, name='uut')

    def calculate(self, field):
        rendered = field._enclosing.get_rendered_fields()
        if field in rendered:
            value = rendered.index(field)
        else:
            value = len(rendered)
        self.bit_field.set_current_value(value)
        return self.bit_field.render()

    def _testCorrectIndex(self, expected_index):
        field_list = [String('%d' % i) for i in range(20)]
        field_list[expected_index] = self.get_original_field()
        uut = self.get_default_field()
        t = Container(name='level1', fields=[uut, Container(name='level2', fields=field_list)])
        rendered = uut.render().tobytes()
        result = unpack('>I', rendered)[0]
        self.assertEqual(result, expected_index)
        del t

    def testCorrectIndexFirst(self):
        self._testCorrectIndex(0)

    def testCorrectIndexMiddle(self):
        self._testCorrectIndex(10)

    def testCorrectIndexLast(self):
        self._testCorrectIndex(19)

    def testFieldNotRenderedAlone(self):
        expected_index = 0
        uut = self.get_default_field()
        the_field = Static(name=self.depends_on_name, value='')
        t = Container(name='level1', fields=[uut, Container(name='level2', fields=the_field)])
        rendered = uut.render().tobytes()
        result = unpack('>I', rendered)[0]
        self.assertEqual(result, expected_index)
        del t

    def testFieldNotRenderedWithOtherFields(self):
        expected_index = 3
        uut = self.get_default_field()
        fields = [
            Static(name=self.depends_on_name, value=''),
            Static('field1'),
            Static('field2'),
            Static('field3'),
        ]
        t = Container(name='level1', fields=[uut, Container(name='level2', fields=fields)])
        rendered = uut.render().tobytes()
        result = unpack('>I', rendered)[0]
        self.assertEqual(result, expected_index)
        del t
class IndexOfTestCase(CalculatedTestCase):

    __meta__ = False

    def setUp(self, cls=IndexOf):
        super(IndexOfTestCase, self).setUp(cls)
        self.length = 32
        self.bit_field = BitField(value=0, length=self.length)

    def get_default_field(self, fuzzable=False):
        return self.cls(self.depends_on_name, length=self.length, fuzzable=fuzzable, name=self.uut_name)

    def calculate(self, field):
        rendered = field._enclosing.get_rendered_fields()
        if field in rendered:
            value = rendered.index(field)
        else:
            value = len(rendered)
        self.bit_field.set_current_value(value)
        return self.bit_field.render()

    def _testCorrectIndex(self, expected_index):
        field_list = [String('%d' % i) for i in range(20)]
        field_list[expected_index] = self.get_original_field()
        uut = self.get_default_field()
        t = Container(name='level1', fields=[uut, Container(name='level2', fields=field_list)])
        rendered = uut.render().tobytes()
        result = unpack('>I', rendered)[0]
        self.assertEqual(result, expected_index)
        del t

    def testCorrectIndexFirst(self):
        self._testCorrectIndex(0)

    def testCorrectIndexMiddle(self):
        self._testCorrectIndex(10)

    def testCorrectIndexLast(self):
        self._testCorrectIndex(19)

    def testFieldNotRenderedAlone(self):
        expected_index = 0
        uut = self.get_default_field()
        the_field = Static(name=self.depends_on_name, value='')
        t = Container(name='level1', fields=[uut, Container(name='level2', fields=the_field)])
        rendered = uut.render().tobytes()
        result = unpack('>I', rendered)[0]
        self.assertEqual(result, expected_index)
        del t

    def testFieldNotRenderedWithOtherFields(self):
        expected_index = 3
        uut = self.get_default_field()
        fields = [
            Static(name=self.depends_on_name, value=''),
            Static('field1'),
            Static('field2'),
            Static('field3'),
        ]
        t = Container(name='level1', fields=[uut, Container(name='level2', fields=fields)])
        rendered = uut.render().tobytes()
        result = unpack('>I', rendered)[0]
        self.assertEqual(result, expected_index)
        del t