BMCTool

Parse RDP bitmap cache data into a single collage image file.

python · Common Scripts

Details

IDBMCTool
Languagepython
From Version6.9.0
Docker Imagedemisto/python3:3.12.13.10404775

README

Parse RDP bitmap cache data into a single collage image file.

Script Data


Name Description
Script Type python3
Cortex XSOAR Version 6.8.0

Inputs


Argument Name Description
EntryID The RDP cache file’s entryID to process.
verbose Should the command produce verbose output.
width Image width.

Outputs


Path Description Type
Collages Collage image of the tiles from the RDP session cache. Unknown
import demistomock as demisto  # noqa: F401
import pytest
from BMCTool import BMCContainer, main
from CommonServerPython import *  # noqa: F401


@pytest.mark.parametrize("container, expected_size", [(BMCContainer.BMC_CONTAINER, 0x14), (BMCContainer.BIN_CONTAINER, 0xC)])
def test_tile_header_size(container, expected_size):
    """
    Given:
        - BMCContainer object
    When:
        - Calling the TILE_HEADER_SIZE property
    Then:
        - Ensure that the TILE_HEADER_SIZE is set as expected
    """
    assert BMCContainer.TILE_HEADER_SIZE[container] == expected_size


def test_bmc_container_with_old_true():
    # Test initialization with count > 0
    old = True
    bmc_container = BMCContainer(old=old)
    # Check that the container is initialized correctly
    assert bmc_container.oldsave is True


def test_bmc_container_with_count():
    # Test initialization with count > 0
    count = 5
    bmc_container = BMCContainer(count=count)
    # Check that the container is initialized correctly
    assert bmc_container.cnt > 0


def test_palette_length():
    assert len(BMCContainer.PALETTE) == 1024


