Exemplo n.º 1
0
    def test_link_library_using_cache_with_changed_library(self):
        objects_root = 'objects/'
        libraries_root = 'libraries/'
        libraries_interfaces_root = 'libraries_interfaces/'
        symbols_tables_root = 'symbols_tables/'
        external_libraries_root = 'external/libraries'
        external_libraries_interfaces_root = 'external/libraries_interfaces'
        file_system = FileSystemMock(
            {
                objects_root, libraries_root, libraries_interfaces_root,
                symbols_tables_root, external_libraries_root,
                external_libraries_interfaces_root
            }, {
                'objects/a.obj':
                b'object-a.',
                'external/libraries/b.dll':
                b'updated-external-library-b.',
                'external/libraries_interfaces/c.lib':
                b'external-library-interface-c.'
            })
        compiler = CompilerMock(file_system)
        objects = ['objects/a.obj']
        external_libraries = ['external/libraries/b.dll']
        external_libraries_interfaces = ['external/libraries_interfaces/c.lib']
        cache = {
            'input': {
                'objects/a.obj':
                'a6cc476fe402432f09d3e66d73b6382421ee1a855ac6bde79357fc1483878463',
                'external/libraries/b.obj':
                '440602105d9abfce75656e19197e74539add8cb0dd002f4a550d46d7e8c1e837',
                'external/libraries_interfaces/c.lib':
                '8c777213d1130643127d77653c90f5d6784f6f95dac361afb454a3e6db084f4e'
            },
            'output':
            ('libraries/org-art-x32-windows-compmock-debug-1.0.0.dll',
             'libraries/interfaces/org-art-x32-windows-compmock-debug-1.0.0.lib',
             'symbols_tables/org-art-x32-windows-compmock-debug-1.0.0.pdb')
        }
        library, library_interface, symbols_table = link_library_using_cache(
            file_system, compiler, libraries_root, libraries_interfaces_root,
            symbols_tables_root, external_libraries_root,
            external_libraries_interfaces_root, objects, external_libraries,
            external_libraries_interfaces, organization, artifact, version,
            cache)

        self.assertEqual(
            library, 'libraries/org-art-x32-windows-compmock-debug-1.0.0.dll')

        self.assertEqual(
            library_interface,
            'libraries_interfaces/org-art-x32-windows-compmock-debug-1.0.0.lib'
        )

        self.assertEqual(
            symbols_table,
            'symbols_tables/org-art-x32-windows-compmock-debug-1.0.0.pdb')

        new_files = {
            'objects/a.obj':
            b'object-a.',
            'external/libraries/b.dll':
            b'updated-external-library-b.',
            'external/libraries_interfaces/c.lib':
            b'external-library-interface-c.',
            'libraries/org-art-x32-windows-compmock-debug-1.0.0.dll':
            b'object-a.updated-external-library-b.external-library-interface-c.dll',
            'libraries_interfaces/org-art-x32-windows-compmock-debug-1.0.0.lib':
            b'object-a.updated-external-library-b.external-library-interface-c.lib',
            'symbols_tables/org-art-x32-windows-compmock-debug-1.0.0.pdb':
            b'object-a.updated-external-library-b.external-library-interface-c.pbd'
        }

        self.assertEqual(file_system.files,
                         {normpath(p): data
                          for p, data in new_files.items()})

        new_cache = {
            'input': {
                'objects/a.obj':
                'a6cc476fe402432f09d3e66d73b6382421ee1a855ac6bde79357fc1483878463',
                'external/libraries/b.dll':
                '09e93c7c7aae2efb94a0f6d12ee5b59c0b7a810989d84f866ef515e8dd0f6e41',
                'external/libraries_interfaces/c.lib':
                '8c777213d1130643127d77653c90f5d6784f6f95dac361afb454a3e6db084f4e'
            },
            'output':
            ('libraries/org-art-x32-windows-compmock-debug-1.0.0.dll',
             'libraries_interfaces/org-art-x32-windows-compmock-debug-1.0.0.lib',
             'symbols_tables/org-art-x32-windows-compmock-debug-1.0.0.pdb')
        }

        self.assertEqual(cache, new_cache)
