#!/usr/bin/env python3
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit test for fmap module."""

import struct
import unittest

import fmap


# Expected decoded fmap structure from bin/example.bin
_EXAMPLE_BIN_FMAP = {
    "ver_major": 1,
    "ver_minor": 0,
    "name": "example",
    "nareas": 4,
    "base": 0,
    "signature": "__FMAP__",
    "areas": [
        {
            "FLAGS": ("FMAP_AREA_STATIC",),
            "size": 128,
            "flags": 1,
            "name": "bootblock",
            "offset": 0,
        },
        {
            "FLAGS": ("FMAP_AREA_COMPRESSED", "FMAP_AREA_STATIC"),
            "size": 128,
            "flags": 3,
            "name": "normal",
            "offset": 128,
        },
        {
            "FLAGS": ("FMAP_AREA_COMPRESSED", "FMAP_AREA_STATIC"),
            "size": 256,
            "flags": 3,
            "name": "fallback",
            "offset": 256,
        },
        {"FLAGS": (), "size": 512, "flags": 0, "name": "data", "offset": 512},
    ],
    "size": 1024,
}


class FmapTest(unittest.TestCase):
    """Unit test for fmap module."""

    # All failures to diff the entire struct.
    maxDiff = None

    def setUp(self):
        with open("bin/example.bin", "rb") as f:
            self.example_blob = f.read()

    def testDecode(self):
        decoded = fmap.fmap_decode(self.example_blob)
        self.assertEqual(_EXAMPLE_BIN_FMAP, decoded)

    def testDecodeWithOffset(self):
        decoded = fmap.fmap_decode(self.example_blob, 512)
        self.assertEqual(_EXAMPLE_BIN_FMAP, decoded)

    def testDecodeWithName(self):
        decoded = fmap.fmap_decode(self.example_blob, fmap_name="example")
        self.assertEqual(_EXAMPLE_BIN_FMAP, decoded)
        decoded = fmap.fmap_decode(self.example_blob, 512, "example")
        self.assertEqual(_EXAMPLE_BIN_FMAP, decoded)

    def testDecodeWithWrongName(self):
        with self.assertRaises(struct.error):
            fmap.fmap_decode(self.example_blob, fmap_name="banana")
        with self.assertRaises(struct.error):
            fmap.fmap_decode(self.example_blob, 512, "banana")

    def testDecodeWithWrongOffset(self):
        with self.assertRaises(struct.error):
            fmap.fmap_decode(self.example_blob, 42)

    def testEncode(self):
        encoded = fmap.fmap_encode(_EXAMPLE_BIN_FMAP)
        # example.bin contains other binary data besides the fmap
        self.assertIn(encoded, self.example_blob)


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