"""The unchanged official setup supplies its selected digest and extracts only verified resumed bytes."""
import hashlib
import io
import json
import os
from pathlib import Path
import subprocess
import tarfile
import tempfile
import unittest

from flutter_manifest_fixture import official_setup, tls_origin

ROOT = Path(__file__).parent
PREFIX = "/flutter_infra_release/releases/"


def fixture_archive():
    buffer = io.BytesIO()
    with tarfile.open(fileobj=buffer, mode="w:gz") as archive:
        entry = tarfile.TarInfo("flutter/bin/flutter")
        content = b"#!/bin/sh\nexit 0\n"
        entry.size, entry.mode = len(content), 0o755
        archive.addfile(entry, io.BytesIO(content))
    return buffer.getvalue()


class OfficialArchiveSetupTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.source = official_setup()

    def test_cold_setup_resumes_and_extracts_using_its_actual_manifest_scope(self):
        with tempfile.TemporaryDirectory() as directory:
            root = Path(directory)
            setup, sdk = root / "setup.sh", root / "sdk"
            setup.write_bytes(self.source)
            archive = fixture_archive()
            manifest = json.dumps({"releases": [{"channel": "stable", "version": "3.44.0",
                "dart_sdk_arch": "x64", "hash": "a" * 40, "sha256": hashlib.sha256(archive).hexdigest(),
                "archive": "fixture-sdk.tar.gz"}]}).encode()
            bodies = {PREFIX + "releases_linux.json": manifest, PREFIX + "fixture-sdk.tar.gz": archive}
            with tls_origin(root, ["ok", "partial", "range"], bodies) as (server, cert):
                env = {**os.environ, "HOME": str(root), "RUNNER_TEMP": str(root), "RUNNER_OS": "Linux",
                       "RUNNER_ARCH": "X64", "RUNNER_TOOL_CACHE": str(root / "tools"),
                       "PUB_CACHE": str(root / "pub"), "FLUTTER_STORAGE_BASE_URL": server.url(""),
                       "CURL_CA_BUNDLE": str(cert), "BASH_ENV": str(ROOT / "flutter_manifest_env.sh"),
                       "GOWALK_FLUTTER_MANIFEST_HELPER": str(ROOT / "flutter_manifest.py")}
                for name in ("VERSION_MANIFEST", "GOWALK_FLUTTER_ARCHIVE_SHA256",
                             "HTTPS_PROXY", "https_proxy", "HTTP_PROXY", "http_proxy"):
                    env.pop(name, None)
                for name in ("GITHUB_ENV", "GITHUB_OUTPUT", "GITHUB_PATH"):
                    env[name] = str(root / name.lower())
                result = subprocess.run(["bash", str(setup), "-n", "3.44.0", "-a", "x64",
                                         "-c", str(sdk), "stable"], env=env, cwd=root,
                                        capture_output=True, timeout=20)
                self.assertEqual(result.returncode, 0, result.stderr)
                self.assertEqual((sdk / "flutter/bin/flutter").read_bytes(), b"#!/bin/sh\nexit 0\n")
                self.assertEqual(server.ranges, ["", "", "bytes=31-"])
                self.assertEqual(server.requests, [PREFIX + "releases_linux.json"]
                                 + [PREFIX + "fixture-sdk.tar.gz"] * 2)
                self.assertNotIn(b"fixture-secret", result.stdout + result.stderr)
                self.assertFalse(list(root.glob("flutter-manifest-*")))


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