Exemplo n.º 2
0
    def test_compilation_using_cache(self):
        objects_root = 'objects/'
        sources_root = 'sources/'
        headers_root = 'sources/'
        external_headers_root = 'external/headers/'
        file_system = FileSystemMock(
            {objects_root, sources_root, headers_root, external_headers_root},
            {
                'sources/a.hpp': b'header-a.',
                'sources/a.cpp': b'source-a.',
                'sources/b.hpp': b'updated-header-b.',
                'sources/b.cpp': b'source-b.',
                'sources/d.hpp': b'header-d.',
                'sources/d.cpp': b'source-d.',
                'objects/a.obj': b'header-a.source-a.',
                'objects/b.obj': b'header-b.source-b.',
                'objects/c.obj': b'header-c.source-c.'
            })
        compiler = CompilerMock(file_system)
        headers = ['sources/a.hpp', 'sources/b.hpp', 'sources/d.hpp']
        sources = ['sources/a.cpp', 'sources/b.cpp', 'sources/d.cpp']
        cache = {
            'sources/a.cpp':
            '8ceb2730683fdf075d4ede855d5ed98f32be31b093f74b0bee13fd5dea9037dc',
            'sources/b.cpp':
            '5addc12d3b54fb9836277adccb06a03131ab92c10faf97613259bb77775db8d3',
            'sources/c.cpp':
            '853b9c27fdbe775b24a8fb14f7ef43aba1d6e698df4f2df6bc4e0f22c800f1d5'
        }
        objects = compile_using_cache(file_system, compiler, headers_root,
                                      external_headers_root, sources_root,
                                      objects_root, headers, sources, cache)

        self.assertEqual(objects,
                         ['objects/a.obj', 'objects/b.obj', 'objects/d.obj'])

        new_files = {
            'sources/a.hpp': b'header-a.',
            'sources/a.cpp': b'source-a.',
            'sources/b.hpp': b'updated-header-b.',
            'sources/b.cpp': b'source-b.',
            'sources/d.hpp': b'header-d.',
            'sources/d.cpp': b'source-d.',
            'objects/a.obj': b'header-a.source-a.',
            'objects/b.obj': b'updated-header-b.source-b.',
            'objects/d.obj': b'header-d.source-d.'
        }

        self.assertEqual(file_system.files,
                         {normpath(p): data
                          for p, data in new_files.items()})

        new_cache = {
            'sources/a.cpp':
            '8ceb2730683fdf075d4ede855d5ed98f32be31b093f74b0bee13fd5dea9037dc',
            'sources/b.cpp':
            'db4b8fea71a29aedd0eac30601ac3489bdc72a3261697215901cf04da2d6a931',
            'sources/d.cpp':
            'edf58f60231d34dfe3eb468e1b4cfeb35dd39cecd796183660cf13bf301f103b'
        }

        self.assertEqual(cache, new_cache)
