Skip to content

Commit 4115c1b

Browse files
mauriciovasquezbernaltoumorokoshic24t
authored
ext: Use TestBase (#586)
Update tests to use TestBase as described on #303. Co-authored-by: Yusuke Tsutsumi <[email protected]> Co-authored-by: Chris Kleinknecht <[email protected]>
1 parent 920b4b4 commit 4115c1b

File tree

13 files changed

+143
-230
lines changed

13 files changed

+143
-230
lines changed

ext/opentelemetry-ext-dbapi/setup.cfg

+4
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,9 @@ install_requires =
4343
opentelemetry-api == 0.7.dev0
4444
wrapt >= 1.0.0, < 2.0.0
4545

46+
[options.extras_require]
47+
test =
48+
opentelemetry-test == 0.7.dev0
49+
4650
[options.packages.find]
4751
where = src

ext/opentelemetry-ext-dbapi/tests/test_dbapi_integration.py

+38-70
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,15 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
import unittest
16-
from unittest import mock
17-
1815
from opentelemetry import trace as trace_api
1916
from opentelemetry.ext.dbapi import DatabaseApiIntegration
17+
from opentelemetry.test.test_base import TestBase
2018

2119

22-
class TestDBApiIntegration(unittest.TestCase):
20+
class TestDBApiIntegration(TestBase):
2321
def setUp(self):
24-
self.tracer = trace_api.DefaultTracer()
25-
self.span = MockSpan()
26-
self.start_current_span_patcher = mock.patch.object(
27-
self.tracer,
28-
"start_as_current_span",
29-
autospec=True,
30-
spec_set=True,
31-
return_value=self.span,
32-
)
33-
34-
self.start_as_current_span = self.start_current_span_patcher.start()
35-
36-
def tearDown(self):
37-
self.start_current_span_patcher.stop()
22+
super().setUp()
23+
self.tracer = self.tracer_provider.get_tracer(__name__)
3824

3925
def test_span_succeeded(self):
4026
connection_props = {
@@ -57,28 +43,25 @@ def test_span_succeeded(self):
5743
)
5844
cursor = mock_connection.cursor()
5945
cursor.execute("Test query", ("param1Value", False))
60-
self.assertTrue(self.start_as_current_span.called)
46+
spans_list = self.memory_exporter.get_finished_spans()
47+
self.assertEqual(len(spans_list), 1)
48+
span = spans_list[0]
49+
self.assertEqual(span.name, "testcomponent.testdatabase")
50+
self.assertIs(span.kind, trace_api.SpanKind.CLIENT)
51+
52+
self.assertEqual(span.attributes["component"], "testcomponent")
53+
self.assertEqual(span.attributes["db.type"], "testtype")
54+
self.assertEqual(span.attributes["db.instance"], "testdatabase")
55+
self.assertEqual(span.attributes["db.statement"], "Test query")
6156
self.assertEqual(
62-
self.start_as_current_span.call_args[0][0],
63-
"testcomponent.testdatabase",
64-
)
65-
self.assertIs(
66-
self.start_as_current_span.call_args[1]["kind"],
67-
trace_api.SpanKind.CLIENT,
68-
)
69-
self.assertEqual(self.span.attributes["component"], "testcomponent")
70-
self.assertEqual(self.span.attributes["db.type"], "testtype")
71-
self.assertEqual(self.span.attributes["db.instance"], "testdatabase")
72-
self.assertEqual(self.span.attributes["db.statement"], "Test query")
73-
self.assertEqual(
74-
self.span.attributes["db.statement.parameters"],
57+
span.attributes["db.statement.parameters"],
7558
"('param1Value', False)",
7659
)
77-
self.assertEqual(self.span.attributes["db.user"], "testuser")
78-
self.assertEqual(self.span.attributes["net.peer.name"], "testhost")
79-
self.assertEqual(self.span.attributes["net.peer.port"], 123)
60+
self.assertEqual(span.attributes["db.user"], "testuser")
61+
self.assertEqual(span.attributes["net.peer.name"], "testhost")
62+
self.assertEqual(span.attributes["net.peer.port"], 123)
8063
self.assertIs(
81-
self.span.status.canonical_code,
64+
span.status.canonical_code,
8265
trace_api.status.StatusCanonicalCode.OK,
8366
)
8467

@@ -88,17 +71,18 @@ def test_span_failed(self):
8871
mock_connect, {}, {}
8972
)
9073
cursor = mock_connection.cursor()
91-
try:
74+
with self.assertRaises(Exception):
9275
cursor.execute("Test query", throw_exception=True)
93-
except Exception: # pylint: disable=broad-except
94-
self.assertEqual(
95-
self.span.attributes["db.statement"], "Test query"
96-
)
97-
self.assertIs(
98-
self.span.status.canonical_code,
99-
trace_api.status.StatusCanonicalCode.UNKNOWN,
100-
)
101-
self.assertEqual(self.span.status.description, "Test Exception")
76+
77+
spans_list = self.memory_exporter.get_finished_spans()
78+
self.assertEqual(len(spans_list), 1)
79+
span = spans_list[0]
80+
self.assertEqual(span.attributes["db.statement"], "Test query")
81+
self.assertIs(
82+
span.status.canonical_code,
83+
trace_api.status.StatusCanonicalCode.UNKNOWN,
84+
)
85+
self.assertEqual(span.status.description, "Test Exception")
10286

