File: test_wasm_playwright.py

package info (click to toggle)
xsimd 14.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 3,144 kB
  • sloc: cpp: 41,628; sh: 541; makefile: 184; python: 117
file content (123 lines) | stat: -rw-r--r-- 3,858 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123

from tempfile import TemporaryDirectory
import shutil
import socket
import threading
from contextlib import closing, contextmanager
from http.server import HTTPServer, SimpleHTTPRequestHandler
import os
import asyncio
from pathlib import Path
from playwright.async_api import async_playwright

THIS_DIR = os.path.dirname(os.path.realpath(__file__))
WORK_DIR = os.path.join(THIS_DIR, "work_dir")


def find_free_port():
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
        s.bind(("", 0))
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        return s.getsockname()[1]


def start_server(work_dir, port):
    class Handler(SimpleHTTPRequestHandler):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, directory=work_dir, **kwargs)

        def log_message(self, fmt, *args):
            return

    httpd = HTTPServer(("127.0.0.1", port), Handler)

    thread = threading.Thread(target=httpd.serve_forever)
    thread.start()
    return thread, httpd


@contextmanager
def server_context(work_dir, port):
    thread, server = start_server(work_dir=work_dir, port=port)
    try:
        yield server, f"http://127.0.0.1:{port}"
    finally:
        server.shutdown()
        thread.join()

async def playwright_run_page(page_url, headless=True, slow_mo=None):
    async with async_playwright() as p:
        if slow_mo is None:
            browser = await p.chromium.launch(headless=headless)
        else:
            browser = await p.chromium.launch(
                headless=headless, slow_mo=slow_mo
            )
        page = await browser.new_page()
        await page.goto(page_url)
        # n min = n_min * 60 * 1000 ms
        n_min = 4
        page.set_default_timeout(n_min * 60 * 1000)

        async def handle_console(msg):
            txt = str(msg)
            print(txt)

        page.on("console", handle_console)


        status = await page.evaluate(
            f"""async () => {{
                let test_module = await test_xsimd_wasm();
                console.log("\\n\\n************************************************************");
                console.log("XSIMD WASM TESTS:");
                console.log("************************************************************");
                let r = test_module.run_tests();
                if (r == 0) {{
                console.log("\\n\\n************************************************************");
                console.log("XSIMD WASM TESTS PASSED");
                console.log("************************************************************");
                return r;
                }}
                else {{
                console.log("************************************************************");
                console.log("XSIMD WASM TESTS FAILED");
                console.log("************************************************************");
                return r;
                }}

                }}"""
        )
        return_code = int(status)
    return return_code
def main(build_dir):
    
    work_dir = WORK_DIR# TemporaryDirectory()

    with TemporaryDirectory() as temp_dir:
        work_dir = Path(temp_dir)


        shutil.copy(f"{build_dir}/test_xsimd.wasm", work_dir)
        shutil.copy(f"{build_dir}/test_xsimd.js", work_dir)
        shutil.copy(f"{THIS_DIR}/browser_main.html", work_dir)
        
        port = find_free_port()
        with server_context(work_dir=work_dir, port=port) as (server, url):
            page_url = f"{url}/browser_main.html"
            ret = asyncio.run(playwright_run_page(page_url=page_url))
        
            return ret



if __name__ == "__main__":
    import sys

    # get arg from args
    build_dir = sys.argv[1]
    
    print(f"build_dir: {build_dir}")

    ret_code = main(build_dir)
    sys.exit(ret_code)