Exemple #1
0
    def test_multiple_build_policy(self):
        ci_manager = MockCIManager()
        conanfile = """from conans import ConanFile
import os

class Pkg(ConanFile):
    name = "lib"
    version = "1.2"
    settings = "os", "compiler", "build_type", "arch"

"""
        self.save_conanfile(conanfile)
        with tools.environment_append({"CONAN_USERNAME": "******"}):
            self.packager = ConanMultiPackager(channel="mychannel",
                                               gcc_versions=["6"],
                                               visual_versions=["12"],
                                               archs=["x86", "x86_64"],
                                               build_types=["Release"],
                                               build_policy=["cascade", "outdated"],
                                               ci_manager=ci_manager)
            self.packager.add_common_builds()
            self.packager.run()

        with tools.environment_append({"CONAN_USERNAME": "******",
                                       "CONAN_BUILD_POLICY": "outdated, lib"}):
            self.packager = ConanMultiPackager(channel="mychannel",
                                               gcc_versions=["6"],
                                               visual_versions=["12"],
                                               archs=["x86", "x86_64"],
                                               build_types=["Release"],
                                               ci_manager=ci_manager)
            self.packager.add_common_builds()
            self.packager.run()
Exemple #2
0
 def setUp(self):
     for var in ["CONAN_USERNAME", "CONAN_CHANNEL", "CONAN_REFERENCE"]:
         try:
             del os.environ[var]
         except:
             pass
     self._ci_manager = MockCIManager()
 def setUp(self):
     self.runner = MockRunner()
     self.conan_api = MockConanAPI()
     self.ci_manager = MockCIManager()
     self.packager = ConanMultiPackager(username="******",
                                        channel="mychannel",
                                        runner=self.runner,
                                        conan_api=self.conan_api,
                                        reference="lib/1.0",
                                        ci_manager=self.ci_manager)
     if "APPVEYOR" in os.environ:
         del os.environ["APPVEYOR"]
     if "TRAVIS" in os.environ:
         del os.environ["TRAVIS"]
 def setUp(self):
     self._ci_manager = MockCIManager()
     self._server = TestServer(users={"user": "******"},
                               write_permissions=[
                                   ("bar/0.1.0@foo/stable", "user"),
                                   ("foo/1.0.0@bar/testing", "user")
                               ])
     self._client = TestClient(servers={"default": self._server},
                               users={"default": [("user", "password")]})
     self._client.save({"conanfile_bar.py": self.conanfile_bar})
     self._client.run("export conanfile_bar.py foo/stable")
     self._client.save({"conanfile_foo.py": self.conanfile_foo})
     self._client.run("export conanfile_foo.py bar/testing")
     self._client.save({"conanfile.py": self.conanfile})
 def setUp(self):
     self.runner = MockRunner()
     self.conan_api = MockConanAPI()
     self.ci_manager = MockCIManager()
     self.packager = ConanMultiPackager(["--build missing", "-r conan.io"],
                                        "lasote", "mychannel",
                                        runner=self.runner,
                                        conan_api=self.conan_api,
                                        reference="lib/1.0",
                                        ci_manager=self.ci_manager)
     if "APPVEYOR" in os.environ:
         del os.environ["APPVEYOR"]
     if "TRAVIS" in os.environ:
         del os.environ["TRAVIS"]
    def channel_detector_test(self):

        for branch, expected_channel in [("testing", "a_channel"),
                                         ("dummy", "a_channel"),
                                         ("stable", "stable"),
                                         ("stable/something", "stable"),
                                         ("release", "stable"),
                                         ("release/something", "stable"),
                                         ("master", "stable"),
                                         ("master/something", "a_channel")]:
            builder = ConanMultiPackager(username="******",
                                         channel="a_channel",
                                         reference="lib/1.0",
                                         ci_manager=MockCIManager(current_branch=branch))

            self.assertEquals(builder.channel, expected_channel, "Not match for branch %s" % branch)
Exemple #7
0
    def test_exported_files(self):
        conanfile = """from conans import ConanFile

class Pkg(ConanFile):
    name = "lib"
    version = "1.0"
    settings = "os"
    exports = "*"
    exports_sources = "source*"

"""
        ci_manager = MockCIManager()
        self.save_conanfile(conanfile)
        tools.save(os.path.join(self.tmp_folder, "other_file"),
                   "Dummy contents")
        tools.save(os.path.join(self.tmp_folder, "source.cpp"),
                   "Dummy contents")
        self.packager = ConanMultiPackager(username="******",
                                           reference="lib/1.0",
                                           ci_manager=ci_manager)
        self.packager.add({}, {}, {}, {})
        self.packager.run()

        pf = self.client_cache.export(
            ConanFileReference.loads("lib/1.0@lasote/testing"))
        found_in_export = False
        for exported in os.listdir(pf):
            if "other_file" == exported:
                found_in_export = True
                break

        self.assertTrue(found_in_export)

        pf = self.client_cache.export_sources(
            ConanFileReference.loads("lib/1.0@lasote/testing"))
        found_in_export_sources = False
        for exported in os.listdir(pf):
            if "source.cpp" == exported:
                found_in_export_sources = True
                break

        self.assertTrue(found_in_export_sources)
