Test with:
python test_lock.py
(runs with sqlite)
or
QUETZ_LOG_LEVEL=debug QUETZ_TEST_DATABASE="postgresql://postgres:mysecretpassword@localhost:5432/test_quetz" python test_lock.py
(runs with postgres)
| from quetz.db_models import Package, Channel, User | |
| from quetz.dao import Dao | |
| from quetz.database import get_session | |
| from quetz.config import Config | |
| from quetz.versionorder import VersionOrder | |
| import sys | |
| import os | |
| import logging | |
| logging.basicConfig(level=logging.DEBUG) | |
| import uuid | |
| user = User(id=uuid.uuid4().bytes) | |
| channel_name = "test-channel-{}".format(str(uuid.uuid4())[:5]) | |
| package_name = "test-package" | |
| channel_data = Channel(name=channel_name, private=False) | |
| package_data = Package(name=package_name) | |
| db_url = os.environ.get("QUETZ_TEST_DATABASE") | |
| import tempfile | |
| if not db_url: | |
| tmpdir = tempfile.mkdtemp() | |
| db_url = f"sqlite:///{tmpdir}/sqlite.db" | |
| print(f"using db {db_url}") | |
| echo = False | |
| db = get_session(db_url) | |
| db.add(user) | |
| dao = Dao(db) | |
| dao.create_channel(channel_data, user.id, "owner") | |
| package = dao.create_package(channel_name, package_data, user.id, "owner") | |
| package_format = "tarbz2" | |
| package_info = "{}" | |
| #version = [ | |
| # ("0.1.0", 0), | |
| # ("0.3.0", 2), | |
| # ("0.2.0", 2), | |
| #] | |
| from random import choice | |
| x = [0, 1, 2, 3, 4, 5] | |
| version = list(set( | |
| (f"{choice(x)}.{choice(x)}.{choice(x)}", choice(x)) for _ in range(50))) | |
| print(version) | |
| from threading import Thread | |
| class worker(Thread): | |
| def __init__(self, v): | |
| self.v = v | |
| super().__init__() | |
| def run(self): | |
| db = get_session(db_url, echo=echo) | |
| dao = Dao(db) | |
| #package_name = "test-package-" + str(uuid.uuid4()) | |
| #package_data = Package(name=package_name) | |
| #package = dao.create_package(channel_name, package_data, user.id, "owner") | |
| dao.create_version( | |
| channel_name, | |
| package_name, | |
| package_format, | |
| "linux-64", | |
| self.v[0], | |
| self.v[1], | |
| "", | |
| "", | |
| package_info, | |
| user.id, | |
| ) | |
| db.close() | |
| import time | |
| class waiter(Thread): | |
| def __init__(self): | |
| self.v = v | |
| super().__init__() | |
| def run(self): | |
| db = get_session(db_url, echo=True) | |
| dao = Dao(db) | |
| print(f"waiting {self.v}") | |
| time.sleep(1) | |
| print(f"awoken {self.v}") | |
| dao.create_version( | |
| channel_name, | |
| package_name, | |
| package_format, | |
| "linux-64", | |
| version[0][0], | |
| version[0][1], | |
| "", | |
| "", | |
| package_info, | |
| user.id, | |
| ) | |
| workers = [worker(v) for v in version[1:]] | |
| for w in workers: | |
| w.start() | |
| for w in workers: | |
| w.join() | |
| res = dao.get_package_versions(package) | |
| res_versions = [(VersionOrder(x[0].version), x[0].build_number) for x in res] | |
| assert sorted(res_versions, reverse=True) == res_versions |