|
5 | 5 |
|
6 | 6 | from __future__ import annotations |
7 | 7 |
|
8 | | -import logging |
9 | 8 | import time |
10 | 9 | from concurrent.futures import ThreadPoolExecutor |
11 | 10 |
|
12 | | -import pytest |
13 | | - |
14 | | -import snowflake.connector.errorcode |
15 | | -import snowflake.connector.telemetry |
16 | | -from snowflake.connector.description import CLIENT_NAME, SNOWFLAKE_CONNECTOR_VERSION |
17 | | -from snowflake.connector.errorcode import ER_FAILED_TO_REQUEST |
18 | 11 | from snowflake.connector.errors import RevocationCheckError |
19 | | -from snowflake.connector.ocsp_snowflake import OCSPTelemetryData |
20 | | -from snowflake.connector.sqlstate import SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED |
21 | 12 | from snowflake.connector.telemetry_oob import TelemetryService |
22 | 13 |
|
23 | | -DEV_CONFIG = { |
24 | | - "host": "localhost", |
25 | | - "port": 8080, |
26 | | - "account": "testAccount", |
27 | | - "user": "test", |
28 | | - "password": "ShouldNotShowUp", |
29 | | - "protocol": "http", |
30 | | -} |
31 | 14 | TEST_RACE_CONDITION_THREAD_COUNT = 2 |
32 | 15 | TEST_RACE_CONDITION_DELAY_SECONDS = 1 |
33 | 16 | telemetry_data = {} |
|
46 | 29 | method = "POST" |
47 | 30 |
|
48 | 31 |
|
49 | | -@pytest.fixture() |
50 | | -def telemetry_setup(request): |
51 | | - """Sets up the telemetry service by enabling it and flushing any entries.""" |
| 32 | +def test_telemetry_oob_disabled(): |
52 | 33 | telemetry = TelemetryService.get_instance() |
53 | | - telemetry.update_context(DEV_CONFIG) |
| 34 | + assert not telemetry.enabled |
54 | 35 | telemetry.enable() |
55 | | - telemetry.flush() |
56 | | - |
57 | | - |
58 | | -def test_telemetry_oob_simple_flush(telemetry_setup, caplog): |
59 | | - """Tests capturing and sending a simple OCSP Exception message.""" |
60 | | - telemetry = TelemetryService.get_instance() |
61 | | - telemetry.flush() # clear the buffer first |
62 | | - telemetry.log_ocsp_exception( |
63 | | - event_type, telemetry_data, exception=exception, stack_trace=stack_trace |
64 | | - ) |
65 | | - assert telemetry.size() == 1 |
66 | | - caplog.set_level(logging.DEBUG, "snowflake.connector.telemetry_oob") |
67 | | - telemetry.flush() |
68 | | - assert ( |
69 | | - "Failed to generate a JSON dump from the passed in telemetry OOB events" |
70 | | - not in caplog.text |
71 | | - ) |
72 | | - # since pytests can run test in parallel and TelemetryService is a singleton, other tests |
73 | | - # might encounter error logged into the queue of the OOB Telemetry simultaneously |
74 | | - # leading to assert telemetry.size() == 0 failure |
75 | | - # here we check that the OCSP exception event in the test is flushed |
76 | | - for event in list(telemetry.queue.queue): |
77 | | - assert "OCSPException" not in event.name |
78 | | - |
79 | | - |
80 | | -@pytest.mark.flaky(reruns=3) |
81 | | -def test_telemetry_oob_urgent(telemetry_setup): |
82 | | - """Tests sending an urgent OCSP Exception message.""" |
83 | | - telemetry = TelemetryService.get_instance() |
84 | | - |
85 | | - telemetry.log_ocsp_exception( |
86 | | - event_type, |
87 | | - telemetry_data, |
88 | | - exception=exception, |
89 | | - stack_trace=stack_trace, |
90 | | - urgent=True, |
91 | | - ) |
92 | | - assert telemetry.size() == 0 |
93 | | - |
94 | | - |
95 | | -def test_telemetry_oob_close(telemetry_setup): |
96 | | - """Tests closing the Telemetry Service when there are still messages in the queue.""" |
97 | | - telemetry = TelemetryService.get_instance() |
98 | | - |
99 | | - telemetry.log_ocsp_exception( |
100 | | - event_type, telemetry_data, exception=exception, stack_trace=stack_trace |
101 | | - ) |
102 | | - assert telemetry.size() == 1 |
103 | | - telemetry.close() |
104 | | - assert telemetry.size() == 0 |
105 | | - |
106 | | - |
107 | | -def test_telemetry_oob_close_empty(telemetry_setup): |
108 | | - """Tests closing the Telemetry Service when the queue is empty.""" |
109 | | - telemetry = TelemetryService.get_instance() |
110 | | - |
111 | | - assert telemetry.size() == 0 |
112 | | - telemetry.close() |
113 | | - assert telemetry.size() == 0 |
114 | | - |
115 | | - |
116 | | -def test_telemetry_oob_log_when_disabled(telemetry_setup): |
117 | | - """Tests trying to log to the telemetry service when it is disabled.""" |
118 | | - telemetry = TelemetryService.get_instance() |
119 | | - |
120 | | - assert telemetry.size() == 0 |
| 36 | + assert not telemetry.enabled |
121 | 37 | telemetry.disable() |
| 38 | + assert not telemetry.enabled |
| 39 | + telemetry.enable() |
122 | 40 | telemetry.log_ocsp_exception( |
123 | 41 | event_type, telemetry_data, exception=exception, stack_trace=stack_trace |
124 | 42 | ) |
125 | | - assert telemetry.size() == 0 |
126 | | - telemetry.enable() |
127 | | - |
128 | | - |
129 | | -def test_telemetry_oob_http_log(telemetry_setup): |
130 | | - """Tests sending a simple HTTP request telemetry event.""" |
131 | | - telemetry = TelemetryService.get_instance() |
132 | | - |
133 | | - telemetry.log_http_request_error( |
134 | | - event_name, |
135 | | - url, |
136 | | - method, |
137 | | - SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED, |
138 | | - ER_FAILED_TO_REQUEST, |
139 | | - exception=exception, |
140 | | - stack_trace=stack_trace, |
141 | | - ) |
142 | | - assert telemetry.size() == 1 |
143 | | - telemetry.flush() |
144 | | - assert telemetry.size() == 0 |
145 | | - |
146 | | - |
147 | | -def test_telemetry_oob_error_code_mapping(): |
148 | | - """Tests that all OCSP error codes have a corresponding Telemetry sub event type.""" |
149 | | - ec_dict = snowflake.connector.errorcode.__dict__ |
150 | | - for ec, ec_val in ec_dict.items(): |
151 | | - if not ec.startswith("__") and ec not in ("annotations",): |
152 | | - if 254000 <= ec_val < 255000: |
153 | | - assert ec_val in OCSPTelemetryData.ERROR_CODE_MAP |
154 | | - |
155 | | - |
156 | | -@pytest.mark.flaky(reruns=3) |
157 | | -def test_telemetry_oob_http_log_urgent(telemetry_setup): |
158 | | - """Tests sending an urgent HTTP request telemetry event.""" |
159 | | - telemetry = TelemetryService.get_instance() |
160 | | - |
161 | | - assert telemetry.size() == 0 |
162 | | - telemetry.log_http_request_error( |
163 | | - event_name, |
164 | | - url, |
165 | | - method, |
166 | | - SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED, |
167 | | - ER_FAILED_TO_REQUEST, |
168 | | - exception=exception, |
169 | | - stack_trace=stack_trace, |
170 | | - urgent=True, |
171 | | - ) |
172 | | - assert telemetry.size() == 0 |
173 | | - |
174 | | - |
175 | | -def test_generate_telemetry_with_driver_info(): |
176 | | - assert snowflake.connector.telemetry.generate_telemetry_data_dict( |
177 | | - is_oob_telemetry=True |
178 | | - ) == { |
179 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_DRIVER.value: CLIENT_NAME, |
180 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_VERSION.value: SNOWFLAKE_CONNECTOR_VERSION, |
181 | | - } |
182 | | - |
183 | | - assert snowflake.connector.telemetry.generate_telemetry_data_dict( |
184 | | - from_dict={}, is_oob_telemetry=True |
185 | | - ) == { |
186 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_DRIVER.value: CLIENT_NAME, |
187 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_VERSION.value: SNOWFLAKE_CONNECTOR_VERSION, |
188 | | - } |
189 | | - |
190 | | - assert snowflake.connector.telemetry.generate_telemetry_data_dict( |
191 | | - from_dict={"key": "value"}, is_oob_telemetry=True |
192 | | - ) == { |
193 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_DRIVER.value: CLIENT_NAME, |
194 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_VERSION.value: SNOWFLAKE_CONNECTOR_VERSION, |
195 | | - "key": "value", |
196 | | - } |
197 | | - |
198 | | - assert snowflake.connector.telemetry.generate_telemetry_data_dict( |
199 | | - from_dict={ |
200 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_DRIVER.value: "CUSTOM_CLIENT_NAME", |
201 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_VERSION.value: "1.2.3", |
202 | | - "key": "value", |
203 | | - }, |
204 | | - is_oob_telemetry=True, |
205 | | - ) == { |
206 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_DRIVER.value: "CUSTOM_CLIENT_NAME", |
207 | | - snowflake.connector.telemetry.TelemetryField.KEY_OOB_VERSION.value: "1.2.3", |
208 | | - "key": "value", |
209 | | - } |
| 43 | + assert telemetry.queue.empty() |
| 44 | + telemetry.log_general_exception(event_name, {}) |
| 45 | + assert telemetry.queue.empty() |
| 46 | + telemetry.log_http_request_error(event_name, url, method, "error", "error") |
| 47 | + assert telemetry.queue.empty() |
210 | 48 |
|
211 | 49 |
|
212 | 50 | class MockTelemetryService(TelemetryService): |
|
0 commit comments