def test_palette_colors():
    """
    Given:
        - BMCContainer object
    When:
        - Calling the PALETTE property
    Then:
        - Ensure that the PALETTE is as expected
    """
    assert (
        bytes(
            bytearray(
                (
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    128,
                    0,
                    0,
                    128,
                    0,
                    0,
                    0,
                    128,
                    128,
                    0,
                    128,
                    0,
                    0,
                    0,
                    128,
                    0,
                    128,
                    0,
                    128,
                    128,
                    0,
                    0,
                    192,
                    192,
                    192,
                    0,
                    192,
                    220,
                    192,
                    0,
                    240,
                    202,
                    166,
                    0,
                    0,
                    32,
                    64,
                    0,
                    0,
                    32,
                    96,
                    0,
                    0,
                    32,
                    128,
                    0,
                    0,
                    32,
                    160,
                    0,
                    0,
                    32,
                    192,
                    0,
                    0,
                    32,
                    224,
                    0,
                    0,
                    64,
                    0,
                    0,
                    0,
                    64,
                    32,
                    0,
                    0,
                    64,
                    64,
                    0,
                    0,
                    64,
                    96,
                    0,
                    0,
                    64,
                    128,
                    0,
                    0,
                    64,
                    160,
                    0,
                    0,
                    64,
                    192,
                    0,
                    0,
                    64,
                    224,
                    0,
                    0,
                    96,
                    0,
                    0,
                    0,
                    96,
                    32,
                    0,
                    0,
                    96,
                    64,
                    0,
                    0,
                    96,
                    96,
                    0,
                    0,
                    96,
                    128,
                    0,
                    0,
                    96,
                    160,
                    0,
                    0,
                    96,
                    192,
                    0,
                    0,
                    96,
                    224,
                    0,
                    0,
                    128,
                    0,
                    0,
                    0,
                    128,
                    32,
                    0,
                    0,
                    128,
                    64,
                    0,
                    0,
                    128,
                    96,
                    0,
                    0,
                    128,
                    128,
                    0,
                    0,
                    128,
                    160,
                    0,
                    0,
                    128,
                    192,
                    0,
                    0,
                    128,
                    224,
                    0,
                    0,
                    160,
                    0,
                    0,
                    0,
                    160,
                    32,
                    0,
                    0,
                    160,
                    64,
                    0,
                    0,
                    160,
                    96,
                    0,
                    0,
                    160,
                    128,
                    0,
                    0,
                    160,
                    160,
                    0,
                    0,
                    160,
                    192,
                    0,
                    0,
                    160,
                    224,
                    0,
                    0,
                    192,
                    0,
                    0,
                    0,
                    192,
                    32,
                    0,
                    0,
                    192,
                    64,
                    0,
                    0,
                    192,
                    96,
                    0,
                    0,
                    192,
                    128,
                    0,
                    0,
                    192,
                    160,
                    0,
                    0,
                    192,
                    192,
                    0,
                    0,
                    192,
                    224,
                    0,
                    0,
                    224,
                    0,
                    0,
                    0,
                    224,
                    32,
                    0,
                    0,
                    224,
                    64,
                    0,
                    0,
                    224,
                    96,
                    0,
                    0,
                    224,
                    128,
                    0,
                    0,
                    224,
                    160,
                    0,
                    0,
                    224,
                    192,
                    0,
                    0,
                    224,
                    224,
                    0,
                    64,
                    0,
                    0,
                    0,
                    64,
                    0,
                    32,
                    0,
                    64,
                    0,
                    64,
                    0,
                    64,
                    0,
                    96,
                    0,
                    64,
                    0,
                    128,
                    0,
                    64,
                    0,
                    160,
                    0,
                    64,
                    0,
                    192,
                    0,
                    64,
                    0,
                    224,
                    0,
                    64,
                    32,
                    0,
                    0,
                    64,
                    32,
                    32,
                    0,
                    64,
                    32,
                    64,
                    0,
                    64,
                    32,
                    96,
                    0,
                    64,
                    32,
                    128,
                    0,
                    64,
                    32,
                    160,
                    0,
                    64,
                    32,
                    192,
                    0,
                    64,
                    32,
                    224,
                    0,
                    64,
                    64,
                    0,
                    0,
                    64,
                    64,
                    32,
                    0,
                    64,
                    64,
                    64,
                    0,
                    64,
                    64,
                    96,
                    0,
                    64,
                    64,
                    128,
                    0,
                    64,
                    64,
                    160,
                    0,
                    64,
                    64,
                    192,
                    0,
                    64,
                    64,
                    224,
                    0,
                    64,
                    96,
                    0,
                    0,
                    64,
                    96,
                    32,
                    0,
                    64,
                    96,
                    64,
                    0,
                    64,
                    96,
                    96,
                    0,
                    64,
                    96,
                    128,
                    0,
                    64,
                    96,
                    160,
                    0,
                    64,
                    96,
                    192,
                    0,
                    64,
                    96,
                    224,
                    0,
                    64,
                    128,
                    0,
                    0,
                    64,
                    128,
                    32,
                    0,
                    64,
                    128,
                    64,
                    0,
                    64,
                    128,
                    96,
                    0,
                    64,
                    128,
                    128,
                    0,
                    64,
                    128,
                    160,
                    0,
                    64,
                    128,
                    192,
                    0,
                    64,
                    128,
                    224,
                    0,
                    64,
                    160,
                    0,
                    0,
                    64,
                    160,
                    32,
                    0,
                    64,
                    160,
                    64,
                    0,
                    64,
                    160,
                    96,
                    0,
                    64,
                    160,
                    128,
                    0,
                    64,
                    160,
                    160,
                    0,
                    64,
                    160,
                    192,
                    0,
                    64,
                    160,
                    224,
                    0,
                    64,
                    192,
                    0,
                    0,
                    64,
                    192,
                    32,
                    0,
                    64,
                    192,
                    64,
                    0,
                    64,
                    192,
                    96,
                    0,
                    64,
                    192,
                    128,
                    0,
                    64,
                    192,
                    160,
                    0,
                    64,
                    192,
                    192,
                    0,
                    64,
                    192,
                    224,
                    0,
                    64,
                    224,
                    0,
                    0,
                    64,
                    224,
                    32,
                    0,
                    64,
                    224,
                    64,
                    0,
                    64,
                    224,
                    96,
                    0,
                    64,
                    224,
                    128,
                    0,
                    64,
                    224,
                    160,
                    0,
                    64,
                    224,
                    192,
                    0,
                    64,
                    224,
                    224,
                    0,
                    128,
                    0,
                    0,
                    0,
                    128,
                    0,
                    32,
                    0,
                    128,
                    0,
                    64,
                    0,
                    128,
                    0,
                    96,
                    0,
                    128,
                    0,
                    128,
                    0,
                    128,
                    0,
                    160,
                    0,
                    128,
                    0,
                    192,
                    0,
                    128,
                    0,
                    224,
                    0,
                    128,
                    32,
                    0,
                    0,
                    128,
                    32,
                    32,
                    0,
                    128,
                    32,
                    64,
                    0,
                    128,
                    32,
                    96,
                    0,
                    128,
                    32,
                    128,
                    0,
                    128,
                    32,
                    160,
                    0,
                    128,
                    32,
                    192,
                    0,
                    128,
                    32,
                    224,
                    0,
                    128,
                    64,
                    0,
                    0,
                    128,
                    64,
                    32,
                    0,
                    128,
                    64,
                    64,
                    0,
                    128,
                    64,
                    96,
                    0,
                    128,
                    64,
                    128,
                    0,
                    128,
                    64,
                    160,
                    0,
                    128,
                    64,
                    192,
                    0,
                    128,
                    64,
                    224,
                    0,
                    128,
                    96,
                    0,
                    0,
                    128,
                    96,
                    32,
                    0,
                    128,
                    96,
                    64,
                    0,
                    128,
                    96,
                    96,
                    0,
                    128,
                    96,
                    128,
                    0,
                    128,
                    96,
                    160,
                    0,
                    128,
                    96,
                    192,
                    0,
                    128,
                    96,
                    224,
                    0,
                    128,
                    128,
                    0,
                    0,
                    128,
                    128,
                    32,
                    0,
                    128,
                    128,
                    64,
                    0,
                    128,
                    128,
                    96,
                    0,
                    128,
                    128,
                    128,
                    0,
                    128,
                    128,
                    160,
                    0,
                    128,
                    128,
                    192,
                    0,
                    128,
                    128,
                    224,
                    0,
                    128,
                    160,
                    0,
                    0,
                    128,
                    160,
                    32,
                    0,
                    128,
                    160,
                    64,
                    0,
                    128,
                    160,
                    96,
                    0,
                    128,
                    160,
                    128,
                    0,
                    128,
                    160,
                    160,
                    0,
                    128,
                    160,
                    192,
                    0,
                    128,
                    160,
                    224,
                    0,
                    128,
                    192,
                    0,
                    0,
                    128,
                    192,
                    32,
                    0,
                    128,
                    192,
                    64,
                    0,
                    128,
                    192,
                    96,
                    0,
                    128,
                    192,
                    128,
                    0,
                    128,
                    192,
                    160,
                    0,
                    128,
                    192,
                    192,
                    0,
                    128,
                    192,
                    224,
                    0,
                    128,
                    224,
                    0,
                    0,
                    128,
                    224,
                    32,
                    0,
                    128,
                    224,
                    64,
                    0,
                    128,
                    224,
                    96,
                    0,
                    128,
                    224,
                    128,
                    0,
                    128,
                    224,
                    160,
                    0,
                    128,
                    224,
                    192,
                    0,
                    128,
                    224,
                    224,
                    0,
                    192,
                    0,
                    0,
                    0,
                    192,
                    0,
                    32,
                    0,
                    192,
                    0,
                    64,
                    0,
                    192,
                    0,
                    96,
                    0,
                    192,
                    0,
                    128,
                    0,
                    192,
                    0,
                    160,
                    0,
                    192,
                    0,
                    192,
                    0,
                    192,
                    0,
                    224,
                    0,
                    192,
                    32,
                    0,
                    0,
                    192,
                    32,
                    32,
                    0,
                    192,
                    32,
                    64,
                    0,
                    192,
                    32,
                    96,
                    0,
                    192,
                    32,
                    128,
                    0,
                    192,
                    32,
                    160,
                    0,
                    192,
                    32,
                    192,
                    0,
                    192,
                    32,
                    224,
                    0,
                    192,
                    64,
                    0,
                    0,
                    192,
                    64,
                    32,
                    0,
                    192,
                    64,
                    64,
                    0,
                    192,
                    64,
                    96,
                    0,
                    192,
                    64,
                    128,
                    0,
                    192,
                    64,
                    160,
                    0,
                    192,
                    64,
                    192,
                    0,
                    192,
                    64,
                    224,
                    0,
                    192,
                    96,
                    0,
                    0,
                    192,
                    96,
                    32,
                    0,
                    192,
                    96,
                    64,
                    0,
                    192,
                    96,
                    96,
                    0,
                    192,
                    96,
                    128,
                    0,
                    192,
                    96,
                    160,
                    0,
                    192,
                    96,
                    192,
                    0,
                    192,
                    96,
                    224,
                    0,
                    192,
                    128,
                    0,
                    0,
                    192,
                    128,
                    32,
                    0,
                    192,
                    128,
                    64,
                    0,
                    192,
                    128,
                    96,
                    0,
                    192,
                    128,
                    128,
                    0,
                    192,
                    128,
                    160,
                    0,
                    192,
                    128,
                    192,
                    0,
                    192,
                    128,
                    224,
                    0,
                    192,
                    160,
                    0,
                    0,
                    192,
                    160,
                    32,
                    0,
                    192,
                    160,
                    64,
                    0,
                    192,
                    160,
                    96,
                    0,
                    192,
                    160,
                    128,
                    0,
                    192,
                    160,
                    160,
                    0,
                    192,
                    160,
                    192,
                    0,
                    192,
                    160,
                    224,
                    0,
                    192,
                    192,
                    0,
                    0,
                    192,
                    192,
                    32,
                    0,
                    192,
                    192,
                    64,
                    0,
                    192,
                    192,
                    96,
                    0,
                    192,
                    192,
                    128,
                    0,
                    192,
                    192,
                    160,
                    0,
                    240,
                    251,
                    255,
                    0,
                    164,
                    160,
                    160,
                    0,
                    128,
                    128,
                    128,
                    0,
                    0,
                    0,
                    255,
                    0,
                    0,
                    255,
                    0,
                    0,
                    0,
                    255,
                    255,
                    0,
                    255,
                    0,
                    0,
                    0,
                    255,
                    0,
                    255,
                    0,
                    255,
                    255,
                    0,
                    0,
                    255,
                    255,
                    255,
                    0,
                )
            )
        )
        == BMCContainer.PALETTE
    )


