"""Prueba del laboratorio: slow_reader. Se salta mientras lab/slow_reader.c tenga TODO."""
import os
import unittest

import scenarios
from netlab import CAPTURES, answer_path, wait_until
from pcaptools import read_capture
from tcpsum import summarize

LAB = scenarios.LAB
scenarios.VERBOSE = False


def setUpModule():
    answer_path("slow_reader.c")
    unittest.addModuleCleanup(LAB.destroy)
    LAB.deploy()
    scenarios.reset()
    if not wait_until(lambda: LAB.sh("a", "ping", "-c", "1", "-W", "2", scenarios.SERVER).returncode == 0,
                      seconds=30):
        raise RuntimeError("la topología no quedó lista")


class SlowReader(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.output = scenarios.scenario_slow()
        cls.segments = read_capture(os.path.join(CAPTURES, "slow-a.pcap"))
        cls.info = summarize(cls.segments)

    def test_all_bytes_arrive(self):
        self.assertIn("recibidos 100000 bytes", self.output)

    def test_it_reads_slowly(self):
        # 100000 bytes de a 2048 cada 100 ms son unos 4,9 s, menos lo que queda en el buffer.
        self.assertGreater(self.info["seconds"], 3.5)

    def test_rcvbuf_was_set_before_listen(self):
        self.assertLess(self.info["max_window"], 20000)
        self.assertEqual(self.info["synack"].wscale, 0)

    def test_zero_window_appears(self):
        self.assertGreaterEqual(self.info["zero_window"], 2)


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