blob: c0dac0230cf80f853520716a10cd2abf3ed10b45 [file] [log] [blame]
#!/usr/bin/env python3.8
# 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/')
self.assertEqual(self.ns.resource('something'), 'pkg/data/something')
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))
# Assert that a fuzzer-built-as-test has the correct _test suffix.
self.fuzzer._is_test = True
self.assertEqual(
self.ns.data_abspath(relpath),
'/data/r/sys/fuchsia.com:{}:0#meta:{}_test.cmx/{}'.format(
self.fuzzer.package, self.fuzzer.executable, relpath))
# Assert that a fuzzer-built-as-test with a realm label applies the
# realm to the generated path.
self.fuzzer._realm_label = 'unittest'
self.assertEqual(
self.ns.data_abspath(relpath),
'/data/r/sys/r/{}/fuchsia.com:{}:0#meta:{}_test.cmx/{}'.format(
self.fuzzer.realm_label, self.fuzzer.package, \
self.fuzzer.executable, relpath))
# Assert that a fuzzer (not built as test) with a realm label does
# not apply the realm label.
self.fuzzer._is_test = False
self.assertEqual(
abspath, '/data/r/sys/fuchsia.com:{}:0#meta:{}.cmx/{}'.format(
self.fuzzer.package, self.fuzzer.executable, relpath))
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, 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()