#!/usr/bin/env python
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import unittest

import test_env
from test_case import TestCaseWithFuzzer


class NamespaceTest(TestCaseWithFuzzer):

    def test_data(self):
        self.assertEqual(self.ns.data(), 'data/')
        self.assertEqual(self.ns.data('corpus'), 'data/corpus')

    def test_resource(self):
        self.assertEqual(self.ns.resource(), 'pkg/data/fake-target1/')
        self.assertEqual(
            self.ns.resource('dictionary'), 'pkg/data/fake-target1/dictionary')

    def test_base_abspath(self):
        self.assertEqual(
            self.ns.base_abspath('bin/fake-target1'),
            '/pkgfs/packages/fake-package1/0/bin/fake-target1')

    def test_data_abspath(self):
        relpath = 'foo'
        data = self.ns.data(relpath)
        abspath = self.ns.data_abspath(relpath)
        self.assertEqual(
            abspath, '/data/r/sys/fuchsia.com:{}:0#meta:{}.cmx/{}'.format(
                self.fuzzer.package, self.fuzzer.executable, relpath))
        self.assertEqual(abspath, self.ns.data_abspath(data))
        self.assertEqual(abspath, self.ns.data_abspath(abspath))

    def test_resource_abspath(self):
        relpath = 'foo'
        resource = self.ns.resource(relpath)
        abspath = self.ns.resource_abspath(relpath)
        self.assertEqual(
            abspath, '{}/data/{}/{}'.format(
                self.fuzzer.package_path, self.fuzzer.executable, relpath))
        self.assertEqual(abspath, self.ns.resource_abspath(resource))
        self.assertEqual(abspath, self.ns.resource_abspath(abspath))

    def test_abspath(self):
        relpath = 'foo'
        self.assertEqual(
            self.ns.abspath(self.ns.data(relpath)),
            self.ns.data_abspath(relpath))
        self.assertEqual(
            self.ns.abspath(self.ns.resource(relpath)),
            self.ns.resource_abspath(relpath))
        self.assertError(
            lambda: self.ns.abspath(relpath),
            'Not a data or resource path: {}'.format(relpath))

    def test_ls(self):
        relpath = 'corpus'

        # Must be data path
        self.assertError(
            lambda: self.ns.ls(relpath),
            'Not a data or resource path: {}'.format(relpath))

        # Valid
        self.touch_on_device(
            self.ns.data_abspath(relpath + '/deadbeef'), size=314)
        self.touch_on_device(
            self.ns.data_abspath(relpath + '/feedface'), size=159)
        files = self.ns.ls(self.ns.resource(relpath))

    def test_mkdir(self):
        relpath = 'some-dir'

        # Must be data path
        self.assertError(
            lambda: self.ns.mkdir(self.ns.resource_abspath(relpath)),
            'Not a data path: {}'.format(self.ns.resource_abspath(relpath)))

        # Valid
        self.ns.mkdir(self.ns.data(relpath))
        cmd = ['mkdir', '-p', self.ns.data_abspath(relpath)]
        self.assertSsh(*cmd)

    def test_remove(self):
        relpath = 'some-path'

        # Must be data path
        self.assertError(
            lambda: self.ns.remove(self.ns.resource_abspath(relpath)),
            'Not a data path: {}'.format(self.ns.resource_abspath(relpath)))

        # Valid file
        self.ns.remove(self.ns.data(relpath))
        cmd = ['rm', '-f', self.ns.data_abspath(relpath)]
        self.assertSsh(*cmd)

        # Valid directory
        self.ns.remove(self.ns.data(relpath), recursive=True)
        cmd = ['rm', '-rf', self.ns.data_abspath(relpath)]
        self.assertSsh(*cmd)

    def test_fetch(self):
        local_path = 'test_fetch'

        relpath1 = 'fuzz-0.log'
        data = self.ns.data(relpath1)

        relpath2 = 'corpus/*'
        resource = self.ns.resource(relpath2)

        # Local path must exist
        self.assertError(
            lambda: self.ns.fetch(local_path, data, resource),
            'No such directory: {}'.format(local_path))

        # Must be data or resource path(s)
        self.host.mkdir(local_path)
        self.assertError(
            lambda: self.ns.fetch(local_path, relpath1, resource),
            'Not a data or resource path: {}'.format(relpath1))

        self.assertError(
            lambda: self.ns.fetch(local_path, data, relpath2),
            'Not a data or resource path: {}'.format(relpath2))

        # Valid
        self.ns.fetch(local_path, data, resource)
        self.assertScpFrom(
            self.ns.data_abspath(relpath1), self.ns.resource_abspath(relpath2),
            local_path)

    def test_store(self):
        local_path = 'test_store'
        relpath = 'remote_path'

        # Globs must resolve
        data_path = self.ns.data(relpath)
        self.assertError(
            lambda: self.ns.store(data_path, os.path.join(local_path, '*')),
            'No matching files: "test_store/*".')

        # Local path must exist
        foo = os.path.join(local_path, 'foo')
        self.assertError(
            lambda: self.ns.store(data_path, foo),
            'No matching files: "test_store/foo".')

        # Must be data path(s)
        self.host.touch(foo)
        self.assertError(
            lambda: self.ns.store(self.ns.resource_abspath(relpath), foo),
            'Not a data path: {}'.format(self.ns.resource_abspath(relpath)))

        # Valid
        self.ns.store(data_path, foo)
        self.assertScpTo(foo, self.ns.data_abspath(relpath))

        # Valid globs
        bar = os.path.join(local_path, 'bar')
        baz = os.path.join(local_path, 'baz')
        self.host.touch(bar)
        self.host.touch(baz)
        datas = self.ns.store(data_path, os.path.join(local_path, '*'))
        self.assertScpTo(bar, baz, foo, self.ns.data_abspath(relpath))
        relpaths = [os.path.basename(pathname) for pathname in [bar, baz, foo]]
        self.assertEqual(datas, [self.ns.data(relpath) for relpath in relpaths])


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