# Any copyright is dedicated to the Public Domain.
# http://creativecommons.org/publicdomain/zero/1.0/

import mozdevice
import logging
import unittest
from sut import MockAgent

class MkDirsTest(unittest.TestCase):

    def test_mkdirs(self):
        subTests = [{'cmds': [('isdir /mnt/sdcard/baz/boop', 'FALSE'),
                              ('info os', 'android'),
                              ('isdir /mnt', 'TRUE'),
                              ('isdir /mnt/sdcard', 'TRUE'),
                              ('isdir /mnt/sdcard/baz', 'FALSE'),
                              ('mkdr /mnt/sdcard/baz',
                               '/mnt/sdcard/baz successfully created'),
                              ('isdir /mnt/sdcard/baz/boop', 'FALSE'),
                              ('mkdr /mnt/sdcard/baz/boop',
                               '/mnt/sdcard/baz/boop successfully created')],
                     'expectException': False},
                    {'cmds': [('isdir /mnt/sdcard/baz/boop', 'FALSE'),
                              ('info os', 'android'),
                              ('isdir /mnt', 'TRUE'),
                              ('isdir /mnt/sdcard', 'TRUE'),
                              ('isdir /mnt/sdcard/baz', 'FALSE'),
                              ('mkdr /mnt/sdcard/baz',
                               '##AGENT-WARNING## Could not create the directory /mnt/sdcard/baz')],
                     'expectException': True},
                     ]
        for subTest in subTests:
            a = MockAgent(self, commands=subTest['cmds'])

            exceptionThrown = False
            try:
                d = mozdevice.DroidSUT('127.0.0.1', port=a.port,
                                       logLevel=logging.DEBUG)
                d.mkDirs('/mnt/sdcard/baz/boop/bip')
            except mozdevice.DMError:
                exceptionThrown = True
            self.assertEqual(exceptionThrown, subTest['expectException'])

            a.wait()

    def test_repeated_path_part(self):
        """
        Ensure that all dirs are created when last path part also found
        earlier in the path (bug 826492).
        """

        cmds = [('isdir /mnt/sdcard/foo', 'FALSE'),
                ('info os', 'android'),
                ('isdir /mnt', 'TRUE'),
                ('isdir /mnt/sdcard', 'TRUE'),
                ('isdir /mnt/sdcard/foo', 'FALSE'),
                ('mkdr /mnt/sdcard/foo',
                 '/mnt/sdcard/foo successfully created')]
        a = MockAgent(self, commands=cmds)
        d = mozdevice.DroidSUT('127.0.0.1', port=a.port,
                               logLevel=logging.DEBUG)
        d.mkDirs('/mnt/sdcard/foo/foo')
        a.wait()

    def test_mkdirs_on_root(self):
        cmds = [('isdir /', 'TRUE')]
        a = MockAgent(self, commands=cmds)
        d = mozdevice.DroidSUT('127.0.0.1', port=a.port,
                               logLevel=logging.DEBUG)
        d.mkDirs('/foo')

        a.wait()


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