def clean_project(compilation_service): try: compilation_service.clean() except NotACpmProject: return Result(FAIL, f'error: not a cpm project') return Result(OK, f'clean finished')
def prep_project(compilation_service, target='default'): try: compilation_service.update(target) except NotACpmProject: return Result(FAIL, f'error: not a cpm project') return Result(OK, f'CMakeLists.txt ready')
def clean_project(compilation_service): try: compilation_service.clean() except ProjectDescriptorNotFound: return Result(FAIL, f'error: not a cpm project') return Result(OK, f'clean finished')
def new_project(creation_service, options=CreationOptions()): if creation_service.exists(options.directory): return Result(FAIL, f'error: directory {options.directory} already exists') creation_service.create(options) return Result(OK, f'Created project {options.project_name}')
def init_project(creation_service, options=CreationOptions(init_from_existing_sources=True)): if creation_service.exists(options.directory): directory_print = 'current directory' if options.directory == '.' else f'directory {options.directory}' return Result( FAIL, f'error: {directory_print} already contains a cpm project') creation_service.create(options) return Result(OK, f'Created project {options.project_name}')
def install_bit(install_service, name, version='latest'): try: install_service.install(name, version) except ProjectDescriptorNotFound: return Result(FAIL, 'error: not a cpm project') except BitNotFound: return Result(FAIL, f'error: bit {name} not found in CPM Hub') except HttpConnectionError as error: return Result(FAIL, f'error: failed to connect to CPM Hub at {error}') return Result(OK, f'installed bit {name}:{version}')
def install_project_bits(install_service): try: install_service.install_all() except ProjectDescriptorNotFound: return Result(FAIL, 'error: not a cpm project') except BitNotFound as e: return Result(FAIL, f'error: bit {e} not found in CPM Hub') except HttpConnectionError as error: return Result(FAIL, f'error: failed to connect to CPM Hub at {error}') return Result(OK, f'installed bits')
def new_project(creation_service, options=CreationOptions()): try: if creation_service.exists(options.directory): return Result( FAIL, f'error: directory {options.directory} already exists') creation_service.create(options) except TemplateNotFound: return Result( FAIL, f'error: template {options.template_name}:{options.template_version} not found' ) return Result(OK, f'Created project {options.project_name}')
def run_tests(test_service, files_or_dirs=(), test_args=(), target='default'): try: test_service.run_tests(files_or_dirs, target, test_args) except ProjectDescriptorNotFound: return Result(FAIL, 'error: not a cpm project') except BuildError as e: return Result(FAIL, f'error: failed building tests') except TestsFailed: return Result(FAIL, '✖ FAIL') except NoTestsFound: return Result(OK, 'no tests to run') return Result(OK, '✔ PASS')
def build_project(compilation_service, target='default'): try: compilation_service.build(target) except NotACpmProject: return Result(FAIL, f'error: not a cpm project') except BuildError: return Result(FAIL, f'error: compilation failed') except DockerImageNotFound as e: return Result( FAIL, f'error: docker image {e.image_name} not found for target {target}' ) return Result(OK, f'Build finished')
def test_build_from_docker_image_with_toolchain_prefix(self): os.chdir(self.PROJECT_DIRECTORY) self.set_target_dockerfile('default', f'../environment/Dockerfile') self.set_toolchain_prefix('default', 'arm-linux-gnueabihf-') install.execute(['-s', 'http://localhost:8000']) result = build.execute([]) assert result == Result(0, 'Build finished')
def test_build_from_docker_image_with_non_default_target(self): os.chdir(self.PROJECT_DIRECTORY) self.set_target_image('ubuntu', 'cpmbits/ubuntu:20.04') self.set_target_main('ubuntu', 'main.cpp') install.execute(['-s', 'http://localhost:8000']) result = build.execute([]) assert result == Result(0, 'Build finished')
def run_tests(test_service, files_or_dirs=None, target='default'): if files_or_dirs is None: files_or_dirs = [] try: test_service.run_tests(files_or_dirs, target) except NotACpmProject: return Result(FAIL, 'error: not a cpm project') except BuildError as e: return Result(FAIL, f'error: failed building tests') except TestsFailed: return Result(FAIL, '✖ FAIL') except NoTestsFound: return Result(OK, 'no tests to run') return Result(OK, '✔ PASS')
def test_build_after_recursive_bit_installation(self): os.chdir(self.PROJECT_DIRECTORY) self.add_bit('build', 'test', '1.0') self.set_libraries(['pthread', 'dl']) install.execute(['-s', 'http://localhost:8000']) result = build.execute([]) assert result == Result(0, 'Build finished')
def build_project(compilation_service, target='default'): try: print(f'cpm: building target {target}') compilation_service.build(target) except ProjectDescriptorNotFound: return Result(FAIL, f'error: not a cpm project') except BuildError: return Result(FAIL, f'error: compilation failed') except InvalidTarget: return Result(FAIL, f'error: unknown target {target}') except DockerImageNotFound as e: return Result( FAIL, f'error: docker image {e.image_name} not found for target {target}' ) return Result(OK, f'Build finished')
def test_executing_project_action(self, os): action_runner = ProjectActionRunner('deploy', 'docker build') os.system.return_value = 0 result = action_runner.execute(None) os.system.assert_called_once_with('docker build') assert result == Result(0, f'finished "deploy"')
def test_publishing_template(self, user_input, getpass): user_input.return_value = 'user' getpass.return_value = 'password' os.chdir(self.PROJECT_DIRECTORY) self.set_target_dockerfile('default', f'../environment/Dockerfile') install.execute(['-s', 'http://localhost:8000']) result = publish.execute(['-t', '-s', 'http://localhost:8000']) assert result == Result(0, 'Project published')
def test_build_from_docker_image_with_ldflags(self): os.chdir(self.PROJECT_DIRECTORY) self.set_target_image('default', 'cpmbits/ubuntu:20.04') self.set_ldflags(['-Wl,--allow-multiple-definition']) self.set_target_ldflags('default', ['-Wl,-s']) install.execute(['-s', 'http://localhost:8000']) result = build.execute([]) assert result == Result(0, 'Build finished')
def test_build_from_docker_image_with_post_build(self): os.chdir(self.PROJECT_DIRECTORY) self.set_target_image('default', 'cpmbits/ubuntu:20.04') self.set_post_build('default', [f'ls', f'rm build/{self.PROJECT_NAME}']) install.execute(['-s', 'http://localhost:8000']) result = build.execute([]) assert result == Result(0, 'Build finished') assert not filesystem.file_exists(f'build/{self.PROJECT_NAME}')
def test_build_after_recursive_bit_installation_for_target_not_described_by_bit( self): os.chdir(self.PROJECT_DIRECTORY) self.add_bit('build', 'test', '1.0') self.set_libraries(['pthread', 'dl']) self.set_target_main('rpi4', 'main.cpp') install.execute(['-s', 'http://localhost:8000']) result = build.execute(['rpi4']) assert result == Result(0, 'Build finished')
def publish_project(publish_service): try: publish_service.publish() except NotACpmProject: return Result(FAIL, f'error: not a CPM project') except PackagingFailure as error: return Result(FAIL, f'error: {error.cause}') except HttpConnectionError: return Result(FAIL, f'error: failed to connect to CPM Hub') except InvalidCpmHubUrl: return Result(FAIL, f'error: invalid CPM Hub URL') except AuthenticationFailure: return Result(FAIL, f'error: invalid credentials') except PublicationFailure as error: return Result(FAIL, f'error: {error}') except KeyboardInterrupt: return Result(FAIL, f'interrupted') return Result(OK, f'Project published')
def test_creating_project_from_template(self, user_input, getpass): os.chdir(self.PROJECT_DIRECTORY) self.add_bit('test', 'cest', '1.0') self.add_test('test_case.cpp', fails=True) self.set_target_image('default', 'cpmbits/ubuntu:20.04') self.set_target_test_image('default', 'cpmbits/ubuntu:20.04') self.set_target_dockerfile('default', f'../environment/Dockerfile') user_input.return_value = 'user' getpass.return_value = 'password' publish.execute(['-t', '-s', 'http://localhost:8000']) os.chdir('..') shutil.rmtree(self.PROJECT_DIRECTORY, ignore_errors=True) result = create.execute([ '-s', 'http://localhost:8000', '-t', f'{self.PROJECT_NAME}:0.0.1', self.PROJECT_NAME_FROM_TEMPLATE ]) assert result == Result( 0, f'Created project {self.PROJECT_NAME_FROM_TEMPLATE}')
def publish_project(publish_service, publish_as_template=False): try: if publish_as_template: publish_service.publish_template() else: publish_service.publish() except ProjectDescriptorNotFound: return Result(FAIL, f'error: not a CPM project') except PackagingFailure as error: return Result(FAIL, f'error: {error.cause}') except HttpConnectionError: return Result(FAIL, f'error: failed to connect to CPM Hub') except InvalidCpmHubUrl: return Result(FAIL, f'error: invalid CPM Hub URL') except AuthenticationFailure: return Result(FAIL, f'error: invalid credentials') except PublicationFailure as error: return Result(FAIL, f'error: {error}') except KeyboardInterrupt: return Result(FAIL, f'interrupted') return Result(OK, f'Project published')
def execute(self, argv): return_code = os.system(self.command) return Result(return_code, f'finished "{self.name}"')
def test_build_from_dockerfile(self): os.chdir(self.PROJECT_DIRECTORY) self.set_target_dockerfile('default', f'../environment/Dockerfile') install.execute(['-s', 'http://localhost:8000']) result = build.execute([]) assert result == Result(0, 'Build finished')
def test_build_when_declared_bit_is_not_installed(self): os.chdir(self.PROJECT_DIRECTORY) self.add_bit('build', 'test', '1.0') result = build.execute([]) assert result == Result(0, 'Build finished')
def test_bit_installation_from_command_line_passed_bit(self): os.chdir(self.PROJECT_DIRECTORY) result = install.execute(['-s', 'http://localhost:8000', 'test:1.0']) assert result == Result(0, 'installed bit test:1.0')
def test_recursive_bit_installation(self): os.chdir(self.PROJECT_DIRECTORY) self.add_bit('build', 'test', '1.0') result = install.execute(['-s', 'http://localhost:8000']) assert result == Result(0, 'installed bits')