#!/usr/bin/env python3
# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Tests for snapshot metadata processing."""

import base64
import unittest
import pw_tokenizer
from pw_snapshot_metadata.metadata import MetadataProcessor, process_snapshot
from pw_snapshot_protos import snapshot_pb2
from pw_tokenizer import tokens


class MetadataProcessorTest(unittest.TestCase):
    """Tests that the metadata processor produces expected results."""
    def setUp(self):
        super().setUp()
        self.detok = pw_tokenizer.Detokenizer(
            tokens.Database([
                tokens.TokenizedStringEntry(0x3A9BC4C3,
                                            'Assert failed: 1+1 == 42'),
                tokens.TokenizedStringEntry(0x01170923, 'gShoe'),
            ]))

        snapshot = snapshot_pb2.Snapshot()
        snapshot.metadata.reason = b'\xc3\xc4\x9b\x3a'
        snapshot.metadata.project_name = b'$' + base64.b64encode(
            b'\x23\x09\x17\x01')
        snapshot.metadata.device_name = b'hyper-fast-gshoe'
        snapshot.metadata.software_version = 'gShoe-debug-1.2.1-6f23412b+'
        snapshot.metadata.snapshot_uuid = b'\x00\x00\x00\x01'

        self.snapshot = snapshot

    def test_reason_tokenized(self):
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        self.assertEqual(meta.reason(), 'Assert failed: 1+1 == 42')

    def test_project_name_tokenized(self):
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        self.assertEqual(meta.project_name(), 'gShoe')

    def test_device_name_not_tokenized(self):
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        self.assertEqual(meta.device_name(), 'hyper-fast-gshoe')

    def test_default_non_fatal(self):
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        self.assertFalse(meta.is_fatal())

    def test_fw_version(self):
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        self.assertEqual(meta.device_fw_version(),
                         'gShoe-debug-1.2.1-6f23412b+')

    def test_snapshot_uuid(self):
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        self.assertEqual(meta.snapshot_uuid(), '00000001')

    def test_fw_uuid_default(self):
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        self.assertEqual(meta.fw_build_uuid(), '')

    def test_as_str(self):
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        expected = '\n'.join((
            'Snapshot capture reason:',
            '    Assert failed: 1+1 == 42',
            '',
            'Project name:      gShoe',
            'Device:            hyper-fast-gshoe',
            'Device FW version: gShoe-debug-1.2.1-6f23412b+',
            'Snapshot UUID:     00000001',
        ))
        self.assertEqual(expected, str(meta))

    def test_as_str_fatal(self):
        self.snapshot.metadata.fatal = True
        meta = MetadataProcessor(self.snapshot.metadata, self.detok)
        expected = '\n'.join((
            '                            ▪▄▄▄ ▄▄▄· ▄▄▄▄▄ ▄▄▄· ▄ ·',
            '                            █▄▄▄▐█ ▀█ • █▌ ▐█ ▀█ █',
            '                            █ ▪ ▄█▀▀█   █. ▄█▀▀█ █',
            '                            ▐▌ .▐█ ▪▐▌ ▪▐▌·▐█ ▪▐▌▐▌',
            '                            ▀    ▀  ▀ ·  ▀  ▀  ▀ .▀▀',
            '',
            'Device crash cause:',
            '    Assert failed: 1+1 == 42',
            '',
            'Project name:      gShoe',
            'Device:            hyper-fast-gshoe',
            'Device FW version: gShoe-debug-1.2.1-6f23412b+',
            'Snapshot UUID:     00000001',
        ))
        self.assertEqual(expected, str(meta))

    def test_no_reason(self):
        snapshot = snapshot_pb2.Snapshot()
        snapshot.metadata.fatal = True
        meta = MetadataProcessor(snapshot.metadata, self.detok)
        meta.set_pretty_format_width(40)
        expected = '\n'.join((
            '        ▪▄▄▄ ▄▄▄· ▄▄▄▄▄ ▄▄▄· ▄ ·',
            '        █▄▄▄▐█ ▀█ • █▌ ▐█ ▀█ █',
            '        █ ▪ ▄█▀▀█   █. ▄█▀▀█ █',
            '        ▐▌ .▐█ ▪▐▌ ▪▐▌·▐█ ▪▐▌▐▌',
            '        ▀    ▀  ▀ ·  ▀  ▀  ▀ .▀▀',
            '',
            'Device crash cause:',
            '    UNKNOWN (field missing)',
            '',
        ))
        self.assertEqual(expected, str(meta))

    def test_serialized_snapshot(self):
        self.snapshot.tags['type'] = 'obviously a crash'
        expected = '\n'.join((
            'Snapshot capture reason:',
            '    Assert failed: 1+1 == 42',
            '',
            'Project name:      gShoe',
            'Device:            hyper-fast-gshoe',
            'Device FW version: gShoe-debug-1.2.1-6f23412b+',
            'Snapshot UUID:     00000001',
            '',
            'Tags:',
            '  type: obviously a crash',
            '',
        ))
        self.assertEqual(
            expected,
            process_snapshot(self.snapshot.SerializeToString(), self.detok))


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