1*2cb6d6f1SJim Jagielski################################################################ 2*2cb6d6f1SJim Jagielski# 3*2cb6d6f1SJim Jagielski# Licensed to the Apache Software Foundation (ASF) under one 4*2cb6d6f1SJim Jagielski# or more contributor license agreements. See the NOTICE file 5*2cb6d6f1SJim Jagielski# distributed with this work for additional information 6*2cb6d6f1SJim Jagielski# regarding copyright ownership. The ASF licenses this file 7*2cb6d6f1SJim Jagielski# to you under the Apache License, Version 2.0 (the 8*2cb6d6f1SJim Jagielski# "License"); you may not use this file except in compliance 9*2cb6d6f1SJim Jagielski# with the License. You may obtain a copy of the License at 10*2cb6d6f1SJim Jagielski# 11*2cb6d6f1SJim Jagielski# http://www.apache.org/licenses/LICENSE-2.0 12*2cb6d6f1SJim Jagielski# 13*2cb6d6f1SJim Jagielski# Unless required by applicable law or agreed to in writing, 14*2cb6d6f1SJim Jagielski# software distributed under the License is distributed on an 15*2cb6d6f1SJim Jagielski# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*2cb6d6f1SJim Jagielski# KIND, either express or implied. See the License for the 17*2cb6d6f1SJim Jagielski# specific language governing permissions and limitations 18*2cb6d6f1SJim Jagielski# under the License. 19*2cb6d6f1SJim Jagielski# 20*2cb6d6f1SJim Jagielski################################################################ 21*2cb6d6f1SJim Jagielski 22*2cb6d6f1SJim Jagielski"""Fake install layouts and a helper to start the fake worker.""" 23*2cb6d6f1SJim Jagielskiimport os 24*2cb6d6f1SJim Jagielskiimport sys 25*2cb6d6f1SJim Jagielskifrom pathlib import Path 26*2cb6d6f1SJim Jagielski 27*2cb6d6f1SJim Jagielskiimport pytest 28*2cb6d6f1SJim Jagielski 29*2cb6d6f1SJim Jagielskifrom aootest import client 30*2cb6d6f1SJim Jagielskifrom aootest.paths import ROOT 31*2cb6d6f1SJim Jagielski 32*2cb6d6f1SJim JagielskiFAKE_WORKER = Path(__file__).with_name("fake_worker.py") 33*2cb6d6f1SJim Jagielski 34*2cb6d6f1SJim JagielskiVERSIONRC = ("[Version]\nAllLanguages=en-US\nbuildid=510m1(Build:99000)\n%(base)sOOOPackageVersion=%(pkg)s\nProductBuildid=99000\n" 35*2cb6d6f1SJim Jagielski "ProductMajor=%(major)s\nProductMinor=%(minor)s\nRevision=7d712b94e3\n" 36*2cb6d6f1SJim Jagielski "UpdateUserAgent=<PRODUCT> (${buildid}; ${_OS}; ${_ARCH}; BundledLanguages=${AllLanguages})\n") 37*2cb6d6f1SJim Jagielski 38*2cb6d6f1SJim Jagielski 39*2cb6d6f1SJim Jagielskidef touch(path, text="x"): 40*2cb6d6f1SJim Jagielski path.parent.mkdir(parents=True, exist_ok=True) 41*2cb6d6f1SJim Jagielski path.write_text(text) 42*2cb6d6f1SJim Jagielski return path 43*2cb6d6f1SJim Jagielski 44*2cb6d6f1SJim Jagielski 45*2cb6d6f1SJim Jagielskidef make_install(root, kind, base="5.1", pkg="5.1.0", major="510", minor="1", with_base=True): 46*2cb6d6f1SJim Jagielski """A fake install of the given kind (macos, posix, windows) under `root`; returns what a user would point at.""" 47*2cb6d6f1SJim Jagielski rc = VERSIONRC % {"base": "OOOBaseVersion=%s\n" % base if with_base else "", "pkg": pkg, "major": major, "minor": minor} 48*2cb6d6f1SJim Jagielski if kind == "macos": 49*2cb6d6f1SJim Jagielski app = root / "OpenOffice5.app" 50*2cb6d6f1SJim Jagielski prog = app / "Contents" / "program" 51*2cb6d6f1SJim Jagielski touch(app / "Contents" / "MacOS" / "soffice") 52*2cb6d6f1SJim Jagielski for n in ("soffice.bin", "unopkg.bin", "pyuno.so", "uno.py", "libpyuno.dylib"): 53*2cb6d6f1SJim Jagielski touch(prog / n) 54*2cb6d6f1SJim Jagielski os.symlink("../MacOS/soffice", prog / "soffice") 55*2cb6d6f1SJim Jagielski os.symlink("unopkg.bin", prog / "unopkg") 56*2cb6d6f1SJim Jagielski touch(prog / "versionrc", rc) 57*2cb6d6f1SJim Jagielski touch(prog / "fundamentalrc", "[Bootstrap]\n") 58*2cb6d6f1SJim Jagielski return app 59*2cb6d6f1SJim Jagielski if kind == "posix": 60*2cb6d6f1SJim Jagielski top = root / "openoffice5" 61*2cb6d6f1SJim Jagielski prog = top / "program" 62*2cb6d6f1SJim Jagielski for n in ("soffice", "soffice.bin", "unopkg", "unopkg.bin", "pyuno.so", "uno.py", "libpyuno.so"): 63*2cb6d6f1SJim Jagielski touch(prog / n) 64*2cb6d6f1SJim Jagielski touch(prog / "versionrc", rc) 65*2cb6d6f1SJim Jagielski touch(prog / "fundamentalrc", "[Bootstrap]\n") 66*2cb6d6f1SJim Jagielski return top 67*2cb6d6f1SJim Jagielski top = root / "OpenOffice 5" 68*2cb6d6f1SJim Jagielski prog = top / "program" 69*2cb6d6f1SJim Jagielski for n in ("soffice.exe", "soffice.bin", "unopkg.com", "unopkg.exe", "pyuno.pyd", "uno.py"): 70*2cb6d6f1SJim Jagielski touch(prog / n) 71*2cb6d6f1SJim Jagielski touch(prog / "version.ini", rc) 72*2cb6d6f1SJim Jagielski touch(prog / "fundamental.ini", "[Bootstrap]\n") 73*2cb6d6f1SJim Jagielski return top 74*2cb6d6f1SJim Jagielski 75*2cb6d6f1SJim Jagielski 76*2cb6d6f1SJim Jagielski@pytest.fixture 77*2cb6d6f1SJim Jagielskidef fake(tmp_path): 78*2cb6d6f1SJim Jagielski """fake(kind, **version) -> the path a user would point at for a fake install of that kind.""" 79*2cb6d6f1SJim Jagielski return lambda kind, **kw: make_install(tmp_path, kind, **kw) 80*2cb6d6f1SJim Jagielski 81*2cb6d6f1SJim Jagielski 82*2cb6d6f1SJim Jagielski@pytest.fixture 83*2cb6d6f1SJim Jagielskidef worker_env(): 84*2cb6d6f1SJim Jagielski return dict(os.environ, PYTHONPATH=str(ROOT / "src")) 85*2cb6d6f1SJim Jagielski 86*2cb6d6f1SJim Jagielski 87*2cb6d6f1SJim Jagielski@pytest.fixture 88*2cb6d6f1SJim Jagielskidef start_worker(worker_env): 89*2cb6d6f1SJim Jagielski """start_worker(mode, **client_kw) -> a started WorkerClient on the fake worker; all are closed at the end.""" 90*2cb6d6f1SJim Jagielski made = [] 91*2cb6d6f1SJim Jagielski 92*2cb6d6f1SJim Jagielski def start(mode="good", **kw): 93*2cb6d6f1SJim Jagielski c = client.WorkerClient([sys.executable, str(FAKE_WORKER), mode], env=worker_env, **kw) 94*2cb6d6f1SJim Jagielski made.append(c) 95*2cb6d6f1SJim Jagielski c.start() 96*2cb6d6f1SJim Jagielski return c 97*2cb6d6f1SJim Jagielski yield start 98*2cb6d6f1SJim Jagielski for c in made: 99*2cb6d6f1SJim Jagielski c.close() 100