blob: 629dfd2ea6fcc8d2db3e8661a32834b1072f5f8b [file] [log] [blame]
#!/usr/bin/env python2.7
# 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 sys
import test_env
from lib.factory import Factory
from host_fake import FakeHost
from lib.buildenv import BuildEnv
from lib.device import Device
class FakeFactory(Factory):
"""Fake factory that creates objects for testing.
Unlike the real factory, this object caches and reuses created BuildEnvs
and Devices. It also allows tests to access created objects for
examination.
Attributes:
buildenv: The associated BuildEnv object.
device: The associated Device object.
fuzzer: The most recently created FakeFuzzer object.
"""
def __init__(self):
super(FakeFactory, self).__init__(host=FakeHost())
self._parser = None
self._buildenv = None
self._device = None
self._fuzzer = None
# Factory created objects, lazily instantiated.
@property
def parser(self):
"""The associated ArgParser object."""
if not self._parser:
self._parser = self.create_parser()
return self._parser
@property
def buildenv(self):
"""The associated BuildEnv object."""
if not self._buildenv:
self._buildenv = self.create_buildenv()
return self._buildenv
@property
def device(self):
"""The associated Device object."""
if not self._device:
self._device = self.create_device()
return self._device
@property
def fuzzer(self):
"""The most recently created Fuzzer object."""
assert self._fuzzer, 'No fuzzer created.'
return self._fuzzer
# Methods to create objects.
def create_buildenv(self):
"""Returns the factory's build environment, creating it if needed."""
fuchsia_dir = self.host.getenv('FUCHSIA_DIR')
self.host.mkdir(fuchsia_dir)
buildenv = BuildEnv(self.host, fuchsia_dir)
build_dir = 'build_dir'
self.host.mkdir(buildenv.path(build_dir))
self.host.touch(buildenv.path(build_dir, 'host_x64', 'symbolize'))
self.host.touch(
buildenv.path(
'prebuilt', 'third_party', 'clang', self.host.platform, 'bin',
'llvm-symbolizer'))
self.host.mkdir(
buildenv.path(
'prebuilt', 'third_party', 'clang', self.host.platform, 'lib',
'debug', '.build-id'))
self.host.mkdir(buildenv.path(build_dir, '.build-id'))
self.host.mkdir(buildenv.path(build_dir + '.zircon', '.build-id'))
self.host.touch(buildenv.path(build_dir, 'ssh-keys', 'ssh_config'))
buildenv.configure(build_dir)
buildenv.add_fuzzer('fake-package1', 'fake-target1')
buildenv.add_fuzzer('fake-package1', 'fake-target2')
buildenv.add_fuzzer('fake-package1', 'fake-target3')
buildenv.add_fuzzer('fake-package2', 'fake-target1')
buildenv.add_fuzzer('fake-package2', 'fake-target11')
buildenv.add_fuzzer('fake-package2', 'an-extremely-verbose-target-name')
return buildenv
def create_device(self):
"""Returns the factory's device, creating it if needed."""
device = Device(self.create_buildenv(), '::1')
device.configure()
return device
def create_fuzzer(self, args, device=None):
self._fuzzer = super(FakeFactory, self).create_fuzzer(
args, device=device)
return self.fuzzer