10387
def test_executemany(self):
10488
db_integration = DatabaseApiIntegration(self.tracer, "testcomponent")
@@ -107,8 +91,10 @@ def test_executemany(self):
10791
)
10892
cursor = mock_connection.cursor()
10993
cursor.executemany("Test query")
110-
self.assertTrue(self.start_as_current_span.called)
111-
self.assertEqual(self.span.attributes["db.statement"], "Test query")
94+
spans_list = self.memory_exporter.get_finished_spans()
95+
self.assertEqual(len(spans_list), 1)
96+
span = spans_list[0]
97+
self.assertEqual(span.attributes["db.statement"], "Test query")
11298

11399
def test_callproc(self):
114100
db_integration = DatabaseApiIntegration(self.tracer, "testcomponent")
@@ -117,9 +103,11 @@ def test_callproc(self):
117103
)
118104
cursor = mock_connection.cursor()
119105
cursor.callproc("Test stored procedure")
120-
self.assertTrue(self.start_as_current_span.called)
106+
spans_list = self.memory_exporter.get_finished_spans()
107+
self.assertEqual(len(spans_list), 1)
108+
span = spans_list[0]
121109
self.assertEqual(
122-
self.span.attributes["db.statement"], "Test stored procedure"
110+
span.attributes["db.statement"], "Test stored procedure"
123111
)
124112

125113

@@ -159,23 +147,3 @@ def executemany(self, query, params=None, throw_exception=False):
159147
def callproc(self, query, params=None, throw_exception=False):
160148
if throw_exception:
161149
raise Exception("Test Exception")
162-
163-
164-
class MockSpan:
165-
def __enter__(self):
166-
return self
167-
168-
def __exit__(self, exc_type, exc_val, exc_tb):
169-
return False
170-
171-
def __init__(self):
172-
self.status = None
173-
self.name = ""
174-
self.kind = trace_api.SpanKind.INTERNAL
175-
self.attributes = {}
176-
177-
def set_attribute(self, key, value):
178-
self.attributes[key] = value
179-
180-
def set_status(self, status):
181-
self.status = status

ext/opentelemetry-ext-docker-tests/tests/mysql/test_mysql_functional.py

+5-16
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,12 @@
1414

1515
import os
1616
import time
17-
import unittest
1817

1918
import mysql.connector
2019

2120
from opentelemetry import trace as trace_api
2221
from opentelemetry.ext.mysql import trace_integration
23-
from opentelemetry.sdk.trace import Tracer, TracerProvider
24-
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
25-
from opentelemetry.sdk.trace.export.in_memory_span_exporter import (
26-
InMemorySpanExporter,
27-
)
22+
from opentelemetry.test.test_base import TestBase
2823

2924
MYSQL_USER = os.getenv("MYSQL_USER ", "testuser")
3025
MYSQL_PASSWORD = os.getenv("MYSQL_PASSWORD ", "testpassword")
@@ -33,16 +28,13 @@
3328
MYSQL_DB_NAME = os.getenv("MYSQL_DB_NAME ", "opentelemetry-tests")
3429

3530

