blob: f2fd41e132f4f1f08e62ce7945cb4bd809b89bf2 [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 unittest
import test_env
from lib.buildenv import BuildEnv
from test_case import TestCaseWithFactory
class BuildEnvTest(TestCaseWithFactory):
def test_fuchsia_dir(self):
self.assertError(
lambda: BuildEnv(self.host, None), 'FUCHSIA_DIR not set.',
'Have you sourced "scripts/fx-env.sh"?')
def test_configure(self):
# Fails due to missing paths
fuchsia_dir = 'test_configure'
buildenv = BuildEnv(self.host, fuchsia_dir)
build_dir = os.path.join(fuchsia_dir, 'build_dir')
self.host.mkdir(build_dir)
# No $FUCHSIA_DIR/out/default/host_x64/symbolize
symbolizer_exec = os.path.join(build_dir, 'host_x64', 'symbolize')
self.assertError(
lambda: buildenv.configure(build_dir),
'Invalid symbolizer executable: {}'.format(symbolizer_exec))
self.host.touch(symbolizer_exec)
# No $FUCHSIA_DIR/out/default/host_x64/symbolize
clang_dir = os.path.join(
fuchsia_dir, 'prebuilt', 'third_party', 'clang', self.host.platform)
llvm_symbolizer = os.path.join(clang_dir, 'bin', 'llvm-symbolizer')
self.assertError(
lambda: buildenv.configure(build_dir),
'Invalid LLVM symbolizer: {}'.format(llvm_symbolizer))
self.host.touch(llvm_symbolizer)
# No $FUCHSIA_DIR/.../.build-id
build_id_dirs = [
os.path.join(clang_dir, 'lib', 'debug', '.build-id'),
os.path.join(build_dir, '.build-id'),
os.path.join(build_dir + '.zircon', '.build-id'),
]
for build_id_dir in build_id_dirs:
self.assertError(
lambda: buildenv.configure(build_dir),
'Invalid build ID directory: {}'.format(build_id_dir),
)
self.host.mkdir(build_id_dir)
buildenv.configure(build_dir)
clang_dir = os.path.join(
'prebuilt', 'third_party', 'clang', self.host.platform)
self.assertEqual(buildenv.build_dir, buildenv.path(build_dir))
self.assertEqual(
buildenv.symbolizer_exec,
buildenv.path(build_dir, 'host_x64', 'symbolize'))
self.assertEqual(
buildenv.llvm_symbolizer,
buildenv.path(clang_dir, 'bin', 'llvm-symbolizer'))
self.assertEqual(
buildenv.build_id_dirs, [
buildenv.path(clang_dir, 'lib', 'debug', '.build-id'),
buildenv.path(build_dir, '.build-id'),
buildenv.path(build_dir + '.zircon', '.build-id'),
])
# Unit tests
def test_read_fuzzers(self):
buildenv = self.factory.create_buildenv()
# 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'
},
]
fuzzers_json = buildenv.path(buildenv.build_dir, 'fuzzers.json')
with self.host.open(fuzzers_json, 'w') as opened:
json.dump(data, opened)
buildenv.read_fuzzers(fuzzers_json)
self.assertIn(('foo_fuzzers', 'foo_fuzzer'), buildenv.fuzzers())
self.assertIn(('zircon_fuzzers', 'zx_fuzzer.asan'), buildenv.fuzzers())
self.assertIn(('zircon_fuzzers', 'zx_fuzzer.ubsan'), buildenv.fuzzers())
def test_fuzzers(self):
self.assertEqual(len(self.buildenv.fuzzers('')), 6)
self.assertEqual(len(self.buildenv.fuzzers('/')), 6)
self.assertEqual(len(self.buildenv.fuzzers('fake')), 6)
self.assertEqual(len(self.buildenv.fuzzers('package1')), 3)
self.assertEqual(len(self.buildenv.fuzzers('target1')), 3)
self.assertEqual(len(self.buildenv.fuzzers('package2/target1')), 2)
self.assertEqual(
len(self.buildenv.fuzzers('fake-package2/fake-target1')), 1)
self.assertEqual(len(self.buildenv.fuzzers('1/2')), 1)
self.assertEqual(len(self.buildenv.fuzzers('target4')), 0)
with self.assertRaises(ValueError):
self.buildenv.fuzzers('a/b/c')
def test_path(self):
fuchsia_dir = self.host.getenv('FUCHSIA_DIR')
self.assertEqual(
self.buildenv.path('bar', 'baz'),
os.path.join(fuchsia_dir, 'bar', 'baz'))
self.assertEqual(
self.buildenv.path(fuchsia_dir, 'baz'),
os.path.join(fuchsia_dir, 'baz'))
def test_find_device(self):
device_name = 'test_find_device'
addrs = ['::1', '::2']
cmd = [
self.buildenv.path('.jiri_root', 'bin', 'fx'),
'device-finder',
'resolve',
'-device-limit',
'1',
device_name,
]
self.set_outputs(cmd, addrs[:1])
self.assertEqual(self.buildenv.find_device(device_name), addrs[0])
# No results from 'fx device-finder list'
self.assertError(
lambda: self.buildenv.find_device(None), 'Unable to find device.',
'Try "fx set-device".')
# Multiple results from `fx device-finder list`
cmd = [
self.buildenv.path('.jiri_root', 'bin', 'fx'), 'device-finder',
'list'
]
self.set_outputs(cmd, addrs)
self.assertError(
lambda: self.buildenv.find_device(None), 'Multiple devices found.',
'Try "fx set-device".')
# Reset output
self.set_outputs(cmd, addrs[:1])
self.assertEqual(self.buildenv.find_device(None), addrs[0])
def test_symbolize(self):
stacktrace = [
'a line',
'another line',
'yet another line',
]
cmd = self.symbolize_cmd()
self.set_outputs(
cmd, [
'[000001.234567][123][456][klog] INFO: Symbolized line 1',
'[000001.234568][123][456][klog] INFO: Symbolized line 2',
'[000001.234569][123][456][klog] INFO: Symbolized line 3'
])
symbolized = self.buildenv.symbolize('\n'.join(stacktrace))
self.assertRan(*cmd)
process = self.get_process(cmd)
self.assertEqual(process.inputs, stacktrace)
self.assertEqual(
symbolized.strip().split('\n'), [
'Symbolized line 1',
'Symbolized line 2',
'Symbolized line 3',
])
if __name__ == '__main__':
unittest.main()