blob: 07e769616c6977c1187e9acc84f4424ece85cdb9 [file] [log] [blame]
#!/usr/bin/env python2.7
# Copyright 2019 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 tempfile
import unittest
import test_env
from lib.host import Host
from host_mock import MockHost
class TestHost(unittest.TestCase):
def test_join(self):
fuchsia_dir = os.getenv('FUCHSIA_DIR')
os.unsetenv('FUCHSIA_DIR')
del os.environ['FUCHSIA_DIR']
with self.assertRaises(Host.ConfigError):
Host.join('foo')
if not fuchsia_dir:
return
os.environ['FUCHSIA_DIR'] = fuchsia_dir
self.assertTrue(Host.join('foo').endswith('foo'))
def test_find_build_dir(self):
host = Host()
fuchsia_dir = os.getenv('FUCHSIA_DIR')
os.unsetenv('FUCHSIA_DIR')
del os.environ['FUCHSIA_DIR']
with self.assertRaises(Host.ConfigError):
host.find_build_dir()
if not fuchsia_dir:
return
os.environ['FUCHSIA_DIR'] = fuchsia_dir
print(host.find_build_dir())
self.assertTrue(os.path.isdir(host.find_build_dir()))
def test_add_build_ids(self):
host = Host()
host.add_build_ids('no_such_ids')
self.assertNotIn('no_such_ids', host._ids)
if not os.getenv('FUCHSIA_DIR'):
return
build_dir = host.find_build_dir()
build_ids = Host.join(build_dir, '.build-id')
if not os.path.exists(build_ids):
return
host.add_build_ids(build_ids)
self.assertIn(build_ids, host._ids)
def test_set_zxtools(self):
host = Host()
with self.assertRaises(Host.ConfigError):
host.set_zxtools('no_such_zxtools')
if not os.getenv('FUCHSIA_DIR'):
return
build_dir = host.find_build_dir()
zxtools = Host.join(build_dir + '.zircon', 'tools')
if not os.path.isdir(zxtools):
return
host.set_zxtools(zxtools)
self.assertEqual(host._zxtools, zxtools)
def test_set_symbolizer(self):
host = Host()
with self.assertRaises(Host.ConfigError):
host.set_symbolizer('no_such_executable', 'no_such_symbolizer')
if not os.getenv('FUCHSIA_DIR'):
return
platform = 'mac-x64' if os.uname()[0] == 'Darwin' else 'linux-x64'
executable = Host.join(host.get_host_out_dir(), 'symbolize')
symbolizer = Host.join(
'prebuilt', 'third_party', 'clang', platform, 'bin',
'llvm-symbolizer')
with self.assertRaises(Host.ConfigError):
host.set_symbolizer(executable, 'no_such_symbolizer')
with self.assertRaises(Host.ConfigError):
host.set_symbolizer('no_such_executable', symbolizer)
host.set_symbolizer(executable, symbolizer)
self.assertEqual(host._symbolizer_exec, executable)
self.assertEqual(host._llvm_symbolizer, symbolizer)
def test_set_fuzzers_json(self):
host = Host()
with self.assertRaises(Host.ConfigError):
host.set_fuzzers_json('no_such_json')
if not os.getenv('FUCHSIA_DIR'):
return
build_dir = host.find_build_dir()
json_file = Host.join(build_dir, 'fuzzers.json')
# No guarantee of contents; just ensure it parses without crashing.
if os.path.exists(json_file):
host.set_fuzzers_json(json_file)
# Construct and parse both fuchsia and zircon style fuzzer metadata.
data = [
{
'fuzz_host': False,
'fuzzers': ['foo_fuzzer'],
'fuzzers_package': 'foo_fuzzers'
},
{
'fuzz_host': False,
'fuzzers': ['zx_fuzzer.asan', 'zx_fuzzer.ubsan'],
'fuzzers_package': 'zircon_fuzzers'
},
]
with tempfile.NamedTemporaryFile() as f:
f.write(json.dumps(data))
f.seek(0)
host.set_fuzzers_json(f.name)
self.assertIn(('foo_fuzzers', 'foo_fuzzer'), host.fuzzers)
self.assertIn(('zircon_fuzzers', 'zx_fuzzer.asan'), host.fuzzers)
self.assertIn(('zircon_fuzzers', 'zx_fuzzer.ubsan'), host.fuzzers)
def test_set_build_dir(self):
host = Host()
with self.assertRaises(Host.ConfigError):
host.set_fuzzers_json('no_such_build_dir')
if not os.getenv('FUCHSIA_DIR'):
return
build_dir = host.find_build_dir()
ssh_config = Host.join(build_dir, 'ssh-keys', 'ssh_config')
zxtools = Host.join(build_dir + '.zircon', 'tools')
platform = 'mac-x64' if os.uname()[0] == 'Darwin' else 'linux-x64'
executable = Host.join(host.get_host_out_dir(), 'symbolize')
symbolizer = Host.join(
'prebuilt',
'third_party',
'clang',
platform,
'bin',
'llvm-symbolizer',
)
host.set_build_dir(build_dir)
self.assertNotEqual(len(host._ids), 0)
for id in host._ids:
self.assertTrue(os.path.exists(id))
self.assertIsNotNone(host._zxtools)
self.assertTrue(os.path.exists(host._symbolizer_exec))
self.assertTrue(os.path.exists(host._llvm_symbolizer))
def test_zircon_tool(self):
# If a build tree is available, try using a zircon tool for "real".
host = Host()
try:
host.set_build_dir(host.find_build_dir())
except Host.ConfigError:
return
with self.assertRaises(Host.ConfigError):
host.zircon_tool(['no_such_tool'])
path = os.path.abspath(__file__)
line = host.zircon_tool(['merkleroot', path])
self.assertRegexpMatches(line, r'[0-9a-f]* - ' + path)
def test_fx_command(self):
mock = MockHost()
mock.fx_command(['device-finder', 'list'])
fx_bin = Host.join('.jiri_root', 'bin', 'fx')
self.assertIn('{} device-finder list'.format(fx_bin), mock.history)
def test_killall(self):
mock = MockHost()
mock.killall('mock_tool')
self.assertIn('killall mock_tool', mock.history)
def test_symbolize(self):
mock = MockHost()
stacktrace = [
'a line',
'another line',
'yet another line',
]
mock.symbolize('\n'.join(stacktrace))
self.assertIn(
' '.join(
[
'mock/symbolize',
'-llvm-symbolizer',
'mock/llvm_symbolizer',
'-build-id-dir',
'mock/.build-id',
]), mock.history)
for line in stacktrace:
self.assertIn(' < ' + line, mock.history)
def test_notify_user(self):
host = Host()
try:
host.set_build_dir(host.find_build_dir())
except Host.ConfigError:
return
host.notify_user('This is a test', 'This is only a test.')
def test_snapshot(self):
fuchsia_dir = os.getenv('FUCHSIA_DIR')
os.unsetenv('FUCHSIA_DIR')
del os.environ['FUCHSIA_DIR']
host = Host()
with self.assertRaises(Host.ConfigError):
host.snapshot()
if not fuchsia_dir:
return
os.environ['FUCHSIA_DIR'] = fuchsia_dir
line = host.snapshot()
self.assertRegexpMatches(line, r'[0-9a-f]{40}')
if __name__ == '__main__':
unittest.main()