Exemple #8
0
    def test_docker(self):
        client_version = get_client_version()
        ci_manager = MockCIManager()
        unique_ref = "zlib/%s" % str(time.time())
        conanfile = textwrap.dedent("""
                from conans import ConanFile
                import os

                class Pkg(ConanFile):
                    settings = "os", "compiler", "build_type", "arch"
            """)

        self.save_conanfile(conanfile)
        with tools.environment_append({
                "CONAN_DOCKER_RUN_OPTIONS":
                "--network=host -v{}:/tmp/cpt".format(
                    self.root_project_folder),
                "CONAN_DOCKER_ENTRY_SCRIPT":
                "pip install -U /tmp/cpt",
                "CONAN_USE_DOCKER":
                "1",
                "CONAN_DOCKER_IMAGE_SKIP_UPDATE":
                "TRUE",
                "CONAN_LOGIN_USERNAME":
                "******",
                "CONAN_USERNAME":
                "******",
                "CONAN_UPLOAD":
                DockerTest.CONAN_SERVER_ADDRESS,
                "CONAN_PASSWORD":
                "******"
        }):

            self.packager = ConanMultiPackager(channel="mychannel",
                                               gcc_versions=["8"],
                                               archs=["x86", "x86_64"],
                                               build_types=["Release"],
                                               reference=unique_ref,
                                               ci_manager=ci_manager)
            self.packager.add_common_builds()
            self.packager.run()

        search_pattern = "%s*" % unique_ref
        ref = ConanFileReference.loads("%s@demo/mychannel" % unique_ref)

        # Remove from remote
        if Version(client_version) < Version("1.7"):
            results = self.api.search_recipes(
                search_pattern, remote="upload_repo")["results"][0]["items"]
            self.assertEquals(len(results), 1)
            packages = self.api.search_packages(
                ref,
                remote="upload_repo")["results"][0]["items"][0]["packages"]
            self.assertEquals(len(packages), 2)
            self.api.authenticate(name=CONAN_LOGIN_UPLOAD,
                                  password=CONAN_UPLOAD_PASSWORD,
                                  remote="upload_repo")
            self.api.remove(search_pattern, remote="upload_repo", force=True)
            self.assertEquals(
                self.api.search_recipes(search_pattern)["results"], [])
        else:
            results = self.api.search_recipes(
                search_pattern,
                remote_name="upload_repo")["results"][0]["items"]
            self.assertEquals(len(results), 1)
            if Version(client_version) >= Version("1.12.0"):
                ref = repr(ref)
            packages = self.api.search_packages(
                ref, remote_name="upload_repo"
            )["results"][0]["items"][0]["packages"]
            self.assertEquals(len(packages), 2)
            self.api.authenticate(name="demo",
                                  password="******",
                                  remote_name="upload_repo")
            self.api.remove(search_pattern,
                            remote_name="upload_repo",
                            force=True)
            self.assertEquals(
                self.api.search_recipes(search_pattern)["results"], [])

        # Try upload only when stable, shouldn't upload anything
        with tools.environment_append({
                "CONAN_DOCKER_RUN_OPTIONS":
                "--network=host -v{}:/tmp/cpt".format(
                    self.root_project_folder),
                "CONAN_DOCKER_ENTRY_SCRIPT":
                "pip install -U /tmp/cpt",
                "CONAN_USE_DOCKER":
                "1",
                "CONAN_LOGIN_USERNAME":
                "******",
                "CONAN_USERNAME":
                "******",
                "CONAN_PASSWORD":
                "******",
                "CONAN_DOCKER_IMAGE_SKIP_UPDATE":
                "TRUE",
                "CONAN_UPLOAD_ONLY_WHEN_STABLE":
                "1"
        }):
            self.packager = ConanMultiPackager(
                channel="mychannel",
                gcc_versions=["8"],
                archs=["x86", "x86_64"],
                build_types=["Release"],
                reference=unique_ref,
                upload=DockerTest.CONAN_SERVER_ADDRESS,
                ci_manager=ci_manager)
            self.packager.add_common_builds()
            self.packager.run()

        if Version(client_version) < Version("1.7"):
            results = self.api.search_recipes(search_pattern,
                                              remote="upload_repo")["results"]
            self.assertEquals(len(results), 0)
            self.api.remove(search_pattern, remote="upload_repo", force=True)
        else:
            results = self.api.search_recipes(
                search_pattern, remote_name="upload_repo")["results"]
            self.assertEquals(len(results), 0)
            self.api.remove(search_pattern,
                            remote_name="upload_repo",
                            force=True)
    def test_docker(self):
        if not os.getenv("PYPI_PASSWORD", None):
            return
        self.deploy_pip()
        ci_manager = MockCIManager()
        unique_ref = "zlib/%s" % str(time.time())
        conanfile = """from conans import ConanFile
import os

class Pkg(ConanFile):
    settings = "os", "compiler", "build_type", "arch"

"""
        self.save_conanfile(conanfile)
        the_version = version.replace(
            "-", ".")  # Canonical name for artifactory repo
        pip = "--extra-index-url %s/simple conan-package-tools==%s " % (
            PYPI_TESTING_REPO, the_version)
        with tools.environment_append({
                "CONAN_USE_DOCKER": "1",
                "CONAN_PIP_PACKAGE": pip,
                "CONAN_LOGIN_USERNAME": CONAN_LOGIN_UPLOAD,
                "CONAN_USERNAME": "******",
                "CONAN_UPLOAD": CONAN_UPLOAD_URL,
                "CONAN_PASSWORD": CONAN_UPLOAD_PASSWORD
        }):
            self.packager = ConanMultiPackager(
                ["--build missing", "-r conan.io"],
                channel="mychannel",
                gcc_versions=["6"],
                archs=["x86", "x86_64"],
                build_types=["Release"],
                reference=unique_ref,
                ci_manager=ci_manager)
            self.packager.add_common_builds()
            self.packager.run()

        search_pattern = "%s*" % unique_ref
        ref = ConanFileReference.loads("%s@lasote/mychannel" % unique_ref)

        # Remove from remote
        self.assertEquals(
            len(self.api.search_recipes(search_pattern, remote="upload_repo")),
            1)
        packages = self.api.search_packages(ref, remote="upload_repo")[0]
        self.assertEquals(len(packages), 2)

        self.api.authenticate(name=CONAN_LOGIN_UPLOAD,
                              password=CONAN_UPLOAD_PASSWORD,
                              remote="upload_repo")
        self.api.remove(search_pattern, remote="upload_repo", force=True)
        self.assertEquals(self.api.search_recipes(search_pattern), [])

        # Try upload only when stable, shouldn't upload anything
        with tools.environment_append({
                "CONAN_USE_DOCKER": "1",
                "CONAN_PIP_PACKAGE": pip,
                "CONAN_LOGIN_USERNAME": CONAN_LOGIN_UPLOAD,
                "CONAN_USERNAME": "******",
                "CONAN_PASSWORD": CONAN_UPLOAD_PASSWORD,
                "CONAN_UPLOAD_ONLY_WHEN_STABLE": "1"
        }):
            self.packager = ConanMultiPackager(
                ["--build missing", "-r conan.io"],
                channel="mychannel",
                gcc_versions=["6"],
                archs=["x86", "x86_64"],
                build_types=["Release"],
                reference=unique_ref,
                upload=CONAN_UPLOAD_URL,
                ci_manager=ci_manager)
            self.packager.add_common_builds()
            self.packager.run()

        self.assertEquals(
            len(self.api.search_recipes(search_pattern, remote="upload_repo")),
            0)
        self.api.remove(search_pattern, remote="upload_repo", force=True)