36-
class TestFunctionalMysql(unittest.TestCase):
31+
class TestFunctionalMysql(TestBase):
3732
@classmethod
3833
def setUpClass(cls):
34+
super().setUpClass()
3935
cls._connection = None
4036
cls._cursor = None
41-
cls._tracer_provider = TracerProvider()
42-
cls._tracer = Tracer(cls._tracer_provider, None)
43-
cls._span_exporter = InMemorySpanExporter()
44-
cls._span_processor = SimpleExportSpanProcessor(cls._span_exporter)
45-
cls._tracer_provider.add_span_processor(cls._span_processor)
37+
cls._tracer = cls.tracer_provider.get_tracer(__name__)
4638
trace_integration(cls._tracer)
4739
cls._connection = mysql.connector.connect(
4840
user=MYSQL_USER,
@@ -58,11 +50,8 @@ def tearDownClass(cls):
5850
if cls._connection:
5951
cls._connection.close()
6052

61-
def setUp(self):
62-
self._span_exporter.clear()
63-
6453
def validate_spans(self):
65-
spans = self._span_exporter.get_finished_spans()
54+
spans = self.memory_exporter.get_finished_spans()
6655
self.assertEqual(len(spans), 2)
6756
for span in spans:
6857
if span.name == "rootSpan":

ext/opentelemetry-ext-docker-tests/tests/postgres/test_psycopg_functional.py

+5-16
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,12 @@
1414

1515
import os
1616
import time
17-
import unittest
1817

1918
import psycopg2
2019

2120
from opentelemetry import trace as trace_api
2221
from opentelemetry.ext.psycopg2 import trace_integration
23-
from opentelemetry.sdk.trace import Tracer, TracerProvider
24-
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
25-
from opentelemetry.sdk.trace.export.in_memory_span_exporter import (
26-
InMemorySpanExporter,
27-
)
22+
from opentelemetry.test.test_base import TestBase
2823

2924
POSTGRES_HOST = os.getenv("POSTGRESQL_HOST ", "localhost")
3025
POSTGRES_PORT = int(os.getenv("POSTGRESQL_PORT ", "5432"))
@@ -33,16 +28,13 @@
3328
POSTGRES_USER = os.getenv("POSTGRESQL_HOST ", "testuser")
3429

3530

36-
class TestFunctionalPsycopg(unittest.TestCase):
31+
class TestFunctionalPsycopg(TestBase):
3732
@classmethod
3833
def setUpClass(cls):
34+
super().setUpClass()
3935
cls._connection = None
4036
cls._cursor = None
41-
cls._tracer_provider = TracerProvider()
42-
cls._tracer = Tracer(cls._tracer_provider, None)
43-
cls._span_exporter = InMemorySpanExporter()
44-
cls._span_processor = SimpleExportSpanProcessor(cls._span_exporter)
45-
cls._tracer_provider.add_span_processor(cls._span_processor)
37+
cls._tracer = cls.tracer_provider.get_tracer(__name__)
4638
trace_integration(cls._tracer)
4739
cls._connection = psycopg2.connect(
4840
dbname=POSTGRES_DB_NAME,
@@ -61,11 +53,8 @@ def tearDownClass(cls):
6153
if cls._connection:
6254
cls._connection.close()
6355

64-
def setUp(self):
65-
self._span_exporter.clear()
66-
6756
def validate_spans(self):
68-
spans = self._span_exporter.get_finished_spans()
57+
spans = self.memory_exporter.get_finished_spans()
6958
self.assertEqual(len(spans), 2)
7059
for span in spans:
7160
if span.name == "rootSpan":

ext/opentelemetry-ext-docker-tests/tests/pymongo/test_pymongo_functional.py

+5-17
Original file line numberDiff line numberDiff line change
@@ -13,45 +13,33 @@
1313
# limitations under the License.
1414

1515
import os
16-
import typing
17-
import unittest
1816

1917
from pymongo import MongoClient
2018

2119
from opentelemetry import trace as trace_api
2220
from opentelemetry.ext.pymongo import trace_integration
23-
from opentelemetry.sdk.trace import Span, Tracer, TracerProvider
24-
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
25-
from opentelemetry.sdk.trace.export.in_memory_span_exporter import (
26-
InMemorySpanExporter,
27-
)
21+
from opentelemetry.test.test_base import TestBase
2822

2923
MONGODB_HOST = os.getenv("MONGODB_HOST ", "localhost")
3024
MONGODB_PORT = int(os.getenv("MONGODB_PORT ", "27017"))
3125
MONGODB_DB_NAME = os.getenv("MONGODB_DB_NAME ", "opentelemetry-tests")
3226
MONGODB_COLLECTION_NAME = "test"
3327

3428

35-
class TestFunctionalPymongo(unittest.TestCase):
29+
class TestFunctionalPymongo(TestBase):
3630
@classmethod
3731
def setUpClass(cls):
38-
cls._tracer_provider = TracerProvider()
39-
cls._tracer = Tracer(cls._tracer_provider, None)
40-
cls._span_exporter = InMemorySpanExporter()
41-
cls._span_processor = SimpleExportSpanProcessor(cls._span_exporter)
42-
cls._tracer_provider.add_span_processor(cls._span_processor)
32+
super().setUpClass()
33+
cls._tracer = cls.tracer_provider.get_tracer(__name__)
4334
trace_integration(cls._tracer)
4435
client = MongoClient(
4536
MONGODB_HOST, MONGODB_PORT, serverSelectionTimeoutMS=2000
4637
)
4738
db = client[MONGODB_DB_NAME]
4839
cls._collection = db[MONGODB_COLLECTION_NAME]
4940

50-
def setUp(self):
51-
self._span_exporter.clear()
52-
5341
def validate_spans(self):
54-
spans = self._span_exporter.get_finished_spans()
42+
spans = self.memory_exporter.get_finished_spans()
5543
self.assertEqual(len(spans), 2)
5644
for span in spans:
5745
if span.name == "rootSpan":

ext/opentelemetry-ext-grpc/setup.cfg

+5
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,10 @@ install_requires =
4343
opentelemetry-api == 0.7.dev0
4444
grpcio ~= 1.27
4545

46+
[options.extras_require]
47+
test =
48+
opentelemetry-test == 0.7.dev0
49+
opentelemetry-sdk == 0.7.dev0
50+
4651
[options.packages.find]
4752
where = src

ext/opentelemetry-ext-grpc/tests/test_server_interceptor.py

+13-14
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,15 @@
1616
# pylint:disable=no-self-use
1717

1818
import threading
19-
import unittest
2019
from concurrent import futures
21-
from contextlib import contextmanager
22-
from unittest import mock
2320

2421
import grpc
2522

2623
from opentelemetry import trace
2724
from opentelemetry.ext.grpc import server_interceptor
2825
from opentelemetry.ext.grpc.grpcext import intercept_server
2926
from opentelemetry.sdk import trace as trace_sdk
27+
from opentelemetry.test.test_base import TestBase
3028

3129

3230
class UnaryUnaryMethodHandler(grpc.RpcMethodHandler):
@@ -49,18 +47,16 @@ def service(self, handler_call_details):
4947
return UnaryUnaryMethodHandler(self._unary_unary_handler)
5048

5149

52-
class TestOpenTelemetryServerInterceptor(unittest.TestCase):
50+
class TestOpenTelemetryServerInterceptor(TestBase):
51+
def setUp(self):
52+
super().setUp()
53+
self.tracer = self.tracer_provider.get_tracer(__name__)
54+
5355
def test_create_span(self):
5456
"""Check that the interceptor wraps calls with spans server-side."""
5557

56-
@contextmanager
57-
def mock_start_as_current_span(*args, **kwargs):
58-
yield mock.Mock(spec=trace.Span)
59-
6058
# Intercept gRPC calls...
61-
tracer = mock.Mock(spec=trace.Tracer)
62-
tracer.start_as_current_span.side_effect = mock_start_as_current_span
63-
interceptor = server_interceptor(tracer)
59+
interceptor = server_interceptor(self.tracer)
6460

6561
# No-op RPC handler
6662
def handler(request, context):
@@ -84,9 +80,12 @@ def handler(request, context):
8480
finally:
8581
server.stop(None)
8682

87-
tracer.start_as_current_span.assert_called_once_with(
88-
name="", kind=trace.SpanKind.SERVER
89-
)
83+
spans_list = self.memory_exporter.get_finished_spans()
84+
self.assertEqual(len(spans_list), 1)
85+
span = spans_list[0]
86+
87+
self.assertEqual(span.name, "")
88+
self.assertIs(span.kind, trace.SpanKind.SERVER)
9089

9190
def test_span_lifetime(self):
9291
"""Check that the span is active for the duration of the call."""

0 commit comments

Comments
 (0)