Exemplo n.º 3
0
    def test_link_executable_using_cache_with_changed_external_library_interface(
            self):
        objects_root = 'objects/'
        executables_root = 'executables/'
        symbols_tables_root = 'symbols_tables/'
        external_libraries_root = 'external/libraries'
        external_libraries_interfaces_root = 'external/libraries_interfaces'
        file_system = FileSystemMock(
            {
                objects_root, executables_root, symbols_tables_root,
                external_libraries_root, external_libraries_interfaces_root
            }, {
                'objects/a.obj':
                b'object-a.',
                'external/libraries/b.dll':
                b'external-library-b.',
                'external/libraries_interfaces/c.lib':
                b'updated-external-library-interface-c.',
                'executables/my-executable.exe':
                b'object-a.external-library-b.external-library-interface-c.exe',
                'symbols_tables/my-executable.pdb':
                b'object-a.external-library-b.external-library-interface-c.pbd'
            })
        compiler = CompilerMock(file_system)
        objects = ['objects/a.obj']
        external_libraries = ['external/libraries/b.dll']
        external_libraries_interfaces = ['external/libraries_interfaces/c.lib']
        name = 'my-executable'
        cache = {
            'input': {
                'objects/a.obj':
                'a6cc476fe402432f09d3e66d73b6382421ee1a855ac6bde79357fc1483878463',
                'external/libraries/b.dll':
                '440602105d9abfce75656e19197e74539add8cb0dd002f4a550d46d7e8c1e837',
                'external/libraries_interfaces/c.lib':
                '8c777213d1130643127d77653c90f5d6784f6f95dac361afb454a3e6db084f4e'
            },
            'output': ('executables/my-executable.exe',
                       'symbols_tables/my-executable.pdb')
        }

        executable, symbols_table = link_executable_using_cache(
            file_system, compiler, executables_root, symbols_tables_root,
            external_libraries_root, external_libraries_interfaces_root,
            objects, external_libraries, external_libraries_interfaces,
            organization, artifact, version, cache)

        self.assertEqual(
            executable,
            'executables/org-art-x32-windows-compmock-debug-1.0.0.exe')

        self.assertEqual(
            symbols_table,
            'symbols_tables/org-art-x32-windows-compmock-debug-1.0.0.pdb')

        new_files = {
            'objects/a.obj':
            b'object-a.',
            'external/libraries/b.dll':
            b'external-library-b.',
            'external/libraries_interfaces/c.lib':
            b'updated-external-library-interface-c.',
            'executables/org-art-x32-windows-compmock-debug-1.0.0.exe':
            b'object-a.external-library-b.updated-external-library-interface-c.exe',
            'symbols_tables/org-art-x32-windows-compmock-debug-1.0.0.pdb':
            b'object-a.external-library-b.updated-external-library-interface-c.pbd'
        }

        self.assertEqual(file_system.files,
                         {normpath(p): data
                          for p, data in new_files.items()})

        new_cache = {
            'input': {
                'objects/a.obj':
                'a6cc476fe402432f09d3e66d73b6382421ee1a855ac6bde79357fc1483878463',
                'external/libraries/b.dll':
                '440602105d9abfce75656e19197e74539add8cb0dd002f4a550d46d7e8c1e837',
                'external/libraries_interfaces/c.lib':
                '4655380785da55ddee626b49e92bf336911a4f8ea828b1693ecbf1d12714d8f8'
            },
            'output':
            ('executables/org-art-x32-windows-compmock-debug-1.0.0.exe',
             'symbols_tables/org-art-x32-windows-compmock-debug-1.0.0.pdb')
        }

        self.assertEqual(cache, new_cache)
Exemplo n.º 4
0
    def test_load_pralinefile_stage_with_no_matching_compiler(self):
        file_system = FileSystemMock({working_directory}, pralinefile, working_directory=working_directory)

        resources = {}

        self.assertRaises(NoMatchingCompilerFoundError, load_pralinefile, file_system, resources, None, program_arguments, None, None)
Exemplo n.º 5
0
    def test_key_retrieval_with_fresh_cache(self):
        file_name = 'my/file'
        file_system = FileSystemMock()

        with Cache(file_system, file_name) as cache:
            self.assertRaises(KeyError, cache.__getitem__, 'myKey')
Exemplo n.º 6
0
    def test_load_pralinefile_stage_with_invalid_architecture(self):
        file_system = FileSystemMock({working_directory}, pralinefile, working_directory=working_directory, architecture='cheese', on_which=gcc_which)

        resources = {}

        self.assertRaises(UnsupportedArchitectureError, load_pralinefile, file_system, resources, None, program_arguments, None, None)
Exemplo n.º 7
0
    def test_load_pralinefile_stage_with_invalid_platform(self):
        file_system = FileSystemMock({working_directory}, pralinefile, working_directory=working_directory, platform='cake', on_which=gcc_which)

        resources = {}

        self.assertRaises(UnsupportedPlatformError, load_pralinefile, file_system, resources, None, program_arguments, None, None)