def test_color_black():
    """
    Given:
        - BMCContainer object
    When:
        - Calling the COLOR_BLACK property
    Then:
        - Ensure that the COLOR_BLACK is set correctly
    """
    assert BMCContainer.COLOR_BLACK == b"\x00"


def test_b_process():
    """
    Given:
        - BMCContainer object
    When:
        - Calling the b_process function
    Then:
        - Ensure that the return value is not None and returned properly
    """
    container = BMCContainer()
    container.b_process()
    assert container.bdat is not None


@pytest.mark.parametrize(
    "data, expected_output",
    [
        (b"\xff\xe0\x07\x1f\xf8\x00", b"\xff\x1c\xe7\xff9\xe3\x18\xff\xc6\x1c\x00\xff"),
        (b"\x00\x00\x00\x00", b"\x00\x00\x00\xff\x00\x00\x00\xff"),
    ],
)
def test_b_parse_rgb565(data, expected_output):
    """
    Given:
        - BMCContainer object
    When:
        - Calling the b_process function
    Then:
        - Ensure that the return value is not None and returned properly
    """
    container = BMCContainer()
    result = container.b_parse_rgb565(data)

    # Compare the result with the expected output
    assert result == expected_output


@pytest.mark.parametrize(
    "data, expected_output, btype",
    [
        (b"\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00", b"", BMCContainer.BIN_CONTAINER),
        (
            b"\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00",
            b"\xff\x00\x00\xff\x00\x00\xff\xff\x00\xff\x00\xff",
            BMCContainer.BMC_CONTAINER,
        ),
        (b"\xff\x00\x00", b"", BMCContainer.BIN_CONTAINER),
        (b"\xff\x00\x00", b"\xff\x00\x00\xff", BMCContainer.BMC_CONTAINER),
    ],
)
def test_b_parse_rgb32b(data, expected_output, btype):
    container = BMCContainer()

    container.btype = btype

    result = container.b_parse_rgb32b(data)

    # Compare the result with the expected output
    assert result == expected_output


