import unittest

import os, sys, os.path, time
from tempfile import mkdtemp
from shutil import rmtree
import mozunit
from mozprocess import processhandler

from nsinstall import nsinstall
import nsinstall as nsinstall_module
NSINSTALL_PATH = nsinstall_module.__file__

# Run the non-ASCII tests on (a) Windows, or (b) any platform with
# sys.stdin.encoding set to UTF-8
import codecs
RUN_NON_ASCII_TESTS = (sys.platform == "win32" or
                       (sys.stdin.encoding is not None and
                        codecs.lookup(sys.stdin.encoding) == codecs.lookup("utf-8")))

class TestNsinstall(unittest.TestCase):
    """
    Unit tests for nsinstall.py
    """
    def setUp(self):
        self.tmpdir = mkdtemp()

    def tearDown(self):
        # Unicode strings means non-ASCII children can be deleted properly on
        # Windows
        if sys.stdin.encoding is None:
            tmpdir = unicode(self.tmpdir)
        else:
            tmpdir = unicode(self.tmpdir, sys.stdin.encoding)
        rmtree(tmpdir)

    # utility methods for tests
    def touch(self, file, dir=None):
        if dir is None:
            dir = self.tmpdir
        f = os.path.join(dir, file)
        open(f, 'w').close()
        return f

    def mkdirs(self, dir):
        d = os.path.join(self.tmpdir, dir)
        os.makedirs(d)
        return d

    def test_nsinstall_D(self):
        "Test nsinstall -D <dir>"
        testdir = os.path.join(self.tmpdir, "test")
        self.assertEqual(nsinstall(["-D", testdir]), 0)
        self.assert_(os.path.isdir(testdir))

    def test_nsinstall_basic(self):
        "Test nsinstall <file> <dir>"
        testfile = self.touch("testfile")
        testdir = self.mkdirs("testdir")
        self.assertEqual(nsinstall([testfile, testdir]), 0)
        self.assert_(os.path.isfile(os.path.join(testdir, "testfile")))

    def test_nsinstall_basic_recursive(self):
        "Test nsinstall <dir> <dest dir>"
        sourcedir = self.mkdirs("sourcedir")
        self.touch("testfile", sourcedir)
        Xfile = self.touch("Xfile", sourcedir)
        copieddir = self.mkdirs("sourcedir/copieddir")
        self.touch("testfile2", copieddir)
        Xdir = self.mkdirs("sourcedir/Xdir")
        self.touch("testfile3", Xdir)

        destdir = self.mkdirs("destdir")

        self.assertEqual(nsinstall([sourcedir, destdir,
                                    '-X', Xfile,
                                    '-X', Xdir]), 0)

        testdir = os.path.join(destdir, "sourcedir")
        self.assert_(os.path.isdir(testdir))
        self.assert_(os.path.isfile(os.path.join(testdir, "testfile")))
        self.assert_(not os.path.exists(os.path.join(testdir, "Xfile")))
        self.assert_(os.path.isdir(os.path.join(testdir, "copieddir")))
        self.assert_(os.path.isfile(os.path.join(testdir, "copieddir", "testfile2")))
        self.assert_(not os.path.exists(os.path.join(testdir, "Xdir")))

    def test_nsinstall_multiple(self):
        "Test nsinstall <three files> <dest dir>"
        testfiles = [self.touch("testfile1"),
                     self.touch("testfile2"),
                     self.touch("testfile3")]
        testdir = self.mkdirs("testdir")
        self.assertEqual(nsinstall(testfiles + [testdir]), 0)
        for f in testfiles:
            self.assert_(os.path.isfile(os.path.join(testdir,
                                                     os.path.basename(f))))

    def test_nsinstall_dir_exists(self):
        "Test nsinstall <dir> <dest dir>, where <dest dir>/<dir> already exists"
        srcdir = self.mkdirs("test")
        destdir = self.mkdirs("testdir/test")
        self.assertEqual(nsinstall([srcdir, os.path.dirname(destdir)]), 0)
        self.assert_(os.path.isdir(destdir))

    def test_nsinstall_t(self):
        "Test that nsinstall -t works (preserve timestamp)"
        testfile = self.touch("testfile")
        testdir = self.mkdirs("testdir")
        # set mtime to now - 30 seconds
        t = int(time.time()) - 30
        os.utime(testfile, (t, t))
        self.assertEqual(nsinstall(["-t", testfile, testdir]), 0)
        destfile = os.path.join(testdir, "testfile")
        self.assert_(os.path.isfile(destfile))
        self.assertEqual(os.stat(testfile).st_mtime,
                         os.stat(destfile).st_mtime)

    if sys.platform != "win32":
        # can't run this test on windows, don't have real file modes there
        def test_nsinstall_m(self):
            "Test that nsinstall -m works (set mode)"
            testfile = self.touch("testfile")
            mode = 0600
            os.chmod(testfile, mode)
            testdir = self.mkdirs("testdir")
            self.assertEqual(nsinstall(["-m", "{0:04o}"
                                        .format(mode), testfile, testdir]), 0)
            destfile = os.path.join(testdir, "testfile")
            self.assert_(os.path.isfile(destfile))
            self.assertEqual(os.stat(testfile).st_mode,
                             os.stat(destfile).st_mode)

    def test_nsinstall_d(self):
        "Test that nsinstall -d works (create directories in target)"
        # -d makes no sense to me, but ok!
        testfile = self.touch("testfile")
        testdir = self.mkdirs("testdir")
        destdir = os.path.join(testdir, "subdir")
        self.assertEqual(nsinstall(["-d", testfile, destdir]), 0)
        self.assert_(os.path.isdir(os.path.join(destdir, "testfile")))

    if RUN_NON_ASCII_TESTS:
        def test_nsinstall_non_ascii(self):
            "Test that nsinstall handles non-ASCII files"
            filename = u"\u2325\u3452\u2415\u5081"
            testfile = self.touch(filename)
            testdir = self.mkdirs(u"\u4241\u1D04\u1414")
            self.assertEqual(nsinstall([testfile.encode("utf-8"),
                                        testdir.encode("utf-8")]), 0)

            destfile = os.path.join(testdir, filename)
            self.assert_(os.path.isfile(destfile))

        def test_nsinstall_non_ascii_subprocess(self):
            "Test that nsinstall as a subprocess handles non-ASCII files"
            filename = u"\u2325\u3452\u2415\u5081"
            testfile = self.touch(filename)
            testdir = self.mkdirs(u"\u4241\u1D04\u1414")
            # We don't use subprocess because it can't handle Unicode on
            # Windows <http://bugs.python.org/issue1759845>. mozprocess calls
            # CreateProcessW directly so it's perfect.
            p = processhandler.ProcessHandlerMixin([sys.executable,
                                                    NSINSTALL_PATH,
                                                    testfile, testdir])
            p.run()
            rv = p.waitForFinish()

            self.assertEqual(rv, 0)
            destfile = os.path.join(testdir, filename)
            self.assert_(os.path.isfile(destfile))

    #TODO: implement -R, -l, -L and test them!

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