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()
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)
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)
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()