from sut import MockAgent
import mozdevice
import logging
import unittest

class BasicTest(unittest.TestCase):

    def test_init(self):
        """Tests DeviceManager initialization."""
        a = MockAgent(self)

        mozdevice.DroidSUT("127.0.0.1", port=a.port, logLevel=logging.DEBUG)
        # all testing done in device's constructor
        a.wait()

    def test_init_err(self):
        """Tests error handling during initialization."""
        a = MockAgent(self, start_commands=[("ver", "##AGENT-WARNING## No version")])
        self.assertRaises(mozdevice.DMError,
                          lambda: mozdevice.DroidSUT("127.0.0.1",
                                                     port=a.port,
                                                     logLevel=logging.DEBUG))
        a.wait()

    def test_timeout_normal(self):
        """Tests DeviceManager timeout, normal case."""
        a = MockAgent(self, commands = [("isdir /mnt/sdcard/tests", "TRUE"),
                                        ("cd /mnt/sdcard/tests", ""),
                                        ("ls", "test.txt"),
                                        ("rm /mnt/sdcard/tests/test.txt",
                                         "Removed the file")])
        d = mozdevice.DroidSUT("127.0.0.1", port=a.port, logLevel=logging.DEBUG)
        ret = d.removeFile('/mnt/sdcard/tests/test.txt')
        self.assertEqual(ret, None) # if we didn't throw an exception, we're ok
        a.wait()

    def test_timeout_timeout(self):
        """Tests DeviceManager timeout, timeout case."""
        a = MockAgent(self, commands = [("isdir /mnt/sdcard/tests", "TRUE"),
                                        ("cd /mnt/sdcard/tests", ""),
                                        ("ls", "test.txt"),
                                        ("rm /mnt/sdcard/tests/test.txt", 0)])
        d = mozdevice.DroidSUT("127.0.0.1", port=a.port, logLevel=logging.DEBUG)
        d.default_timeout = 1
        exceptionThrown = False
        try:
            d.removeFile('/mnt/sdcard/tests/test.txt')
        except mozdevice.DMError:
            exceptionThrown = True
        self.assertEqual(exceptionThrown, True)
        a.should_stop = True
        a.wait()

    def test_shell(self):
        """Tests shell command"""
        for cmd in [ ("exec foobar", False), ("execsu foobar", True) ]:
            for retcode in [ 1, 2 ]:
                a = MockAgent(self, commands=[(cmd[0],
                                               "\nreturn code [%s]" % retcode)])
                d = mozdevice.DroidSUT("127.0.0.1", port=a.port)
                exceptionThrown = False
                try:
                    d.shellCheckOutput(["foobar"], root=cmd[1])
                except mozdevice.DMError:
                    exceptionThrown = True
                expectedException = (retcode != 0)
                self.assertEqual(exceptionThrown, expectedException)

                a.wait()

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