"""Bootstrap tests"""

from __future__ import absolute_import, division, print_function
import os
import doctest
import unittest
import tempfile
import hashlib
import sys

from shutil import rmtree

import bootstrap


class Stage0DataTestCase(unittest.TestCase):
    """Test Case for stage0_data"""
    def setUp(self):
        self.rust_root = tempfile.mkdtemp()
        os.mkdir(os.path.join(self.rust_root, "src"))
        with open(os.path.join(self.rust_root, "src",
                               "stage0.txt"), "w") as stage0:
            stage0.write("#ignore\n\ndate: 2017-06-15\nrustc: beta\ncargo: beta")

    def tearDown(self):
        rmtree(self.rust_root)

    def test_stage0_data(self):
        """Extract data from stage0.txt"""
        expected = {"date": "2017-06-15", "rustc": "beta", "cargo": "beta"}
        data = bootstrap.stage0_data(self.rust_root)
        self.assertDictEqual(data, expected)


class VerifyTestCase(unittest.TestCase):
    """Test Case for verify"""
    def setUp(self):
        self.container = tempfile.mkdtemp()
        self.src = os.path.join(self.container, "src.txt")
        self.sums = os.path.join(self.container, "sums")
        self.bad_src = os.path.join(self.container, "bad.txt")
        content = "Hello world"

        with open(self.src, "w") as src:
            src.write(content)
        with open(self.sums, "w") as sums:
            sums.write(hashlib.sha256(content.encode("utf-8")).hexdigest())
        with open(self.bad_src, "w") as bad:
            bad.write("Hello!")

    def tearDown(self):
        rmtree(self.container)

    def test_valid_file(self):
        """Check if the sha256 sum of the given file is valid"""
        self.assertTrue(bootstrap.verify(self.src, self.sums, False))

    def test_invalid_file(self):
        """Should verify that the file is invalid"""
        self.assertFalse(bootstrap.verify(self.bad_src, self.sums, False))


class ProgramOutOfDate(unittest.TestCase):
    """Test if a program is out of date"""
    def setUp(self):
        self.container = tempfile.mkdtemp()
        os.mkdir(os.path.join(self.container, "stage0"))
        self.build = bootstrap.RustBuild()
        self.build.date = "2017-06-15"
        self.build.build_dir = self.container
        self.rustc_stamp_path = os.path.join(self.container, "stage0",
                                             ".rustc-stamp")

    def tearDown(self):
        rmtree(self.container)

    def test_stamp_path_does_not_exists(self):
        """Return True when the stamp file does not exists"""
        if os.path.exists(self.rustc_stamp_path):
            os.unlink(self.rustc_stamp_path)
        self.assertTrue(self.build.program_out_of_date(self.rustc_stamp_path))

    def test_dates_are_different(self):
        """Return True when the dates are different"""
        with open(self.rustc_stamp_path, "w") as rustc_stamp:
            rustc_stamp.write("2017-06-14")
        self.assertTrue(self.build.program_out_of_date(self.rustc_stamp_path))

    def test_same_dates(self):
        """Return False both dates match"""
        with open(self.rustc_stamp_path, "w") as rustc_stamp:
            rustc_stamp.write("2017-06-15")
        self.assertFalse(self.build.program_out_of_date(self.rustc_stamp_path))


if __name__ == '__main__':
    SUITE = unittest.TestSuite()
    TEST_LOADER = unittest.TestLoader()
    SUITE.addTest(doctest.DocTestSuite(bootstrap))
    SUITE.addTests([
        TEST_LOADER.loadTestsFromTestCase(Stage0DataTestCase),
        TEST_LOADER.loadTestsFromTestCase(VerifyTestCase),
        TEST_LOADER.loadTestsFromTestCase(ProgramOutOfDate)])

    RUNNER = unittest.TextTestRunner(stream=sys.stdout, verbosity=2)
    result = RUNNER.run(SUITE)
    sys.exit(0 if result.wasSuccessful() else 1)