Exemplo n.º 8
0
    def test_pull_dependencies(self):
        pralinefile = b"""\
            organization: fruit
            artifact: banana
            version: 1.0.0
            dependencies:
            - organization: fruit
              artifact: apple
              version: 1.0.0
            """

        file_system = FileSystemMock(
            {
                'project/target/external/headers/fruit/grapes',
                'project/target/external/headers/fruit/waterlemon',
                'project/target/external/headers/fruit/raspberry',
                'project/target/external/libraries',
                'project/target/external/packages'
            }, {
                'project/target/external/headers/fruit/grapes/grapes.hpp':
                b'fruit-grapes-hpp',
                'project/target/external/headers/fruit/waterlemon/waterlemon.hpp':
                b'fruit-waterlemon-hpp',
                'project/target/external/headers/fruit/raspberry/raspberry.hpp':
                b'fruit-raspberry-hpp',
                'project/target/external/libraries/libfruit-grapes-x64-darwin-clang-release-1.0.0.dylib':
                b'fruit-grapes-dylib',
                'project/target/external/libraries/libfruit-waterlemon-x64-darwin-clang-release-1.0.0.dylib':
                b'fruit-waterlemon-dylib',
                'project/target/external/libraries/libfruit-raspberry-x64-darwin-clang-release-1.0.0.dylib':
                b'fruit-raspberry-dylib',
                'project/target/external/packages/fruit-grapes-x64-darwin-clang-release-1.0.0.tar.gz':
                pickle.dumps({
                    'headers/fruit/grapes/grapes.hpp':
                    b'fruit-grapes-hpp',
                    'libraries/libfruit-grapes-x64-darwin-clang-release-1.0.0.dylib':
                    b'fruit-grapes-dylib'
                }),
                'project/target/external/packages/fruit-waterlemon-x64-darwin-clang-release-1.0.0.tar.gz':
                pickle.dumps({
                    'headers/fruit/waterlemon/waterlemon.hpp':
                    b'fruit-waterlemon-hpp',
                    'libraries/libfruit-waterlemon-x64-darwin-clang-release-1.0.0.dylib':
                    b'fruit-waterlemon-dylib'
                }),
                'project/target/external/packages/fruit-raspberry-x64-darwin-clang-release-1.0.0.tar.gz':
                pickle.dumps({
                    'headers/fruit/raspberry/raspberry.hpp':
                    b'fruit-raspberry-hpp',
                    'libraries/libfruit-raspberry-x64-darwin-clang-release-1.0.0.dylib':
                    b'fruit-raspberry-dylib'
                })
            })

        resources = {
            'project_directory': 'project',
            'pralinefile': pralinefile,
            'architecture': 'x64',
            'platform': 'darwin',
            'mode': 'release',
            'compiler': CompilerMock()
        }

        cache = {
            'fruit-grapes-x64-darwin-clang-release-1.0.0.tar.gz':
            'grapes-hash',
            'fruit-waterlemon-x64-darwin-clang-release-1.0.0.tar.gz':
            'waterlemon-hash',
            'fruit-raspberry-x64-darwin-clang-release-1.0.0.tar.gz':
            'raspberry-hash'
        }

        program_arguments = {'global': {'logging_level': 4}}

        remote_proxy = RemoteProxyMock(file_system)

        pull_dependencies(file_system, resources, cache, program_arguments,
                          None, remote_proxy)

        expected_files = {
            'project/target/external/headers/fruit/apple/apple.hpp':
            b'fruit-apple-hpp',
            'project/target/external/headers/fruit/grapes/grapes.hpp':
            b'new-fruit-grapes-hpp',
            'project/target/external/headers/fruit/waterlemon/waterlemon.hpp':
            b'fruit-waterlemon-hpp',
            'project/target/external/libraries/libfruit-apple-x64-darwin-clang-release-1.0.0.dylib':
            b'fruit-apple-dylib',
            'project/target/external/libraries/libfruit-grapes-x64-darwin-clang-release-1.0.0.dylib':
            b'new-fruit-grapes-dylib',
            'project/target/external/libraries/libfruit-waterlemon-x64-darwin-clang-release-1.0.0.dylib':
            b'fruit-waterlemon-dylib',
            'project/target/external/packages/fruit-apple-x64-darwin-clang-release-1.0.0.tar.gz':
            pickle.dumps({
                'headers/fruit/apple/apple.hpp':
                b'fruit-apple-hpp',
                'libraries/libfruit-apple-x64-darwin-clang-release-1.0.0.dylib':
                b'fruit-apple-dylib'
            }),
            'project/target/external/packages/fruit-grapes-x64-darwin-clang-release-1.0.0.tar.gz':
            pickle.dumps({
                'headers/fruit/grapes/grapes.hpp':
                b'new-fruit-grapes-hpp',
                'libraries/libfruit-grapes-x64-darwin-clang-release-1.0.0.dylib':
                b'new-fruit-grapes-dylib'
            }),
            'project/target/external/packages/fruit-waterlemon-x64-darwin-clang-release-1.0.0.tar.gz':
            pickle.dumps({
                'headers/fruit/waterlemon/waterlemon.hpp':
                b'fruit-waterlemon-hpp',
                'libraries/libfruit-waterlemon-x64-darwin-clang-release-1.0.0.dylib':
                b'fruit-waterlemon-dylib'
            })
        }

        self.assertEqual(file_system.files,
                         {normpath(p): d
                          for p, d in expected_files.items()})

        expected_directories = {
            'project/target/external/packages',
            'project/target/external/resources',
            'project/target/external/headers/fruit/apple',
            'project/target/external/headers/fruit/grapes',
            'project/target/external/headers/fruit/waterlemon',
            'project/target/external/libraries',
            'project/target/external/libraries_interfaces',
            'project/target/external/symbols_tables',
            'project/target/external/executables'
        }

        self.assertEqual(file_system.directories,
                         {normpath(p)
                          for p in expected_directories})

        self.assertEqual(resources['external_resources_root'],
                         normpath('project/target/external/resources'))

        self.assertEqual(resources['external_headers_root'],
                         normpath('project/target/external/headers'))

        self.assertEqual(resources['external_libraries_root'],
                         normpath('project/target/external/libraries'))

        self.assertEqual(
            resources['external_libraries_interfaces_root'],
            normpath('project/target/external/libraries_interfaces'))

        self.assertEqual(resources['external_symbols_tables_root'],
                         normpath('project/target/external/symbols_tables'))

        self.assertEqual(resources['external_executables_root'],
                         normpath('project/target/external/executables'))

        self.assertEqual(resources['external_resources'], [])

        expected_headers = {
            'project/target/external/headers/fruit/apple/apple.hpp',
            'project/target/external/headers/fruit/grapes/grapes.hpp',
            'project/target/external/headers/fruit/waterlemon/waterlemon.hpp'
        }

        self.assertEqual({normpath(p)
                          for p in resources['external_headers']},
                         {normpath(p)
                          for p in expected_headers})

        expected_libraries = {
            'project/target/external/libraries/libfruit-apple-x64-darwin-clang-release-1.0.0.dylib',
            'project/target/external/libraries/libfruit-grapes-x64-darwin-clang-release-1.0.0.dylib',
            'project/target/external/libraries/libfruit-waterlemon-x64-darwin-clang-release-1.0.0.dylib'
        }

        self.assertEqual(
            {normpath(p)
             for p in resources['external_libraries']},
            {normpath(p)
             for p in expected_libraries})

        self.assertEqual(resources['external_libraries_interfaces'], [])

        self.assertEqual(resources['external_symbols_tables'], [])

        self.assertEqual(resources['external_executables'], [])
