class TestInstanceConfig(unittest.TestCase):
    def setUp(self):
        self.instanceConfig = InstanceConfig("an-instance")

    def test_getName(self):
        self.assertEqual(self.instanceConfig.getInstanceName(), "an-instance")

    def test_set_valid_mac(self):
        """Tests whether a legal mac can be set."""
        mac = "01:02:03:AB:CD:EF"
        self.instanceConfig.setMac(mac)
        self.assertEqual(mac.lower(), self.instanceConfig.getMac())

    def test_set_invalid_mac_1(self):
        """Tests whether an illegal mac can be set.
        using an empty mac
        """
        mac = ""
        try:
            self.instanceConfig.setMac(mac)
        except ConfigurationError:
            pass
        else:
            self.fail("expected a ConfigurationError (invalid mac)")

    def test_set_invalid_mac_2(self):
        """Tests whether an illegal mac can be set.
        using the mac: 0g:02:03:AB:CD:EF
        """
        mac = "0g:02:03:AB:CD:EF"
        try:
            self.instanceConfig.setMac(mac)
        except ConfigurationError:
            pass
        else:
            self.fail("expected a ConfigurationError (invalid mac)")

    def test_set_invalid_mac_3(self):
        """Tests whether a too short mac can be set.
        using the mac: 0a:02
        """
        mac = "0a:02"
        try:
            self.instanceConfig.setMac(mac)
        except ConfigurationError:
            pass
        else:
            self.fail("expected a ConfigurationError (invalid mac)")

    def test_set_invalid_mac_4(self):
        """Tests whether a too long mac can be set (1).
        using the mac: 01:023:03:ab:cd:ef
        """
        mac = "01:023:03:ab:cd:ef"
        try:
            self.instanceConfig.setMac(mac)
        except ConfigurationError:
            pass
        else:
            self.fail("expected a ConfigurationError (invalid mac)")

    def test_set_invalid_mac_5(self):
        """Tests whether a too long mac can be set (2).
        using the mac: 01:02:03:ab:cd:ef:00
        """
        mac = "01:02:03:ab:cd:ef:00"
        try:
            self.instanceConfig.setMac(mac)
        except ConfigurationError:
            pass
        else:
            self.fail("expected a ConfigurationError (invalid mac)")

    def test_default_memory(self):
        """Tests the default memory of 128 MB."""
        self.assertEqual(self.instanceConfig.getMemory(), 128 * 1024 ** 2)

    def test_get_memory_b(self):
        """Tests getMemory() in bytes."""
        expected = 128 * 1024 ** 2
        self.assertEqual(self.instanceConfig.getMemory("b"), expected)

    def test_get_memory_k(self):
        """Tests getMemory() in kilo bytes."""
        expected = 128 * 1024
        self.assertEqual(self.instanceConfig.getMemory("k"), expected)

    def test_get_memory_m(self):
        """Tests getMemory() in mega bytes."""
        expected = 128
        self.assertEqual(self.instanceConfig.getMemory("m"), expected)

    def test_get_memory_g(self):
        """Tests getMemory() in giga bytes."""
        expected = 2
        self.instanceConfig.setMemory("2G")
        self.assertEqual(self.instanceConfig.getMemory("g"), expected)

    def test_set_memory_no_modifier(self):
        """Tests whether setting memory without modifier works."""
        expected = 64 * 1024 ** 2
        self.instanceConfig.setMemory(expected)
        self.assertEqual(self.instanceConfig.getMemory(), expected)

        self.instanceConfig.setMemory(str(expected))
        self.assertEqual(self.instanceConfig.getMemory(), expected)

    def test_set_memory_byte_mod(self):
        """Tests whether the byte memory modifier is the same as no modifier."""
        expected = 64 * 1024 ** 2
        self.instanceConfig.setMemory("%db" % expected)
        self.assertEqual(self.instanceConfig.getMemory(), expected)

    def test_set_memory_kib_mod(self):
        """Tests whether the KB modifier works."""
        expected = 256 * 1024
        self.instanceConfig.setMemory("256k")
        self.assertEqual(self.instanceConfig.getMemory(), expected)

    def test_set_memory_meg_mod(self):
        """Tests whether the MB modifier works."""
        expected = 256 * 1024 ** 2
        self.instanceConfig.setMemory("256m")
        self.assertEqual(self.instanceConfig.getMemory(), expected)

    def test_set_memory_gig_mod(self):
        """Tests whether the GB modifier works."""
        expected = 2 * 1024 ** 3
        self.instanceConfig.setMemory("2g")
        self.assertEqual(self.instanceConfig.getMemory(), expected)

    def test_set_memory_case_mod(self):
        """Tests whether the GB modifier works case insensitive."""
        expected = 2 * 1024 ** 3
        self.instanceConfig.setMemory("2g")
        self.assertEqual(self.instanceConfig.getMemory(), expected)
        self.instanceConfig.setMemory("2G")
        self.assertEqual(self.instanceConfig.getMemory(), expected)

    def test_add_disk(self):
        """Tests whether a disk can be added."""
        # assert empty
        self.assertTrue(len(self.instanceConfig.getDisks()) == 0)

        # append
        self.instanceConfig.addDisk("/tmp/foobar.img", "sda1")
        # assert not empty
        self.assertFalse(len(self.instanceConfig.getDisks()) == 0)
        disk1 = self.instanceConfig.getDisks()[0]
        self.assertEqual(disk1["path"], "/tmp/foobar.img")
        self.assertEqual(disk1["target"], "sda1")