@pytest.mark.parametrize(
    "data, expected_output, btype",
    [
        (b"\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00", b"", BMCContainer.BIN_CONTAINER),
        (
            b"\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00",
            b"\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff",
            BMCContainer.BMC_CONTAINER,
        ),
        (b"\xff\x00\x00\xff\x00\x00\xff\x00\x00", b"", BMCContainer.BIN_CONTAINER),
        (
            b"\xff\x00\x00\xff\x00\x00\xff\x00\x00",
            b"\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff",
            BMCContainer.BMC_CONTAINER,
        ),
    ],
)
def test_b_parse_rgb24b(data, expected_output, btype):
    container = BMCContainer()

    container.btype = btype

    result = container.b_parse_rgb24b(data)

    # Compare the result with the expected output
    assert result == expected_output


@pytest.mark.parametrize(
    "data, expected_output",
    [
        (b"", (-1, 1, 0)),
        (b"\xf5", (-1, 2, 0xF5)),
        (b"\xfd", (0xFD, 0, 1)),
        (b"\xf9", (0xF9, 8, 1)),
        (b"\xf0\x00\x01", (0xF0, 256, 3)),
        (b"\xa0", (-1, 2, 0xA0)),
        (b"\x80", (-1, 1, 0x00)),
        (b"\x00", (-1, 1, 0x00)),
        (b"\x10", (0x00, 16, 1)),
        (b"\x40", (-1, 1, 0x00)),
        (b"\xd0", (-1, 1, 0x00)),
    ],
)
def test_b_unrle(data, expected_output):
    container = BMCContainer()
    result = container.b_unrle(data)

    # Compare the result with the expected output
    assert result == expected_output