Exemplo n.º 9
0
    def test_load_pralinefile_stage_without_pralinefile(self):
        file_system = FileSystemMock({working_directory}, working_directory=working_directory, on_which=gcc_which)

        resources = {}

        self.assertRaises(FileNotFoundError, load_pralinefile, file_system, resources, None, program_arguments, None, None)
Exemplo n.º 10
0
    def test_get_package_dependencies_recursively(self):
        chocolate_archive = pickle.dumps({
            'Pralinefile':
            b"""\
            organization: candyorg
            artifact: chocolate
            version: 1.0.0
            dependencies:
            - organization: candyorg
              artifact: popsicle
              version: 1.+0.+0
            - organization: testorg
              artifact: testing
              version: 2.5.0
              scope: test
            """
        })

        chocolate_package = 'candyorg-chocolate-x32-windows-msvc-debug-1.0.0.tar.gz'

        chocolate_dependencies = [
            'candyorg-popsicle-x32-windows-msvc-debug-1.+0.+0.tar.gz',
            'testorg-testing-x32-windows-msvc-debug-2.5.0.tar.gz'
        ]

        popsicle_1_0_0_archive = pickle.dumps({
            'Pralinefile':
            b"""\
            organization: candyorg
            artifact: popsicle
            version: 1.0.0
            """
        })

        popsicle_1_1_0_archive = pickle.dumps({
            'Pralinefile':
            b"""\
            organization: candyorg
            artifact: popsicle
            version: 1.1.0
            dependencies:
            - organization: candyorg
              artifact: icecream
              version: 1.0.0
            - organization: testorg
              artifact: testing
              version: 2.4.0
              scope: test
            """
        })

        icecream_archive = pickle.dumps({
            'Pralinefile':
            b"""\
            organization: candyorg
            artifact: popsicle
            version: 1.0.0
            dependencies:
            - organization: testorg
              artifact: testing
              version: 2.4.0
              scope: test
            """
        })

        testing_2_5_0_archive = pickle.dumps({
            'Pralinefile':
            b"""\
            organization: testorg
            artifact: testing
            version: 2.5.0
            """
        })

        testing_2_4_0_archive = pickle.dumps({
            'Pralinefile':
            b"""\
            organization: testorg
            artifact: testing
            version: 2.4.0
            """
        })

        repository = 'packages'
        file_system = FileSystemMock({repository}, {
            f'{repository}/candyorg-chocolate-x32-windows-msvc-debug-1.0.0.tar.gz':
            chocolate_archive,
            f'{repository}/candyorg-popsicle-x32-windows-msvc-debug-1.0.0.tar.gz':
            popsicle_1_0_0_archive,
            f'{repository}/candyorg-popsicle-x32-windows-msvc-debug-1.1.0.tar.gz':
            popsicle_1_1_0_archive,
            f'{repository}/candyorg-icecream-x32-windows-msvc-debug-1.0.0.tar.gz':
            icecream_archive,
            f'{repository}/testorg-testing-x32-windows-msvc-debug-2.5.0.tar.gz':
            testing_2_5_0_archive,
            f'{repository}/testorg-testing-x32-windows-msvc-debug-2.4.0.tar.gz':
            testing_2_4_0_archive
        })

        dependencies = get_package_dependencies_recursively(
            file_system, chocolate_package, chocolate_dependencies, repository)

        expected_dependencies = {
            'candyorg-popsicle-x32-windows-msvc-debug-1.1.0.tar.gz',
            'candyorg-icecream-x32-windows-msvc-debug-1.0.0.tar.gz',
            'testorg-testing-x32-windows-msvc-debug-2.5.0.tar.gz'
        }

        self.assertEqual(set(dependencies), expected_dependencies)
