# SPDX-License-Identifier: GPL-2.0 # pylint: disable=protected-access import io import unittest from typing import Union from podman_compose import Podman class DummyReader: def __init__(self, data: Union[list[bytes], None] = None): self.data = data or [] async def readuntil(self, _: str) -> bytes: return self.data.pop(0) def at_eof(self) -> bool: return len(self.data) == 0 class TestComposeRunLogFormat(unittest.IsolatedAsyncioTestCase): def setUp(self) -> None: self.p = get_minimal_podman() self.buffer = io.StringIO() async def test_single_line_single_chunk(self) -> None: reader = DummyReader([b'hello, world\n']) await self.p._format_stream(reader, self.buffer, 'LL:') # type: ignore[arg-type] self.assertEqual(self.buffer.getvalue(), 'LL: hello, world\n') async def test_empty(self) -> None: reader = DummyReader([]) await self.p._format_stream(reader, self.buffer, 'LL:') # type: ignore[arg-type] self.assertEqual(self.buffer.getvalue(), '') async def test_empty2(self) -> None: reader = DummyReader([b'']) await self.p._format_stream(reader, self.buffer, 'LL:') # type: ignore[arg-type] self.assertEqual(self.buffer.getvalue(), '') async def test_empty_line(self) -> None: reader = DummyReader([b'\n']) await self.p._format_stream(reader, self.buffer, 'LL:') # type: ignore[arg-type] self.assertEqual(self.buffer.getvalue(), 'LL: \n') async def test_line_split(self) -> None: reader = DummyReader([b'hello,', b' world\n']) await self.p._format_stream(reader, self.buffer, 'LL:') # type: ignore[arg-type] self.assertEqual(self.buffer.getvalue(), 'LL: hello, world\n') async def test_two_lines_in_one_chunk(self) -> None: reader = DummyReader([b'hello\nbye\n']) await self.p._format_stream(reader, self.buffer, 'LL:') # type: ignore[arg-type] self.assertEqual(self.buffer.getvalue(), 'LL: hello\nLL: bye\n') async def test_double_blank(self) -> None: reader = DummyReader([b'hello\n\n\nbye\n']) await self.p._format_stream(reader, self.buffer, 'LL:') # type: ignore[arg-type] self.assertEqual(self.buffer.getvalue(), 'LL: hello\nLL: \nLL: \nLL: bye\n') async def test_no_new_line_at_end(self) -> None: reader = DummyReader([b'hello\nbye']) await self.p._format_stream(reader, self.buffer, 'LL:') # type: ignore[arg-type] self.assertEqual(self.buffer.getvalue(), 'LL: hello\nLL: bye\n') def get_minimal_podman() -> Podman: return Podman(None) # type: ignore[arg-type]