Skip to content

Commit

Permalink
Minor improvement to TurboTestClient (#5932)
Browse files Browse the repository at this point in the history
* typo assigning attribute

* reorder classes

* use default argument, so client can pass a 'False' conanfile to skip saving it
  • Loading branch information
jgsogo authored and lasote committed Oct 21, 2019
1 parent 76812f9 commit 02f68a4
Showing 1 changed file with 127 additions and 127 deletions.
254 changes: 127 additions & 127 deletions conans/test/utils/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -837,7 +837,7 @@ def run(self, command_line, user_io=None, assert_error=False):
added_modules = set(sys.modules).difference(old_modules)
for added in added_modules:
sys.modules.pop(added, None)
self._handle_cli_result(command, assert_error=assert_error, error=error)
self._handle_cli_result(command_line, assert_error=assert_error, error=error)
return error

def run_command(self, command, cwd=None, assert_error=False):
Expand Down Expand Up @@ -885,132 +885,6 @@ def copy_from_assets(self, origin_folder, assets):
shutil.copy2(s, d)


class TurboTestClient(TestClient):

tmp_json_name = ".tmp_json"

def __init__(self, *args, **kwargs):
if "users" not in kwargs and "default_server_user" not in kwargs:
from collections import defaultdict
kwargs["users"] = defaultdict(lambda: [("conan", "password")])

super(TurboTestClient, self).__init__(*args, **kwargs)

def export(self, ref, conanfile=None, args=None, assert_error=False):
conanfile = str(conanfile) if conanfile else GenConanfile()
self.save({"conanfile.py": conanfile})
self.run("export . {} {}".format(ref.full_str(), args or ""),
assert_error=assert_error)
rrev = self.cache.package_layout(ref).recipe_revision()
return ref.copy_with_rev(rrev)

def create(self, ref, conanfile=None, args=None, assert_error=False):
conanfile = str(conanfile) if conanfile else GenConanfile()
self.save({"conanfile.py": conanfile})
self.run("create . {} {} --json {}".format(ref.full_str(),
args or "", self.tmp_json_name),
assert_error=assert_error)
rrev = self.cache.package_layout(ref).recipe_revision()
json_path = os.path.join(self.current_folder, self.tmp_json_name)
data = json.loads(load(json_path))
if assert_error:
return None
package_id = data["installed"][0]["packages"][0]["id"]
package_ref = PackageReference(ref, package_id)
prev = self.cache.package_layout(ref.copy_clear_rev()).package_revision(package_ref)
return package_ref.copy_with_revs(rrev, prev)

def upload_all(self, ref, remote=None, args=None, assert_error=False):
remote = remote or list(self.servers.keys())[0]
self.run("upload {} -c --all -r {} {}".format(ref.full_str(), remote, args or ""),
assert_error=assert_error)
if not assert_error:
remote_rrev, _ = self.servers[remote].server_store.get_last_revision(ref)
return ref.copy_with_rev(remote_rrev)
return

def remove_all(self):
self.run("remove '*' -f")

def export_pkg(self, ref, conanfile=None, args=None, assert_error=False):
conanfile = str(conanfile) if conanfile else GenConanfile()
self.save({"conanfile.py": conanfile})
self.run("export-pkg . {} {} --json {}".format(ref.full_str(),
args or "", self.tmp_json_name),
assert_error=assert_error)
rrev = self.cache.package_layout(ref).recipe_revision()
json_path = os.path.join(self.current_folder, self.tmp_json_name)
data = json.loads(load(json_path))
if assert_error:
return None
package_id = data["installed"][0]["packages"][0]["id"]
package_ref = PackageReference(ref, package_id)
prev = self.cache.package_layout(ref.copy_clear_rev()).package_revision(package_ref)
return package_ref.copy_with_revs(rrev, prev)

def recipe_exists(self, ref):
return self.cache.package_layout(ref).recipe_exists()

def package_exists(self, pref):
return self.cache.package_layout(pref.ref).package_exists(pref)

def recipe_revision(self, ref):
return self.cache.package_layout(ref).recipe_revision()

def package_revision(self, pref):
return self.cache.package_layout(pref.ref).package_revision(pref)

def search(self, pattern, remote=None, assert_error=False, args=None):
remote = " -r={}".format(remote) if remote else ""
self.run("search {} --json {} {} {}".format(pattern, self.tmp_json_name, remote,
args or ""),
assert_error=assert_error)
json_path = os.path.join(self.current_folder, self.tmp_json_name)
data = json.loads(load(json_path))
return data

def massive_uploader(self, ref, revisions, num_prev, remote=None):
"""Uploads N revisions with M package revisions. The revisions can be specified like:
revisions = [{"os": "Windows"}, {"os": "Linux"}], \
[{"os": "Macos"}], \
[{"os": "Solaris"}, {"os": "FreeBSD"}]
IMPORTANT: Different settings keys will cause different recipe revisions
"""
remote = remote or "default"
ret = []
for i, settings_groups in enumerate(revisions):
tmp = []
for settings in settings_groups:
conanfile_gen = GenConanfile(). \
with_build_msg("REV{}".format(i)). \
with_package_file("file", env_var="MY_VAR")
for s in settings.keys():
conanfile_gen = conanfile_gen.with_setting(s)
for k in range(num_prev):
args = " ".join(["-s {}={}".format(key, value)
for key, value in settings.items()])
with environment_append({"MY_VAR": str(k)}):
pref = self.create(ref, conanfile=conanfile_gen, args=args)
self.upload_all(ref, remote=remote)
tmp.append(pref)
ret.append(tmp)
return ret

def init_git_repo(self, files=None, branch=None, submodules=None, origin_url=None):
_, commit = create_local_git_repo(files, branch, submodules, self.current_folder)
if origin_url:
self.run_command('git remote add origin {}'.format(origin_url))
return commit

def init_svn_repo(self, subpath, files=None, repo_url=None):
if not repo_url:
repo_url = create_remote_svn_repo(temp_folder())
_, rev = create_local_svn_checkout(files, repo_url, folder=self.current_folder,
rel_project_path=subpath, delete_checkout=False)
return rev


class GenConanfile(object):
"""
USAGE:
Expand Down Expand Up @@ -1321,6 +1195,132 @@ def __repr__(self):
return "\n".join(ret)


class TurboTestClient(TestClient):

tmp_json_name = ".tmp_json"

def __init__(self, *args, **kwargs):
if "users" not in kwargs and "default_server_user" not in kwargs:
from collections import defaultdict
kwargs["users"] = defaultdict(lambda: [("conan", "password")])

super(TurboTestClient, self).__init__(*args, **kwargs)

def export(self, ref, conanfile=GenConanfile(), args=None, assert_error=False):
if conanfile:
self.save({"conanfile.py": conanfile})
self.run("export . {} {}".format(ref.full_str(), args or ""),
assert_error=assert_error)
rrev = self.cache.package_layout(ref).recipe_revision()
return ref.copy_with_rev(rrev)

def create(self, ref, conanfile=GenConanfile(), args=None, assert_error=False):
if conanfile:
self.save({"conanfile.py": conanfile})
self.run("create . {} {} --json {}".format(ref.full_str(),
args or "", self.tmp_json_name),
assert_error=assert_error)
rrev = self.cache.package_layout(ref).recipe_revision()
json_path = os.path.join(self.current_folder, self.tmp_json_name)
data = json.loads(load(json_path))
if assert_error:
return None
package_id = data["installed"][0]["packages"][0]["id"]
package_ref = PackageReference(ref, package_id)
prev = self.cache.package_layout(ref.copy_clear_rev()).package_revision(package_ref)
return package_ref.copy_with_revs(rrev, prev)

def upload_all(self, ref, remote=None, args=None, assert_error=False):
remote = remote or list(self.servers.keys())[0]
self.run("upload {} -c --all -r {} {}".format(ref.full_str(), remote, args or ""),
assert_error=assert_error)
if not assert_error:
remote_rrev, _ = self.servers[remote].server_store.get_last_revision(ref)
return ref.copy_with_rev(remote_rrev)
return

def remove_all(self):
self.run("remove '*' -f")

def export_pkg(self, ref, conanfile=GenConanfile(), args=None, assert_error=False):
if conanfile:
self.save({"conanfile.py": conanfile})
self.run("export-pkg . {} {} --json {}".format(ref.full_str(),
args or "", self.tmp_json_name),
assert_error=assert_error)
rrev = self.cache.package_layout(ref).recipe_revision()
json_path = os.path.join(self.current_folder, self.tmp_json_name)
data = json.loads(load(json_path))
if assert_error:
return None
package_id = data["installed"][0]["packages"][0]["id"]
package_ref = PackageReference(ref, package_id)
prev = self.cache.package_layout(ref.copy_clear_rev()).package_revision(package_ref)
return package_ref.copy_with_revs(rrev, prev)

def recipe_exists(self, ref):
return self.cache.package_layout(ref).recipe_exists()

def package_exists(self, pref):
return self.cache.package_layout(pref.ref).package_exists(pref)

def recipe_revision(self, ref):
return self.cache.package_layout(ref).recipe_revision()

def package_revision(self, pref):
return self.cache.package_layout(pref.ref).package_revision(pref)

def search(self, pattern, remote=None, assert_error=False, args=None):
remote = " -r={}".format(remote) if remote else ""
self.run("search {} --json {} {} {}".format(pattern, self.tmp_json_name, remote,
args or ""),
assert_error=assert_error)
json_path = os.path.join(self.current_folder, self.tmp_json_name)
data = json.loads(load(json_path))
return data

def massive_uploader(self, ref, revisions, num_prev, remote=None):
"""Uploads N revisions with M package revisions. The revisions can be specified like:
revisions = [{"os": "Windows"}, {"os": "Linux"}], \
[{"os": "Macos"}], \
[{"os": "Solaris"}, {"os": "FreeBSD"}]
IMPORTANT: Different settings keys will cause different recipe revisions
"""
remote = remote or "default"
ret = []
for i, settings_groups in enumerate(revisions):
tmp = []
for settings in settings_groups:
conanfile_gen = GenConanfile(). \
with_build_msg("REV{}".format(i)). \
with_package_file("file", env_var="MY_VAR")
for s in settings.keys():
conanfile_gen = conanfile_gen.with_setting(s)
for k in range(num_prev):
args = " ".join(["-s {}={}".format(key, value)
for key, value in settings.items()])
with environment_append({"MY_VAR": str(k)}):
pref = self.create(ref, conanfile=conanfile_gen, args=args)
self.upload_all(ref, remote=remote)
tmp.append(pref)
ret.append(tmp)
return ret

def init_git_repo(self, files=None, branch=None, submodules=None, origin_url=None):
_, commit = create_local_git_repo(files, branch, submodules, self.current_folder)
if origin_url:
self.run_command('git remote add origin {}'.format(origin_url))
return commit

def init_svn_repo(self, subpath, files=None, repo_url=None):
if not repo_url:
repo_url = create_remote_svn_repo(temp_folder())
_, rev = create_local_svn_checkout(files, repo_url, folder=self.current_folder,
rel_project_path=subpath, delete_checkout=False)
return rev


class StoppableThreadBottle(threading.Thread):
"""
Real server to test download endpoints
Expand Down

0 comments on commit 02f68a4

Please sign in to comment.