aboutsummaryrefslogtreecommitdiff
path: root/tools/binman/entry_test.py
blob: ac6582cf86a80144780350ff72877f5efa283ce9 (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# SPDX-License-Identifier: GPL-2.0+
# Copyright (c) 2016 Google, Inc
# Written by Simon Glass <sjg@chromium.org>
#
# Test for the Entry class

import collections
import importlib
import os
import sys
import unittest

from binman import entry
from binman.etype.blob import Entry_blob
from dtoc import fdt
from dtoc import fdt_util
from u_boot_pylib import tools

class TestEntry(unittest.TestCase):
    def setUp(self):
        tools.prepare_output_dir(None)

    def tearDown(self):
        tools.finalise_output_dir()

    def GetNode(self):
        binman_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
        fname = fdt_util.EnsureCompiled(
            os.path.join(binman_dir,('test/005_simple.dts')))
        dtb = fdt.FdtScan(fname)
        return dtb.GetNode('/binman/u-boot')

    def _ReloadEntry(self):
        global entry
        if entry:
            importlib.reload(entry)
        else:
            from binman import entry

    def testEntryContents(self):
        """Test the Entry bass class"""
        from binman import entry
        base_entry = entry.Entry(None, None, None)
        self.assertEqual(True, base_entry.ObtainContents())

    def testUnknownEntry(self):
        """Test that unknown entry types are detected"""
        Node = collections.namedtuple('Node', ['name', 'path'])
        node = Node('invalid-name', 'invalid-path')
        with self.assertRaises(ValueError) as e:
            entry.Entry.Create(None, node, node.name)
        self.assertIn("Unknown entry type 'invalid-name' in node "
                      "'invalid-path'", str(e.exception))

    def testUniqueName(self):
        """Test Entry.GetUniqueName"""
        Node = collections.namedtuple('Node', ['name', 'parent'])
        base_node = Node('root', None)
        base_entry = entry.Entry(None, None, base_node)
        self.assertEqual('root', base_entry.GetUniqueName())
        sub_node = Node('subnode', base_node)
        sub_entry = entry.Entry(None, None, sub_node)
        self.assertEqual('root.subnode', sub_entry.GetUniqueName())

    def testGetDefaultFilename(self):
        """Trivial test for this base class function"""
        base_entry = entry.Entry(None, None, None)
        self.assertIsNone(base_entry.GetDefaultFilename())

    def testBlobFdt(self):
        """Test the GetFdtEtype() method of the blob-dtb entries"""
        base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
        self.assertIsNone(base.GetFdtEtype())

        dtb = entry.Entry.Create(None, self.GetNode(), 'u-boot-dtb')
        self.assertEqual('u-boot-dtb', dtb.GetFdtEtype())

    def testWriteChildData(self):
        """Test the WriteChildData() method of the base class"""
        base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
        self.assertTrue(base.WriteChildData(base))

    def testReadChildData(self):
        """Test the ReadChildData() method of the base class"""
        base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
        self.assertIsNone(base.ReadChildData(base))

    def testExpandedEntry(self):
        """Test use of an expanded entry when available"""
        base = entry.Entry.Create(None, self.GetNode())
        self.assertEqual('u-boot', base.etype)

        expanded = entry.Entry.Create(None, self.GetNode(), expanded=True)
        self.assertEqual('u-boot-expanded', expanded.etype)

        with self.assertRaises(ValueError) as e:
            entry.Entry.Create(None, self.GetNode(), 'missing', expanded=True)
        self.assertIn("Unknown entry type 'missing' in node '/binman/u-boot'",
                      str(e.exception))

    def testMissingEtype(self):
        """Test use of a blob etype when the requested one is not available"""
        ent = entry.Entry.Create(None, self.GetNode(), 'missing',
                                 missing_etype=True)
        self.assertTrue(isinstance(ent, Entry_blob))
        self.assertEquals('missing', ent.etype)

    def testDecompressData(self):
        """Test the DecompressData() method of the base class"""
        base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
        base.compress = 'lz4'
        bintools = {}
        base.comp_bintool = base.AddBintool(bintools, '_testing')
        self.assertEquals(tools.get_bytes(0, 1024), base.CompressData(b'abc'))
        self.assertEquals(tools.get_bytes(0, 1024), base.DecompressData(b'abc'))

    def testLookupOffset(self):
        """Test the lookup_offset() method of the base class"""
        def MyFindEntryByNode(node):
            return self.found

        base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
        base.FindEntryByNode = MyFindEntryByNode
        base.section = base
        self.found = None
        base.offset_from_elf = [self.GetNode(), 'start', 0]
        with self.assertRaises(ValueError) as e:
            base.lookup_offset()
        self.assertIn("Cannot find entry for node 'u-boot'", str(e.exception))

        self.found = base
        with self.assertRaises(ValueError) as e:
            base.lookup_offset()
        self.assertIn("Need elf-fname property 'u-boot'", str(e.exception))


if __name__ == "__main__":
    unittest.main()