@pytest.mark.parametrize(
    "data, bbp, expected_output",
    [
        (b"", 3, b""),
        (b"\xf5", 3, b""),
        (b"\xfd", 3, b"\xff\xff\xff"),
        (b"\xa0", 3, b""),
        (b"\x80", 3, b""),
        (b"\x00", 3, b""),
        (b"\x40", 3, b""),
        (b"\xd0", 3, b""),
    ],
)
def test_b_uncompress(data, bbp, expected_output):
    container = BMCContainer()
    result = container.b_uncompress(data, bbp)

    # Compare the result with the expected output
    assert result == expected_output

    @pytest.mark.parametrize(
        "width, height, data, expected",
        [
            (10, 10, b"test_data", b"expected_output_without_palette"),
            (10, 10, b"test_data", b"expected_output_with_palette"),
            # Add more test cases as needed
        ],
    )
    def test_b_export_bmp(self, width, height, data, expected, mocker):
        container = BMCContainer()
        # Mock CommonServerPython.fileResult() to do nothing (avoid creating files on disk)
        with mocker.patch("CommonServerPython.fileResult"):
            actual = container.b_export_bmp(width, height, data)
        assert actual == expected


@pytest.fixture
def bmc_container():
    # Create an instance of BMCContainer for testing
    return BMCContainer()


