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