blob: 88993ceaa9838615d78241423f25b5f1a6128434 [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 json
import os
import unittest
import test_env
from lib.factory import Factory
from test_case import TestCaseWithFactory
class FactoryTest(TestCaseWithFactory):
def test_create_buildenv(self):
# FUCHSIA_DIR isn't set
factory = Factory(host=self.host)
self.assertError(
lambda: factory.buildenv, 'FUCHSIA_DIR not set.',
'Have you sourced "scripts/fx-env.sh"?')
fuchsia_dir = self.buildenv.fuchsia_dir
self.host.setenv('FUCHSIA_DIR', None)
self.host.mkdir(fuchsia_dir)
self.host.setenv('FUCHSIA_DIR', fuchsia_dir)
# Use an empty directory to simulate an unconfigured $FUCHSIA_DIR
build_dir = self.buildenv.build_dir
fx_build_dir = self.buildenv.abspath('//.fx-build-dir')
self.assertError(
lambda: factory.buildenv,
'Failed to read build directory from {}.'.format(fx_build_dir),
'Have you run "fx set ... --fuzz-with <sanitizer>"?')
with self.host.open(fx_build_dir, 'w') as opened:
opened.write(self.buildenv.build_dir + '\n')
# No $FUCHSIA_DIR/out/default/fuzzer.json
fuzzers_json = self.buildenv.abspath(build_dir, 'fuzzers.json')
self.assertError(
lambda: factory.buildenv,
'Failed to read fuzzers from {}.'.format(fuzzers_json),
'Have you run "fx set ... --fuzz-with <sanitizer>"?',
)
# Minimally valid
with self.host.open(fuzzers_json, 'w') as opened:
json.dump([], opened)
buildenv = factory.buildenv
self.assertEqual(buildenv.build_dir, buildenv.abspath(build_dir))
self.assertEqual(buildenv.fuzzers(), [])
def test_create_device(self):
factory = Factory(host=self.host)
# Can't create buildenv, FUCHSIA_DIR isn't set
self.assertError(
lambda: factory.device, 'FUCHSIA_DIR not set.',
'Have you sourced "scripts/fx-env.sh"?')
# Use the fake BuildEnv.
factory._buildenv = self.buildenv
# No $FUCHSIA_DIR/out/default.device
build_dir = self.buildenv.build_dir
device_addr = '::1'
cmd = [
self.buildenv.abspath('//.jiri_root/bin/fx'),
'ffx',
'target',
'list',
'--format',
'a',
]
self.set_outputs(cmd, [device_addr])
self.host.touch(
self.buildenv.abspath(build_dir, 'ssh-keys', 'ssh_config'))
self.assertEqual(factory.device.addr, device_addr)
# Clear the device to force re-initialization.
factory._device = None
# $FUCHSIA_DIR/out/default.device present
device_file = self.buildenv.abspath('{}.device'.format(build_dir))
device_name = 'device_name'
device_addr = '::2'
with self.host.open(device_file, 'w') as opened:
opened.write(device_name + '\n')
cmd = [
self.buildenv.abspath('//.jiri_root/bin/fx'), 'ffx', 'target',
'list', '--format', 'a', device_name
]
self.set_outputs(cmd, [device_addr])
self.assertEqual(factory.device.addr, device_addr)
def test_create_fuzzer(self):
factory = Factory(host=self.host)
# Use the fake BuildEnv and Device.
factory._buildenv = self.buildenv
factory._device = self.device
self.host.mkdir(
os.path.join('fuchsia_dir', 'local', 'fake-package2_fake-target1'))
self.host.mkdir(
os.path.join('fuchsia_dir', 'local', 'fake-package2_fake-target11'))
self.host.mkdir('output')
# No match
args = self.parse_args('check', 'no/match')
self.assertError(
lambda: factory.create_fuzzer(args),
'No matching fuzzers found.',
'Try "fx fuzz list".',
)
# Multiple matches
self.set_input('1')
args = self.parse_args('check', '2/1')
fuzzer = factory.create_fuzzer(args)
self.assertLogged(
'More than one match found.',
'Please pick one from the list (or enter 0 to cancel):',
' 1) fake-package2/fake-target1',
' 2) fake-package2/fake-target11')
self.assertEqual(fuzzer.package, 'fake-package2')
self.assertEqual(fuzzer.executable, 'fake-target1')
self.assertEqual(
fuzzer.executable_url,
'fuchsia-pkg://fuchsia.com/fake-package2#meta/fake-target1.cmx')
# Exact match
args = self.parse_args('check', '2/11')
fuzzer = factory.create_fuzzer(args)
self.assertEqual(fuzzer.package, 'fake-package2')
self.assertEqual(fuzzer.executable, 'fake-target11')
self.assertEqual(
fuzzer.executable_url,
'fuchsia-pkg://fuchsia.com/fake-package2#meta/fake-target11.cmx')
# Infer from test
args = self.parse_args('check', '1/4')
self.assertError(
lambda: factory.create_fuzzer(args),
'No matching fuzzers found.',
'Try "fx fuzz list".',
)
fuzzer = factory.create_fuzzer(args, include_tests=True)
self.assertEqual(fuzzer.package, 'fake-package1')
self.assertEqual(fuzzer.executable, 'fake-target4')
# Fuzzer properties get set by args
args = self.parse_args(
'start',
'--debug',
'--foreground',
'--monitor',
'--output',
'output',
'2/11',
'-output=foo',
'--',
'sub1',
'sub2',
)
fuzzer = factory.create_fuzzer(args)
self.assertEqual(fuzzer.package, 'fake-package2')
self.assertEqual(fuzzer.executable, 'fake-target11')
self.assertEqual(
fuzzer.executable_url,
'fuchsia-pkg://fuchsia.com/fake-package2#meta/fake-target11.cmx')
self.assertTrue(fuzzer.debug)
self.assertTrue(fuzzer.foreground)
self.assertTrue(fuzzer.monitor)
self.assertEqual(fuzzer.output, 'output')
self.assertEqual(fuzzer.libfuzzer_opts, {'output': 'foo'})
self.assertEqual(fuzzer.subprocess_args, ['sub1', 'sub2'])
if __name__ == '__main__':
unittest.main()