class UploadTest(BaseTest):

    conanfile = """from conans import ConanFile
class Pkg(ConanFile):
    name = "lib"
    version = "1.0"
    options = {"shared": [True, False]}
    default_options = "shared=False"

"""
    ci_manager = MockCIManager()

    def test_no_upload_remote(self):

        self.save_conanfile(self.conanfile)
        mp = ConanMultiPackager(username="******", out=self.output.write)
        mp.add({}, {}, {})
        mp.run()
        self.assertIn("Upload skipped, not upload remote available",
                      self.output)

    def test_no_credentials(self):
        self.save_conanfile(self.conanfile)
        mp = ConanMultiPackager(
            username="******",
            out=self.output.write,
            ci_manager=self.ci_manager,
            upload=("https://api.bintray.com/conan/conan-community/conan",
                    True, "my_upload_remote"))
        mp.add({}, {}, {})
        mp.run()
        self.assertIn(
            "Upload skipped, credentials for remote 'my_upload_remote' "
            "not available", self.output)
        self.assertNotIn("Uploading packages", self.output)

    def test_no_credentials_but_skip(self):
        with tools.environment_append({"CONAN_NON_INTERACTIVE": "1"}):
            self.save_conanfile(self.conanfile)
            mp = ConanMultiPackager(
                username="******",
                out=self.output.write,
                ci_manager=self.ci_manager,
                upload=("https://api.bintray.com/conan/conan-community/conan",
                        True, "my_upload_remote"),
                skip_check_credentials=True)
            mp.add({}, {}, {})
            with self.assertRaisesRegexp(ConanException,
                                         "Errors uploading some packages"):
                mp.run()
            self.assertIn("Uploading packages for", self.output)
            self.assertIn(
                "Credentials not specified but 'skip_check_credentials' activated",
                self.output)

    def test_no_credentials_only_url(self):
        self.save_conanfile(self.conanfile)
        mp = ConanMultiPackager(
            username="******",
            out=self.output.write,
            ci_manager=self.ci_manager,
            upload="https://api.bintray.com/conan/conan-community/conan")
        mp.add({}, {}, {})
        mp.run()
        self.assertIn(
            "Upload skipped, credentials for remote 'my_upload_remote' "
            "not available", self.output)
        self.assertNotIn("Uploading packages", self.output)

    def test_no_credentials_only_url(self):
        self.save_conanfile(self.conanfile)
        with tools.environment_append({"CONAN_PASSWORD": "******"}):
            mp = ConanMultiPackager(
                username="******",
                out=self.output.write,
                ci_manager=self.ci_manager,
                upload="https://api.bintray.com/conan/conan-community/conan")
            with self.assertRaisesRegexp(ConanException,
                                         "Wrong user or password"):
                mp.run()

    def test_no_credentials_only_url_skip_check(self):
        self.save_conanfile(self.conanfile)
        with tools.environment_append({
                "CONAN_PASSWORD": "******",
                "CONAN_UPLOAD_ONLY_WHEN_STABLE": "1"
        }):
            mp = ConanMultiPackager(
                username="******",
                out=self.output.write,
                channel="my_channel",
                ci_manager=self.ci_manager,
                upload="https://api.bintray.com/conan/conan-community/conan",
            )
            mp.add({}, {}, {})
            mp.run()
            self.assertIn("Skipping upload, not stable channel", self.output)

    def test_upload_only_stable(self):
        self.save_conanfile(self.conanfile)
        with tools.environment_append({
                "CONAN_PASSWORD": "******",
                "CONAN_SKIP_CHECK_CREDENTIALS": "1"
        }):
            mp = ConanMultiPackager(
                username="******",
                out=self.output.write,
                ci_manager=self.ci_manager,
                upload="https://api.bintray.com/conan/conan-community/conan")
            mp.run()  # No builds to upload so no raises
            self.assertNotIn("Wrong user or password", self.output)

    def test_existing_upload_repo(self):
        self.api.remote_add(
            "my_upload_repo",
            "https://api.bintray.com/conan/conan-community/conan")
        self.save_conanfile(self.conanfile)
        with tools.environment_append({"CONAN_PASSWORD": "******"}):
            mp = ConanMultiPackager(
                username="******",
                out=self.output.write,
                ci_manager=self.ci_manager,
                upload=[
                    "https://api.bintray.com/conan/conan-community/conan",
                    False, "othername"
                ])
            mp.add({}, {}, {})
            with self.assertRaisesRegexp(ConanException,
                                         "Wrong user or password"):
                mp.run()
            # The upload repo is kept because there is already an url
            # FIXME: Probaby we should rename if name is different (Conan 1.3)
            self.assertIn(
                "Remote for URL 'https://api.bintray.com/conan/conan-community/conan' "
                "already exist, keeping the current remote and its name",
                self.output)

    def test_existing_upload_repo_by_name(self):
        self.api.remote_add(
            "upload_repo",
            "https://api.bintray.com/different/conan-community/conan")
        self.save_conanfile(self.conanfile)
        with tools.environment_append({
                "CONAN_PASSWORD":
                "******",
                "CONAN_UPLOAD":
                "https://api.bintray.com/conan/"
                "conan-community/conan"
        }):
            mp = ConanMultiPackager(username="******",
                                    out=self.output.write,
                                    ci_manager=self.ci_manager)
            mp.add({}, {}, {})
            with self.assertRaisesRegexp(ConanException,
                                         "Wrong user or password"):
                mp.run()
            self.assertNotIn(
                "already exist, keeping the current remote and its name",
                self.output)
            repo = self.api.get_remote_by_name("upload_repo")
            self.assertEquals(
                repo.url,
                "https://api.bintray.com/conan/conan-community/conan")
 def setUp(self):
     self._ci_manager = MockCIManager()