def test_b_import_already_loaded(bmc_container):
    # Test importing when data is already loaded
    bmc_container.bdat = b"Some data"
    assert bmc_container.b_import("path/to/valid_bmc_container.bin") is False


def test_b_import_valid_file(bmc_container):
    # Test importing valid bin file
    assert bmc_container.b_import("test_data/valid_bin.bin") is True


def test_b_import_empty_file_contents(bmc_container):
    # Test importing empty bin file
    bmc_container.bdat = b""
    assert bmc_container.b_import("test_data/empty_file.bin") is False


def test_b_import_else_case(bmc_container):
    assert bmc_container.b_import("test_data/text_test_file.bin") is False


# Tests that BMCContainer object is initialized with default parameters
def test_default_init():
    bmc = BMCContainer()
    assert bmc.bdat == b""
    assert bmc.o_bmps == []
    assert bmc.bmps == []
    assert bmc.btype == b""
    assert bmc.cnt == 0
    assert bmc.fname == ""
    assert not bmc.oldsave
    assert not bmc.pal
    assert not bmc.verb
    assert not bmc.big
    assert bmc.STRIPE_WIDTH == 64


# Tests that BMCContainer object is initialized with custom parameters
def test_custom_init():
    bmc = BMCContainer(verbose=True, count=10, old=True, big=True, width=128)
    assert bmc.bdat == b""
    assert bmc.o_bmps == []
    assert bmc.bmps == []
    assert bmc.btype == b""
    assert bmc.cnt == 10
    assert bmc.fname == ""
    assert bmc.oldsave
    assert not bmc.pal
    assert bmc.verb
    assert bmc.big
    assert bmc.STRIPE_WIDTH == 128


# Tests that BMCContainer object is initialized with count = 0
def test_zero_count():
    bmc = BMCContainer(count=0)
    assert bmc.cnt == 0


# Tests that BMCContainer object is initialized with old = True
def test_old_true():
    bmc = BMCContainer(old=True)
    assert bmc.oldsave


# Tests that BMCContainer object is initialized with width = 0
def test_width_zero():
    bmc = BMCContainer(width=0)
    assert bmc.STRIPE_WIDTH == 0


# Tests that debug messages are logged when count > 0 or old = True
def test_debug_messages():
    assert BMCContainer(count=5, old=True)


# Tests that the method returns a byte string when called with valid input data
def test_happy_path_valid_input_data():
    bmc = BMCContainer()
    data = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f"
    bbp = 2
    result = bmc.b_uncompress(data, bbp)
    assert (
        result
        == b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff"  # noqa: E501
    )  # noqa: E501


# Tests that the method handles different values of bbp parameter
def test_happy_path_different_bbp_values():
    bmc = BMCContainer()
    data = b"\x00\x01"
    bbp = 1
    result = bmc.b_uncompress(data, bbp)
    assert (
        result
        == b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"  # noqa: E501
    )  # noqa: E501

    bbp = 4
    result = bmc.b_uncompress(data, bbp)
    assert (
        result
        == b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"  # noqa: E501
    )  # noqa: E501


# Tests that the method handles different values of data parameter
def test_happy_path_different_data_values():
    bmc = BMCContainer()
    data = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f"
    bbp = 2
    result = bmc.b_uncompress(data, bbp)
    assert (
        result
        == b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff"  # noqa: E501
    )  # noqa: E501

    data = b""
    result = bmc.b_uncompress(data, bbp)
    assert result == b""