Exemplo n.º 11
0
    def test_clean_up_package(self):
        archive = pickle.dumps({
            'resources/org/art/app.config':
            b'app-config',
            'headers/org/art/inc.hpp':
            b'inc-hpp',
            'libraries/org-art-x32-windows-msvc-debug-1.0.0.dll':
            b'library-dll',
            'libraries_interfaces/org-art-x32-windows-msvc-debug-1.0.0.lib':
            b'library-interface-lib',
            'symbols_tables/org-art-x32-windows-msvc-debug-1.0.0.pdb':
            b'symbols-tables-pdb',
            'executables/org-art-x32-windows-msvc-debug-1.0.0.exe':
            b'executable-exe'
        })
        package_path = 'org-art-x32-windows-msvc-debug-1.0.0.tar.gz'
        file_system = FileSystemMock(
            {
                'external/resources/org/other_art',
                'external/resources/org/art', 'external/headers/org/art',
                'external/libraries', 'external/libraries_interfaces',
                'external/symbols_tables', 'external/executables'
            }, {
                package_path:
                archive,
                'external/resources/org/other_art/app.config':
                b'app-config',
                'external/resources/org/art/app.config':
                b'app-config',
                'external/headers/org/art/inc.hpp':
                b'inc-hpp',
                'external/libraries/org-art-x32-windows-msvc-debug-1.0.0.dll':
                b'library-dll',
                'external/libraries_interfaces/org-art-x32-windows-msvc-debug-1.0.0.lib':
                b'library-interface-lib',
                'external/symbols_tables/org-art-x32-windows-msvc-debug-1.0.0.pdb':
                b'symbols-tables-pdb',
                'external/executables/org-art-x32-windows-msvc-debug-1.0.0.exe':
                b'executable-exe'
            })
        extraction_path = 'external'

        logging_level = 4

        clean_up_package(file_system, package_path, extraction_path,
                         logging_level)

        expected_files = {
            'external/resources/org/other_art/app.config': b'app-config'
        }

        self.assertEqual(file_system.files,
                         {normpath(p): d
                          for p, d in expected_files.items()})

        expected_directories = {
            'external/resources/org/other_art', 'external/headers/org',
            'external/libraries', 'external/libraries_interfaces',
            'external/symbols_tables', 'external/executables'
        }

        self.assertEqual(file_system.directories,
                         {normpath(p)
                          for p in expected_directories})
