xref: /trunk/test/aoo-test/tests/harness/conftest.py (revision 2cb6d6f119bbe2f78742f1c5c8538cb0d4e72ede)
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