1def assert_base_entry(entry,
2                      level=None,
3                      text=None,
4                      time_start=None,
5                      time_end=None,
6                      stacktrace=None):
7    assert "level" in entry
8    assert isinstance(entry["level"], str)
9    if level is not None:
10        assert entry["level"] == level
11
12    assert "text" in entry
13    assert isinstance(entry["text"], str)
14    if text is not None:
15        assert entry["text"] == text
16
17    assert "timestamp" in entry
18    assert isinstance(entry["timestamp"], int)
19    if time_start is not None:
20        assert entry["timestamp"] >= time_start
21    if time_end is not None:
22        assert entry["timestamp"] <= time_end
23
24    if stacktrace is not None:
25        assert "stackTrace" in entry
26        assert isinstance(entry["stackTrace"], object)
27        assert "callFrames" in entry["stackTrace"]
28
29        call_frames = entry["stackTrace"]["callFrames"]
30        assert isinstance(call_frames, list)
31        assert len(call_frames) == len(stacktrace)
32        for index in range(0, len(call_frames)):
33            assert call_frames[index] == stacktrace[index]
34
35
36def assert_console_entry(entry,
37                         method=None,
38                         level=None,
39                         text=None,
40                         args=None,
41                         time_start=None,
42                         time_end=None,
43                         realm=None,
44                         stacktrace=None):
45    assert_base_entry(entry, level, text, time_start, time_end, stacktrace)
46
47    assert "type" in entry
48    assert isinstance(entry["type"], str)
49    assert entry["type"] == "console"
50
51    assert "method" in entry
52    assert isinstance(entry["method"], str)
53    if method is not None:
54        assert entry["method"] == method
55
56    assert "args" in entry
57    assert isinstance(entry["args"], list)
58    if args is not None:
59        assert entry["args"] == args
60
61    if realm is not None:
62        assert "realm" in entry
63        assert isinstance(entry["realm"], str)
64
65
66def assert_javascript_entry(entry,
67                            level=None,
68                            text=None,
69                            time_start=None,
70                            time_end=None,
71                            stacktrace=None):
72    assert_base_entry(entry, level, text, time_start, time_end, stacktrace)
73
74    assert "type" in entry
75    assert isinstance(entry["type"], str)
76    assert entry["type"] == "javascript"
77
78
79def create_console_api_message(current_session, inline, text):
80    current_session.execute_script(f"console.log('{text}')")
81    return text
82
83
84def create_javascript_error(current_session, inline, error_message="foo"):
85    return current_session.execute_script(f"""
86        const script = document.createElement("script");
87        script.append(document.createTextNode(`(() => {{throw new Error('{error_message}')}})()`));
88        document.body.append(script);
89        const err = new Error('{error_message}'); return err.toString()
90    """)
91
92
93def create_log(current_session, inline, log_type, text="foo"):
94    if log_type == "console_api_log":
95        return create_console_api_message(current_session, inline, text)
96    if log_type == "javascript_error":
97        return create_javascript_error(current_session, inline, text)
98