Exemplo n.º 12
0
    def test_unpack(self):
        archive = pickle.dumps({
            'resources/org/art/app.config':
            b'app-config',
            'headers/org/art/inc.hpp':
            b'inc-hpp',
            'libraries/org-art-x32-windows-msvc-debug-1.0.0.dll':
            b'library-dll',
            'libraries_interfaces/org-art-x32-windows-msvc-debug-1.0.0.lib':
            b'library-interface-lib',
            'symbols_tables/org-art-x32-windows-msvc-debug-1.0.0.pdb':
            b'symbols-tables-pdb',
            'executables/org-art-x32-windows-msvc-debug-1.0.0.exe':
            b'executable-exe'
        })
        package_path = 'org-art-x32-windows-msvc-debug-1.0.0.tar.gz'
        extraction_path = 'external'
        file_system = FileSystemMock({extraction_path},
                                     {package_path: archive})

        contents = unpack(file_system, package_path, extraction_path)

        expected_contents = {
            'resources': ['external/resources/org/art/app.config'],
            'headers': ['external/headers/org/art/inc.hpp'],
            'libraries':
            ['external/libraries/org-art-x32-windows-msvc-debug-1.0.0.dll'],
            'libraries_interfaces': [
                'external/libraries_interfaces/org-art-x32-windows-msvc-debug-1.0.0.lib'
            ],
            'symbols_tables': [
                'external/symbols_tables/org-art-x32-windows-msvc-debug-1.0.0.pdb'
            ],
            'executables':
            ['external/executables/org-art-x32-windows-msvc-debug-1.0.0.exe']
        }

        self.assertEqual(
            {
                root: [normpath(p) for p in files]
                for root, files in contents.items()
            }, {
                root: [normpath(p) for p in files]
                for root, files in expected_contents.items()
            })

        expected_files = {
            'org-art-x32-windows-msvc-debug-1.0.0.tar.gz':
            archive,
            'external/resources/org/art/app.config':
            b'app-config',
            'external/headers/org/art/inc.hpp':
            b'inc-hpp',
            'external/libraries/org-art-x32-windows-msvc-debug-1.0.0.dll':
            b'library-dll',
            'external/libraries_interfaces/org-art-x32-windows-msvc-debug-1.0.0.lib':
            b'library-interface-lib',
            'external/symbols_tables/org-art-x32-windows-msvc-debug-1.0.0.pdb':
            b'symbols-tables-pdb',
            'external/executables/org-art-x32-windows-msvc-debug-1.0.0.exe':
            b'executable-exe'
        }

        self.assertEqual(file_system.files,
                         {normpath(p): d
                          for p, d in expected_files.items()})

        expected_directories = {
            'external/resources/org/art', 'external/headers/org/art',
            'external/libraries', 'external/libraries_interfaces',
            'external/symbols_tables', 'external/executables'
        }

        self.assertEqual(file_system.directories,
                         {normpath(p)
                          for p in expected_directories})
