import os
import tempfile
import timeit
import uuid

import bitmath
import pytest

amount_to_transfer = bitmath.GB(1)
minimal_speed_per_second = bitmath.Mb(100)


class TestOCI:
    @pytest.mark.dependency()
    def test_push_speed(self, tart, vm_with_random_disk, docker_registry):
        start = timeit.default_timer()
        tart.run(["push", "--insecure", vm_with_random_disk, docker_registry.remote_name(vm_with_random_disk)])
        stop = timeit.default_timer()

        actual_speed_per_second = self._calculate_speed_per_second(amount_to_transfer, stop - start)
        assert actual_speed_per_second > minimal_speed_per_second

    @pytest.mark.dependency(depends=["TestOCI::test_push_speed"])
    def test_pull_speed(self, tart, vm_with_random_disk, docker_registry):
        start = timeit.default_timer()
        tart.run(["pull", "--insecure", docker_registry.remote_name(vm_with_random_disk)])
        stop = timeit.default_timer()

        actual_speed_per_second = self._calculate_speed_per_second(amount_to_transfer, stop - start)
        assert actual_speed_per_second > minimal_speed_per_second

    @staticmethod
    def _calculate_speed_per_second(amount_transferred, time_taken):
        return (amount_transferred / time_taken).best_prefix(bitmath.SI)


@pytest.fixture(scope="class")
def vm_with_random_disk(tart):
    vm_name = str(uuid.uuid4())

    # Create a VM (Linux for speed's sake)
    tart.run(["create", "--linux", vm_name])

    # Populate VM's disk with "amount_to_transfer" of random bytes
    # to effectively disable Tart's OCI blob compression
    disk_path = os.path.join(tart.home(), "vms", vm_name, "disk.img")

    with tempfile.NamedTemporaryFile(delete=False) as tf:
        tf.write(os.urandom(int(amount_to_transfer.bytes)))
        tf.close()
        os.rename(tf.name, disk_path)

    yield vm_name

    tart.run(["delete", vm_name])
