xref: /aosp_15_r20/external/pigweed/pw_snapshot/py/metadata_test.py (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*61c4878aSAndroid Build Coastguard Worker# Copyright 2021 The Pigweed Authors
3*61c4878aSAndroid Build Coastguard Worker#
4*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
5*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
6*61c4878aSAndroid Build Coastguard Worker# the License at
7*61c4878aSAndroid Build Coastguard Worker#
8*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
9*61c4878aSAndroid Build Coastguard Worker#
10*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
14*61c4878aSAndroid Build Coastguard Worker# the License.
15*61c4878aSAndroid Build Coastguard Worker"""Tests for snapshot metadata processing."""
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport base64
18*61c4878aSAndroid Build Coastguard Workerimport unittest
19*61c4878aSAndroid Build Coastguard Workerimport pw_tokenizer
20*61c4878aSAndroid Build Coastguard Workerfrom pw_snapshot_metadata.metadata import MetadataProcessor, process_snapshot
21*61c4878aSAndroid Build Coastguard Workerfrom pw_snapshot_protos import snapshot_pb2
22*61c4878aSAndroid Build Coastguard Workerfrom pw_tokenizer import tokens
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Workerclass MetadataProcessorTest(unittest.TestCase):
26*61c4878aSAndroid Build Coastguard Worker    """Tests that the metadata processor produces expected results."""
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Worker    def setUp(self):
29*61c4878aSAndroid Build Coastguard Worker        super().setUp()
30*61c4878aSAndroid Build Coastguard Worker        self.detok = pw_tokenizer.Detokenizer(
31*61c4878aSAndroid Build Coastguard Worker            tokens.Database(
32*61c4878aSAndroid Build Coastguard Worker                [
33*61c4878aSAndroid Build Coastguard Worker                    tokens.TokenizedStringEntry(
34*61c4878aSAndroid Build Coastguard Worker                        0x3A9BC4C3, 'Assert failed: 1+1 == 42'
35*61c4878aSAndroid Build Coastguard Worker                    ),
36*61c4878aSAndroid Build Coastguard Worker                    tokens.TokenizedStringEntry(0x01170923, 'gShoe'),
37*61c4878aSAndroid Build Coastguard Worker                ]
38*61c4878aSAndroid Build Coastguard Worker            )
39*61c4878aSAndroid Build Coastguard Worker        )
40*61c4878aSAndroid Build Coastguard Worker
41*61c4878aSAndroid Build Coastguard Worker        snapshot = snapshot_pb2.Snapshot()
42*61c4878aSAndroid Build Coastguard Worker        snapshot.metadata.reason = b'\xc3\xc4\x9b\x3a'
43*61c4878aSAndroid Build Coastguard Worker        snapshot.metadata.project_name = b'$' + base64.b64encode(
44*61c4878aSAndroid Build Coastguard Worker            b'\x23\x09\x17\x01'
45*61c4878aSAndroid Build Coastguard Worker        )
46*61c4878aSAndroid Build Coastguard Worker        snapshot.metadata.device_name = b'hyper-fast-gshoe'
47*61c4878aSAndroid Build Coastguard Worker        snapshot.metadata.software_version = 'gShoe-debug-1.2.1-6f23412b+'
48*61c4878aSAndroid Build Coastguard Worker        snapshot.metadata.snapshot_uuid = b'\x00\x00\x00\x01'
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker        self.snapshot = snapshot
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker    def test_reason_tokenized(self):
53*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
54*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(meta.reason(), 'Assert failed: 1+1 == 42')
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Worker    def test_reason_log_format(self):
57*61c4878aSAndroid Build Coastguard Worker        self.snapshot.metadata.reason = (
58*61c4878aSAndroid Build Coastguard Worker            '■msg♦Assert failed :(' '■file♦rpc_services/crash.cc'
59*61c4878aSAndroid Build Coastguard Worker        ).encode('utf-8')
60*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
61*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
62*61c4878aSAndroid Build Coastguard Worker            meta.reason(), 'rpc_services/crash.cc: Assert failed :('
63*61c4878aSAndroid Build Coastguard Worker        )
64*61c4878aSAndroid Build Coastguard Worker
65*61c4878aSAndroid Build Coastguard Worker    def test_project_name_tokenized(self):
66*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
67*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(meta.project_name(), 'gShoe')
68*61c4878aSAndroid Build Coastguard Worker
69*61c4878aSAndroid Build Coastguard Worker    def test_device_name_not_tokenized(self):
70*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
71*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(meta.device_name(), 'hyper-fast-gshoe')
72*61c4878aSAndroid Build Coastguard Worker
73*61c4878aSAndroid Build Coastguard Worker    def test_default_non_fatal(self):
74*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
75*61c4878aSAndroid Build Coastguard Worker        self.assertFalse(meta.is_fatal())
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard Worker    def test_fw_version(self):
78*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
79*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
80*61c4878aSAndroid Build Coastguard Worker            meta.device_fw_version(), 'gShoe-debug-1.2.1-6f23412b+'
81*61c4878aSAndroid Build Coastguard Worker        )
82*61c4878aSAndroid Build Coastguard Worker
83*61c4878aSAndroid Build Coastguard Worker    def test_snapshot_uuid(self):
84*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
85*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(meta.snapshot_uuid(), '00000001')
86*61c4878aSAndroid Build Coastguard Worker
87*61c4878aSAndroid Build Coastguard Worker    def test_fw_uuid_default(self):
88*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
89*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(meta.fw_build_uuid(), '')
90*61c4878aSAndroid Build Coastguard Worker
91*61c4878aSAndroid Build Coastguard Worker    def test_as_str(self):
92*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
93*61c4878aSAndroid Build Coastguard Worker        expected = '\n'.join(
94*61c4878aSAndroid Build Coastguard Worker            (
95*61c4878aSAndroid Build Coastguard Worker                'Snapshot capture reason:',
96*61c4878aSAndroid Build Coastguard Worker                '    Assert failed: 1+1 == 42',
97*61c4878aSAndroid Build Coastguard Worker                '',
98*61c4878aSAndroid Build Coastguard Worker                'Reason token:      0x3a9bc4c3',
99*61c4878aSAndroid Build Coastguard Worker                'Project name:      gShoe',
100*61c4878aSAndroid Build Coastguard Worker                'Device:            hyper-fast-gshoe',
101*61c4878aSAndroid Build Coastguard Worker                'Device FW version: gShoe-debug-1.2.1-6f23412b+',
102*61c4878aSAndroid Build Coastguard Worker                'Snapshot UUID:     00000001',
103*61c4878aSAndroid Build Coastguard Worker            )
104*61c4878aSAndroid Build Coastguard Worker        )
105*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(expected, str(meta))
106*61c4878aSAndroid Build Coastguard Worker
107*61c4878aSAndroid Build Coastguard Worker    def test_as_str_fatal(self):
108*61c4878aSAndroid Build Coastguard Worker        self.snapshot.metadata.fatal = True
109*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
110*61c4878aSAndroid Build Coastguard Worker        expected = '\n'.join(
111*61c4878aSAndroid Build Coastguard Worker            (
112*61c4878aSAndroid Build Coastguard Worker                '                            ▪▄▄▄ ▄▄▄· ▄▄▄▄▄ ▄▄▄· ▄ ·',
113*61c4878aSAndroid Build Coastguard Worker                '                            █▄▄▄▐█ ▀█ • █▌ ▐█ ▀█ █',
114*61c4878aSAndroid Build Coastguard Worker                '                            █ ▪ ▄█▀▀█   █. ▄█▀▀█ █',
115*61c4878aSAndroid Build Coastguard Worker                '                            ▐▌ .▐█ ▪▐▌ ▪▐▌·▐█ ▪▐▌▐▌',
116*61c4878aSAndroid Build Coastguard Worker                '                            ▀    ▀  ▀ ·  ▀  ▀  ▀ .▀▀',
117*61c4878aSAndroid Build Coastguard Worker                '',
118*61c4878aSAndroid Build Coastguard Worker                'Device crash cause:',
119*61c4878aSAndroid Build Coastguard Worker                '    Assert failed: 1+1 == 42',
120*61c4878aSAndroid Build Coastguard Worker                '',
121*61c4878aSAndroid Build Coastguard Worker                'Reason token:      0x3a9bc4c3',
122*61c4878aSAndroid Build Coastguard Worker                'Project name:      gShoe',
123*61c4878aSAndroid Build Coastguard Worker                'Device:            hyper-fast-gshoe',
124*61c4878aSAndroid Build Coastguard Worker                'Device FW version: gShoe-debug-1.2.1-6f23412b+',
125*61c4878aSAndroid Build Coastguard Worker                'Snapshot UUID:     00000001',
126*61c4878aSAndroid Build Coastguard Worker            )
127*61c4878aSAndroid Build Coastguard Worker        )
128*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(expected, str(meta))
129*61c4878aSAndroid Build Coastguard Worker
130*61c4878aSAndroid Build Coastguard Worker    def test_no_reason(self):
131*61c4878aSAndroid Build Coastguard Worker        snapshot = snapshot_pb2.Snapshot()
132*61c4878aSAndroid Build Coastguard Worker        snapshot.metadata.fatal = True
133*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(snapshot.metadata, self.detok)
134*61c4878aSAndroid Build Coastguard Worker        meta.set_pretty_format_width(40)
135*61c4878aSAndroid Build Coastguard Worker        expected = '\n'.join(
136*61c4878aSAndroid Build Coastguard Worker            (
137*61c4878aSAndroid Build Coastguard Worker                '        ▪▄▄▄ ▄▄▄· ▄▄▄▄▄ ▄▄▄· ▄ ·',
138*61c4878aSAndroid Build Coastguard Worker                '        █▄▄▄▐█ ▀█ • █▌ ▐█ ▀█ █',
139*61c4878aSAndroid Build Coastguard Worker                '        █ ▪ ▄█▀▀█   █. ▄█▀▀█ █',
140*61c4878aSAndroid Build Coastguard Worker                '        ▐▌ .▐█ ▪▐▌ ▪▐▌·▐█ ▪▐▌▐▌',
141*61c4878aSAndroid Build Coastguard Worker                '        ▀    ▀  ▀ ·  ▀  ▀  ▀ .▀▀',
142*61c4878aSAndroid Build Coastguard Worker                '',
143*61c4878aSAndroid Build Coastguard Worker                'Device crash cause:',
144*61c4878aSAndroid Build Coastguard Worker                '    UNKNOWN (field missing)',
145*61c4878aSAndroid Build Coastguard Worker                '',
146*61c4878aSAndroid Build Coastguard Worker            )
147*61c4878aSAndroid Build Coastguard Worker        )
148*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(expected, str(meta))
149*61c4878aSAndroid Build Coastguard Worker
150*61c4878aSAndroid Build Coastguard Worker    def test_no_token_db(self):
151*61c4878aSAndroid Build Coastguard Worker        meta = MetadataProcessor(self.snapshot.metadata)
152*61c4878aSAndroid Build Coastguard Worker        expected = '\n'.join(
153*61c4878aSAndroid Build Coastguard Worker            (
154*61c4878aSAndroid Build Coastguard Worker                'Snapshot capture reason:',
155*61c4878aSAndroid Build Coastguard Worker                '    $w8SbOg==',
156*61c4878aSAndroid Build Coastguard Worker                '',
157*61c4878aSAndroid Build Coastguard Worker                'Reason token:      0x3a9bc4c3',
158*61c4878aSAndroid Build Coastguard Worker                'Project name:      $IwkXAQ==',
159*61c4878aSAndroid Build Coastguard Worker                'Device:            hyper-fast-gshoe',
160*61c4878aSAndroid Build Coastguard Worker                'Device FW version: gShoe-debug-1.2.1-6f23412b+',
161*61c4878aSAndroid Build Coastguard Worker                'Snapshot UUID:     00000001',
162*61c4878aSAndroid Build Coastguard Worker            )
163*61c4878aSAndroid Build Coastguard Worker        )
164*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(expected, str(meta))
165*61c4878aSAndroid Build Coastguard Worker
166*61c4878aSAndroid Build Coastguard Worker    def test_serialized_snapshot(self):
167*61c4878aSAndroid Build Coastguard Worker        self.snapshot.tags['type'] = 'obviously a crash'
168*61c4878aSAndroid Build Coastguard Worker        expected = '\n'.join(
169*61c4878aSAndroid Build Coastguard Worker            (
170*61c4878aSAndroid Build Coastguard Worker                'Snapshot capture reason:',
171*61c4878aSAndroid Build Coastguard Worker                '    Assert failed: 1+1 == 42',
172*61c4878aSAndroid Build Coastguard Worker                '',
173*61c4878aSAndroid Build Coastguard Worker                'Reason token:      0x3a9bc4c3',
174*61c4878aSAndroid Build Coastguard Worker                'Project name:      gShoe',
175*61c4878aSAndroid Build Coastguard Worker                'Device:            hyper-fast-gshoe',
176*61c4878aSAndroid Build Coastguard Worker                'Device FW version: gShoe-debug-1.2.1-6f23412b+',
177*61c4878aSAndroid Build Coastguard Worker                'Snapshot UUID:     00000001',
178*61c4878aSAndroid Build Coastguard Worker                '',
179*61c4878aSAndroid Build Coastguard Worker                'Tags:',
180*61c4878aSAndroid Build Coastguard Worker                '  type: obviously a crash',
181*61c4878aSAndroid Build Coastguard Worker                '',
182*61c4878aSAndroid Build Coastguard Worker            )
183*61c4878aSAndroid Build Coastguard Worker        )
184*61c4878aSAndroid Build Coastguard Worker        self.assertEqual(
185*61c4878aSAndroid Build Coastguard Worker            expected,
186*61c4878aSAndroid Build Coastguard Worker            process_snapshot(self.snapshot.SerializeToString(), self.detok),
187*61c4878aSAndroid Build Coastguard Worker        )
188*61c4878aSAndroid Build Coastguard Worker
189*61c4878aSAndroid Build Coastguard Worker
190*61c4878aSAndroid Build Coastguard Workerif __name__ == '__main__':
191*61c4878aSAndroid Build Coastguard Worker    unittest.main()
192