def test_warn_if_not_including_local_deb(self):
        package_name = "foo"
        local_name = "bar"
        maker = PackageMaker()
        self.useFixture(ContextManagerFixture(maker))
        remote_package = DummyFetchedPackage(package_name, "1.1")
        local_path = maker.make_package(local_name, "1.0", {})
        sources_dict = self.sourcesDictForPackages([remote_package])
        metadata, config = self.makeMetaDataAndConfigFixture(
            [package_name], sources_dict,
            extra_config={'assume-installed': local_name})
        builder = HardwarePackBuilder(
            config.filename, metadata.version, [local_path])

        handler = AppendingHandler()
        builder_logger.addHandler(handler)
        self.addCleanup(builder_logger.removeHandler, handler)

        builder.build()
        self.assertThat(
            "hwpack_%s_%s_%s.tar.gz" % (
                metadata.name, metadata.version, metadata.architecture),
            IsHardwarePack(
                metadata, [remote_package],
                sources_dict,
                package_spec=package_name))
        self.assertThat(
            handler.messages,
            EachOf([MatchesStructure(levelname=Equals('WARNING'))]))
        self.assertThat(
            handler.messages[0].getMessage(),
            Equals("Local package 'bar' not included"))
    def test_warn_if_not_including_local_deb(self):
        package_name = "foo"
        local_name = "bar"
        maker = PackageMaker()
        self.useFixture(ContextManagerFixture(maker))
        remote_package = DummyFetchedPackage(package_name, "1.1")
        local_path = maker.make_package(local_name, "1.0", {})
        sources_dict = self.sourcesDictForPackages([remote_package])
        metadata, config = self.makeMetaDataAndConfigFixture(
            [package_name],
            sources_dict,
            extra_config={'assume-installed': local_name})
        builder = HardwarePackBuilder(config.filename, metadata.version,
                                      [local_path])

        handler = AppendingHandler()
        builder_logger.addHandler(handler)
        self.addCleanup(builder_logger.removeHandler, handler)

        builder.build()
        self.assertThat(
            "hwpack_%s_%s_%s.tar.gz" %
            (metadata.name, metadata.version, metadata.architecture),
            IsHardwarePack(metadata, [remote_package],
                           sources_dict,
                           package_spec=package_name))
        self.assertThat(
            handler.messages,
            EachOf([MatchesStructure(levelname=Equals('WARNING'))]))
        self.assertThat(handler.messages[0].getMessage(),
                        Equals("Local package 'bar' not included"))
 def test_includes_local_debs(self):
     package_name = "foo"
     maker = PackageMaker()
     self.useFixture(ContextManagerFixture(maker))
     local_path = maker.make_package(package_name, "1.2", {})
     available_package = FetchedPackage.from_deb(local_path)
     sources_dict = self.sourcesDictForPackages([])
     metadata, config = self.makeMetaDataAndConfigFixture([package_name],
                                                          sources_dict)
     builder = HardwarePackBuilder(config.filename, metadata.version,
                                   [local_path])
     builder.build()
     self.assertThat(
         "hwpack_%s_%s_%s.tar.gz" %
         (metadata.name, metadata.version, metadata.architecture),
         IsHardwarePack(metadata, [available_package],
                        sources_dict,
                        package_spec=package_name))
 def test_includes_local_debs(self):
     package_name = "foo"
     maker = PackageMaker()
     self.useFixture(ContextManagerFixture(maker))
     local_path = maker.make_package(package_name, "1.2", {})
     available_package = FetchedPackage.from_deb(local_path)
     sources_dict = self.sourcesDictForPackages([])
     metadata, config = self.makeMetaDataAndConfigFixture(
         [package_name], sources_dict)
     builder = HardwarePackBuilder(
         config.filename, metadata.version, [local_path])
     builder.build()
     self.assertThat(
         "hwpack_%s_%s_%s.tar.gz" % (
             metadata.name, metadata.version, metadata.architecture),
         IsHardwarePack(
             metadata, [available_package],
             sources_dict,
             package_spec=package_name))
 def test_prefers_local_debs(self):
     package_name = "foo"
     maker = PackageMaker()
     self.useFixture(ContextManagerFixture(maker))
     # The point here is that remote_package has a later version than
     # local_package, but local_package is still preferred.
     remote_package = DummyFetchedPackage(package_name, "1.1")
     local_path = maker.make_package(package_name, "1.0", {})
     local_package = FetchedPackage.from_deb(local_path)
     sources_dict = self.sourcesDictForPackages([remote_package])
     metadata, config = self.makeMetaDataAndConfigFixture([package_name],
                                                          sources_dict)
     builder = HardwarePackBuilder(config.filename, metadata.version,
                                   [local_path])
     builder.build()
     self.assertThat(
         "hwpack_%s_%s_%s.tar.gz" %
         (metadata.name, metadata.version, metadata.architecture),
         IsHardwarePack(metadata, [local_package],
                        sources_dict,
                        package_spec=package_name))
 def test_prefers_local_debs(self):
     package_name = "foo"
     maker = PackageMaker()
     self.useFixture(ContextManagerFixture(maker))
     # The point here is that remote_package has a later version than
     # local_package, but local_package is still preferred.
     remote_package = DummyFetchedPackage(package_name, "1.1")
     local_path = maker.make_package(package_name, "1.0", {})
     local_package = FetchedPackage.from_deb(local_path)
     sources_dict = self.sourcesDictForPackages([remote_package])
     metadata, config = self.makeMetaDataAndConfigFixture(
         [package_name], sources_dict)
     builder = HardwarePackBuilder(
         config.filename, metadata.version, [local_path])
     builder.build()
     self.assertThat(
         "hwpack_%s_%s_%s.tar.gz" % (
             metadata.name, metadata.version, metadata.architecture),
         IsHardwarePack(
             metadata, [local_package],
             sources_dict,
             package_spec=package_name))
    def add_dependency_package(self, packages_spec):
        """Add a packge that depends on packages_spec to the hardware pack.

        :param packages_spec: A list of apt package specifications,
            e.g. ``['foo', 'bar (>= 1.2)']``.
        """
        with PackageMaker() as maker:
            dep_package_name = 'hwpack-' + self.metadata.name
            relationships = {}
            if packages_spec:
                relationships = {'Depends': ', '.join(packages_spec)}
            deb_file_path = maker.make_package(
                dep_package_name, self.metadata.version,
                relationships, self.metadata.architecture)
            self.packages.append(FetchedPackage.from_deb(deb_file_path))
    def test_global_and_board_bootloader(self):
        package_names = ['package0', 'package1', 'package2', 'package3']
        files = {
            package_names[0]:
            ["usr/lib/u-boot/omap4_panda/u-boot.img",
             "usr/share/doc/u-boot-linaro-omap4-panda/copyright"],
            package_names[1]:
            ["usr/lib/u-boot/omap4_panda/u-boot.img",
             "some/path/file"],
            package_names[2]: [],
            package_names[3]: [],
        }

        config_v3 = self.config_v3 + "\n".join([
            "bootloaders:",
            " u_boot:",
            self.bootloader_config,
            "  file: " + files[package_names[0]][0],
            "  copy_files:",
            "    " + package_names[2] + ":",
            "      - some_file",
            "boards:",
            " board1:",
            "  bootloaders:",
            "   u_boot:",
            "    package: %s",
            "    file: " + files[package_names[1]][0],
            "    copy_files:",
            "      " + package_names[3] + ":",
            "       - some_file",
            "    in_boot_part: true",
            "sources:",
            " ubuntu: %s"])

        # Generate some test packages
        available_packages = []
        maker = PackageMaker()
        self.useFixture(ContextManagerFixture(maker))

        for package_name in package_names:
            # The files parameter to make_package is a list of files to create.
            # These files are text files containing package_name and their
            # path. Since package_name is different for each package, this
            # gives each file a unique content.
            deb_file_path = maker.make_package(package_name, '1.0', {},
                                               files=files[package_name])
            dummy_package = DummyFetchedPackage(
                package_name, "1.0", content=open(deb_file_path).read())
            available_packages.append(dummy_package)

        source = self.useFixture(AptSourceFixture(available_packages))

        # Generate a V3 config
        config_v3 = config_v3 % (package_names[0], package_names[1],
                                 package_names[0], "True",
                                 package_names[1],
                                 source.sources_entry)

        config_file_fixture = self.useFixture(ConfigFileFixture(config_v3))

        # Build a hardware pack
        builder = HardwarePackBuilder(
            config_file_fixture.filename, "1.0",
            [os.path.join(source.rootdir, package.filepath)
             for package in available_packages])

        builder.build()
        stored_package_names = [p.name for p in builder.packages]
        for package_name in package_names:
            self.assertIn(package_name, stored_package_names)

        # Read the contents of the hardware pack, making sure it is as expected
        tf = tarfile.open("hwpack_ahwpack_1.0_armel.tar.gz", mode="r:gz")

        # We check the content of each file when content != None. For our test
        # files this is "<package_name> <originating path>" so they can be
        # uniquely identified.
        expected_files = [
            ("u_boot/" + files[package_names[0]][0],
             package_names[0] + " " + files[package_names[0]][0]),
            ("board1/u_boot/" + files[package_names[1]][0],
             package_names[1] + " " + files[package_names[1]][0])]

        for expected_file, contents in expected_files:
            self.assertThat(
                tf, TarfileHasFile(expected_file, content=contents))
    def test_global_and_board_bootloader(self):
        package_names = ['package0', 'package1', 'package2', 'package3']
        files = {
            package_names[0]: [
                "usr/lib/u-boot/omap4_panda/u-boot.img",
                "usr/share/doc/u-boot-linaro-omap4-panda/copyright"
            ],
            package_names[1]:
            ["usr/lib/u-boot/omap4_panda/u-boot.img", "some/path/file"],
            package_names[2]: [],
            package_names[3]: [],
        }

        config_v3 = self.config_v3 + "\n".join([
            "bootloaders:", " u_boot:", self.bootloader_config,
            "  file: " + files[package_names[0]][0], "  copy_files:",
            "    " + package_names[2] + ":", "      - some_file", "boards:",
            " board1:", "  bootloaders:", "   u_boot:", "    package: %s",
            "    file: " + files[package_names[1]][0], "    copy_files:",
            "      " + package_names[3] + ":", "       - some_file",
            "    in_boot_part: true", "sources:", " ubuntu: %s"
        ])

        # Generate some test packages
        available_packages = []
        maker = PackageMaker()
        self.useFixture(ContextManagerFixture(maker))

        for package_name in package_names:
            # The files parameter to make_package is a list of files to create.
            # These files are text files containing package_name and their
            # path. Since package_name is different for each package, this
            # gives each file a unique content.
            deb_file_path = maker.make_package(package_name,
                                               '1.0', {},
                                               files=files[package_name])
            dummy_package = DummyFetchedPackage(
                package_name, "1.0", content=open(deb_file_path).read())
            available_packages.append(dummy_package)

        source = self.useFixture(AptSourceFixture(available_packages))

        # Generate a V3 config
        config_v3 = config_v3 % (package_names[0], package_names[1],
                                 package_names[0], "True", package_names[1],
                                 source.sources_entry)

        config_file_fixture = self.useFixture(ConfigFileFixture(config_v3))

        # Build a hardware pack
        builder = HardwarePackBuilder(config_file_fixture.filename, "1.0", [
            os.path.join(source.rootdir, package.filepath)
            for package in available_packages
        ])

        builder.build()
        stored_package_names = [p.name for p in builder.packages]
        for package_name in package_names:
            self.assertIn(package_name, stored_package_names)

        # Read the contents of the hardware pack, making sure it is as expected
        tf = tarfile.open("hwpack_ahwpack_1.0_armel.tar.gz", mode="r:gz")

        # We check the content of each file when content != None. For our test
        # files this is "<package_name> <originating path>" so they can be
        # uniquely identified.
        expected_files = [
            ("u_boot/" + files[package_names[0]][0],
             package_names[0] + " " + files[package_names[0]][0]),
            ("board1/u_boot/" + files[package_names[1]][0],
             package_names[1] + " " + files[package_names[1]][0])
        ]

        for expected_file, contents in expected_files:
            self.assertThat(tf, TarfileHasFile(expected_file,
                                               content=contents))