from sut import MockAgent
import mozdevice
import logging
import unittest

class PullTest(unittest.TestCase):

    def test_pull_success(self):
        for count in [ 1, 4, 1024, 2048 ]:
            cheeseburgers = ""
            for i in range(count):
                cheeseburgers += "cheeseburgers"

            # pull file is kind of gross, make sure we can still execute commands after it's done
            remoteName = "/mnt/sdcard/cheeseburgers"
            a = MockAgent(self, commands = [("pull %s" % remoteName,
                                             "%s,%s\n%s" % (remoteName,
                                                            len(cheeseburgers),
                                                            cheeseburgers)),
                                            ("isdir /mnt/sdcard", "TRUE")])

            d = mozdevice.DroidSUT("127.0.0.1", port=a.port,
                                   logLevel=logging.DEBUG)
            pulledData = d.pullFile("/mnt/sdcard/cheeseburgers")
            self.assertEqual(pulledData, cheeseburgers)
            d.dirExists('/mnt/sdcard')

    def test_pull_failure(self):

        # this test simulates only receiving a few bytes of what we expect
        # to be larger file
        remoteName = "/mnt/sdcard/cheeseburgers"
        a = MockAgent(self, commands = [("pull %s" % remoteName,
                                         "%s,15\n%s" % (remoteName,
                                                        "cheeseburgh"))])
        d = mozdevice.DroidSUT("127.0.0.1", port=a.port,
                               logLevel=logging.DEBUG)
        exceptionThrown = False
        try:
            d.pullFile("/mnt/sdcard/cheeseburgers")
        except mozdevice.DMError:
            exceptionThrown = True
        self.assertTrue(exceptionThrown)

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