# Tests that the method returns an empty byte string when called with empty data
def test_edge_case_empty_data():
    bmc = BMCContainer()
    data = b""
    bbp = 2
    result = bmc.b_uncompress(data, bbp)
    assert result == b""


# Tests that the method logs an error message and returns an empty byte string when called with an invalid cmd value
def test_edge_case_invalid_cmd_value():
    bmc = BMCContainer()
    data = b"\xff"
    bbp = 2
    result = bmc.b_uncompress(data, bbp)
    assert result == b""


# Tests that the method logs an error message and returns an empty byte string when called with an invalid rl value
def test_edge_case_invalid_rl_value():
    bmc = BMCContainer()
    data = b"\x00\x01\x02"
    bbp = 2
    result = bmc.b_uncompress(data, bbp)
    assert (
        result
        == b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00"  # noqa: E501
    )  # noqa: E501


def test_edge_case_cmd_0xC0():
    bmc = BMCContainer()
    data = b"\xc0" + b"\xff" * (3 * 64)  # cmd = 0xC0, rl = 64
    bbp = 2
    assert bmc.b_uncompress(data, bbp) == b""


def test_edge_case_cmd_0xF6():
    bmc = BMCContainer()
    data = b"\xf6" + b"\x01" * (1 * 64)  # cmd = 0xF6, rl = 64
    bbp = 128
    assert bmc.b_uncompress(data, bbp) == b""


def test_edge_case_cmd_0x20():
    bmc = BMCContainer()
    data = b"\x01" * (1 * 64)  # cmd = 0xF6, rl = 64
    bbp = 2
    assert (
        bmc.b_uncompress(data, bbp)
        == b"\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"  # noqa: E501
    )  # noqa: E501


def test_b_process_btype_is_bin():
    bmcc = BMCContainer()
    bmcc.btype = b".BIN"
    with open("test_data/valid_bin.bin", "rb") as f:
        bmcc.bdat = f.read()
    assert bmcc.b_process() is True


def test_b_process_btype_is_bin_buf_256():
    bmcc = BMCContainer()
    data = b"\x01" * 85 + b"\xff" * 18 + b"\x01" * 90
    bmcc.btype = b".BIN"

    assert bmcc.b_parse_rgb24b(data)


def test_b_process_btype_is_bmc_22():
    bmcc = BMCContainer()
    bmcc.btype = b".BMC"
    bmcc.fname = "22.bmc"
    bmcc.TILE_HEADER_SIZE = {bmcc.BMC_CONTAINER: 0x20}
    bmcc.bdat = bmcc.bdat = b"\x03" * 0xC + b"\xff" * (64 * 64 * 3) + b"\x03" * 0xC + b"\xff" * (64 * 64 * 3)
    assert bmcc.b_process() is True


def test_b_process_btype_is_bmc_24():
    bmcc = BMCContainer()
    bmcc.btype = b".BMC"
    bmcc.fname = "24.bmc"
    bmcc.TILE_HEADER_SIZE = {bmcc.BMC_CONTAINER: 0x20}
    bmcc.bdat = bmcc.bdat = b"\x03" * 0xC + b"\xff" * (64 * 64 * 4) + b"\x03" * 0xC + b"\xff" * (64 * 64 * 4)
    assert bmcc.b_process() is True


def test_b_process_btype_is_bmc_2():
    bmcc = BMCContainer()
    bmcc.btype = b".BMC"
    bmcc.fname = "2.bmc"
    bmcc.TILE_HEADER_SIZE = {bmcc.BMC_CONTAINER: 0x20}
    bmcc.bdat = bmcc.bdat = b"\x03" * 0xC + b"\xff" * (64 * 64) + b"\x03" * 0xC + b"\xff" * (64 * 64)
    assert bmcc.b_process() is True