Exemplo n.º 13
0
    def test_invoke_stage(self):
        #
        #         [A]
        #        /   \
        #     [B]     [C, D]
        #      |      /|  |
        #     [E]<-[F][G][H]
        #
        def ai(f, r, c, a, cfg, rp):
            self.assertIsNone(c)
            self.assertEqual(r['c'], 'c_value')
            self.assertEqual(r['d'], 'd_value')
            self.assertEqual(len(a['byStage']), 0)
            r['a'] = 'a_value'

        def bi(f, r, c, a, cfg, rp):
            self.fail("stage B shouldn't be invoked")

        def ci(f, r, c, a, cfg, rp):
            self.assertIsNotNone(c)
            self.assertEqual(r['g'], 'g_value')
            self.assertEqual(a['byStage']['some-argument'], 'some_value')
            r['c'] = c['c'] = 'c_value'

        def di(f, r, c, a, cfg, rp):
            self.assertIsNotNone(c)
            self.assertEqual(r['h'], 'h_value')
            self.assertEqual(len(a['byStage']), 0)
            r['d'] = c['d'] = 'd_value'

        def ei(f, r, c, a, cfg, rp):
            self.fail("stage E shouldn't be invoked")

        def fi(f, r, c, a, cfg, rp):
            self.fail("stage F shouldn't be invoked")

        def gi(f, r, c, a, cfg, rp):
            self.assertIsNotNone(c)
            self.assertEqual(len(a['byStage']), 0)
            r['g'] = c['g'] = 'g_value'

        def hi(f, r, c, a, cfg, rp):
            self.assertIsNone(c)
            self.assertEqual(len(a['byStage']), 0)
            r['h'] = 'h_value'

        can_run = lambda _, __, ___: True
        cant_run = lambda _, __, ___: False
        stages = {
            'A':
            Stage('A', [['b'], ['c', 'd']], ['a'], can_run, [], False, False,
                  ai),
            'B':
            Stage('B', [['e']], ['b'], can_run, [], False, False, bi),
            'C':
            Stage('C', [['f'], ['g']], ['c'], can_run, [], True, True, ci),
            'D':
            Stage('D', [['h']], ['d'], can_run, [], True, False, di),
            'E':
            Stage('E', [[]], ['e'], cant_run, [], False, False, ei),
            'F':
            Stage('F', [['e']], ['f'], can_run, [], True, False, fi),
            'G':
            Stage('G', [[]], ['g'], can_run, [], True, False, gi),
            'H':
            Stage('H', [[]], ['h'], can_run, [], False, False, hi)
        }
        working_directory = 'my/project'
        file_system = FileSystemMock({working_directory},
                                     working_directory=working_directory)
        program_arguments = {
            'global': {},
            'byStage': {
                'C': {
                    'some-argument': 'some_value'
                }
            }
        }
        invoke_stage('A', stages, file_system, program_arguments, None, None)

        cache_path = normpath('my/project/target/cache.pickle')

        self.assertEqual(pickle.loads(file_system.files[cache_path]), {
            'C': {
                'c': 'c_value'
            },
            'D': {
                'd': 'd_value'
            },
            'G': {
                'g': 'g_value'
            }
        })
Exemplo n.º 14
0
    def test_format_main_sources(self):
        def on_execute(command, add_to_library_path):
            return (normpath('project/sources/org/art/math.cpp') in command
                    and normpath('project/sources/org/art/vector.cpp')
                    not in command
                    and normpath('project/sources/org/art/map.cpp') in command
                    and normpath('project/sources/org/art/request.cpp')
                    not in command)

        file_system = FileSystemMock(
            {'project/sources/org/art'}, {
                'project/sources/org/art/math.cpp': b'math-contents',
                'project/sources/org/art/vector.cpp': b'vector-contents',
                'project/sources/org/art/map.cpp': b'map-contents'
            },
            on_execute=on_execute)

        clang_format_executable = 'path/to/clang-format'

        resources = {
            'clang_format_executable': clang_format_executable,
            'main_sources': file_system.files.keys(),
            'main_executable_source': None
        }

        cache = {
            normpath(p): d
            for p, d in {
                'project/sources/org/art/vector.cpp':
                '2d5b04a0069bfadaadbce424db26c7a66c13afa3c621326ab0f1303c6a20ad82',
                'project/sources/org/art/map.cpp': 'stale',
                'project/sources/org/art/request.cpp': 'stale'
            }.items()
        }

        format_main_sources(file_system, resources, cache, None, None, None)

        expected_formatted_main_sources = {
            'project/sources/org/art/math.cpp',
            'project/sources/org/art/vector.cpp',
            'project/sources/org/art/map.cpp'
        }

        self.assertEqual(
            {normpath(p)
             for p in resources['formatted_main_sources']},
            {normpath(p)
             for p in expected_formatted_main_sources})

        self.assertIsNone(resources['formatted_main_executable_source'])

        expected_cache = {
            'project/sources/org/art/math.cpp':
            '38527a9ac8d06095ec3a63b5409cdf92888fd8ee721a38628b7c83765f52e182',
            'project/sources/org/art/vector.cpp':
            '2d5b04a0069bfadaadbce424db26c7a66c13afa3c621326ab0f1303c6a20ad82',
            'project/sources/org/art/map.cpp':
            'e886d8d60c513bebdc21c4fe27f14797be5a41471d25af89c087f8db7f98e3ec'
        }

        self.assertEqual(cache,
                         {normpath(p): d
                          for p, d in expected_cache.items()})