def test_b_process_btype_is_bmc_else():
    bmcc = BMCContainer()
    bmcc.btype = b".BMC"
    bmcc.fname = "1.bmc"
    bmcc.TILE_HEADER_SIZE = {bmcc.BMC_CONTAINER: 0x20}
    bmcc.bdat = bmcc.bdat = b"\x03" * 0xC + b"\xff" * (64 * 64) + b"\x03" * 0xC + b"\xff" * (64 * 64)
    assert bmcc.b_process() is False


def test_b_process_btype_is_bmc_and_compressed_bit():
    bmcc = BMCContainer()
    bmcc.btype = b".BMC"
    bmcc.fname = "1.bmc"
    bmcc.bdat = b"\x03" * 0xC + b"\xff" * (64 * 64) + b"\x0b" + b"\xff" * (64 * 64)
    assert bmcc.b_process() is False


# Tests that the method extracts multiple tiles from a BMC container with valid data
def test_happy_path_multiple_tiles():
    bmcc = BMCContainer()
    bmcc.btype = 1
    bmcc.bdat = b"\x01" * 0xC + b"\xff" * (64 * 64 * 4) + b"\x01" * 0xC + b"\xff" * (64 * 64 * 4)  # BMC container with two tiles
    try:
        bmcc.b_process()
    except KeyError:
        assert True
    else:
        raise AssertionError


# Tests that the method extracts tiles from a BMC container with a valid palette
def test_happy_path_valid_palette():
    bmcc = BMCContainer()
    bmcc.btype = b"1"
    bmcc.bdat = b"\x02" * 0xC + b"\xff" * (64 * 64 * 2) + b"\x02" * 0xC + b"\xff" * (64 * 64 * 2)  # BMC container with two tiles
    try:
        bmcc.b_process()
    except KeyError:
        assert True
    else:
        raise AssertionError


# Tests that the method logs an error message when there is nothing to process
def test_edge_case_no_data():
    bmcc = BMCContainer()
    assert bmcc.b_process() is False


# Tests that the method extracts tiles from a BMC container with invalid data
def test_edge_case_invalid_data():
    bmcc = BMCContainer()
    bmcc.btype = 1
    bmcc.bdat = (
        b"\x01" * 0xC
        + b"\xff" * (64 * 64 * 4)
        + b"\x01" * 0xC
        + b"\xff" * (64 * 64 * 4)
        + b"\x01" * 0xC
        + b"\xff" * (64 * 64 * 2)
    )
    try:
        bmcc.b_process()
    except KeyError:
        assert True
    else:
        raise AssertionError


def test_edge_case_invalid_bpp():
    bmcc = BMCContainer()
    bmcc.btype = 1
    bmcc.bdat = b"\x03" * 0xC + b"\xff" * (64 * 64 * 3) + b"\x03" * 0xC + b"\xff" * (64 * 64 * 3)  # BMC container with two tiles
    try:
        bmcc.b_process()
    except KeyError:
        assert True
    else:
        raise AssertionError


def test_b_flush():
    bmcc = BMCContainer()
    bmcc.bdat = b"\x01\x01\x01"
    bmcc.bmps = [1, 2, 3]
    bmcc.o_bmps = [1, 2, 3]

    bmcc.b_flush()
    assert bmcc.bdat == b""
    assert bmcc.bmps == []
    assert bmcc.o_bmps == []


def test_main(mocker):
    # Mock demisto.getArg function to return the input arguments
    mocker.patch.object(demisto, "results")
    mocker.patch.object(demisto, "context", return_value={"File": [{"name": "valid_bin.bin"}]})
    mocker.patch.object(
        demisto, "getFilePath", return_value={"id": 1, "name": "valid_bin.bin", "path": "test_data/valid_bin.bin"}
    )
    mocker.patch.object(demisto, "args", return_value={"verbose": False, "width": 64, "EntryID": ""})
    # Mock CommonServerPython.fileResult() to do nothing (avoid creating files on disk)
    mocker.patch("BMCTool.BMCContainer.b_write")
    main()

    result = demisto.results
    assert result