Skip to content

Commit 9906a13

Browse files
committed
Began adding tests.
1 parent 8cd6ce1 commit 9906a13

File tree

9 files changed

+160
-15
lines changed

9 files changed

+160
-15
lines changed
Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,35 @@
11
"""Exposes API methods to callers from the package name."""
22

3-
from opentelemetry.instrumentation._blobupload.api.constants import NOT_UPLOADED
43
from opentelemetry.instrumentation._blobupload.api.blob import Blob
5-
from opentelemetry.instrumentation._blobupload.api.blob_uploader import BlobUploader
6-
from opentelemetry.instrumentation._blobupload.api.content_type import detect_content_type
4+
from opentelemetry.instrumentation._blobupload.api.blob_uploader import (
5+
BlobUploader,
6+
)
7+
from opentelemetry.instrumentation._blobupload.api.constants import (
8+
NOT_UPLOADED,
9+
)
10+
from opentelemetry.instrumentation._blobupload.api.content_type import (
11+
detect_content_type,
12+
)
713
from opentelemetry.instrumentation._blobupload.api.labels import (
8-
generate_labels_for_span,
914
generate_labels_for_event,
10-
generate_labels_for_span_event
15+
generate_labels_for_span,
16+
generate_labels_for_span_event,
1117
)
1218
from opentelemetry.instrumentation._blobupload.api.provider import (
1319
BlobUploaderProvider,
20+
get_blob_uploader,
1421
set_blob_uploader_provider,
15-
get_glob_uploader
1622
)
23+
24+
__all__ = [
25+
Blob,
26+
BlobUploader,
27+
NOT_UPLOADED,
28+
detect_content_type,
29+
generate_labels_for_event,
30+
generate_labels_for_span,
31+
generate_labels_for_span_event,
32+
BlobUploaderProvider,
33+
get_blob_uploader,
34+
set_blob_uploader_provider,
35+
]

opentelemetry-instrumentation/src/opentelemetry/instrumentation/_blobupload/api/blob.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Dict, Optional
2+
13
import base64
24

35
class Blob(object):
@@ -11,7 +13,7 @@ class Blob(object):
1113
the object such as {"trace_id": "...", "span_id": "...", "filename": ...}
1214
"""
1315

14-
def __init__(self, raw_bytes: bytes, content_type: Optional[str]=None, labels: Optional[dict]=None):
16+
def __init__(self, raw_bytes: bytes, content_type: Optional[str]=None, labels: Optional[Dict[str, str]]=None):
1517
"""Initialize the blob with an explicit set of properties.
1618
1719
Args:
@@ -24,7 +26,7 @@ def __init__(self, raw_bytes: bytes, content_type: Optional[str]=None, labels: O
2426
self._labels = labels or {}
2527

2628
@staticmethod
27-
def from_data_uri(cls, uri: str, labels: Optional[dict]=None) -> Blob:
29+
def from_data_uri(cls, uri: str, labels: Optional[dict]=None) -> 'Blob':
2830
"""Instantiate a blob from a 'data:...' URI.
2931
3032
Args:
@@ -67,6 +69,6 @@ def content_type(self) -> Optional[str]:
6769
return self._content_type
6870

6971
@property
70-
def labels(self) -> dict:
72+
def labels(self) -> Dict[str, str]:
7173
"""Returns the key/value metadata of this Blob."""
7274
return _frozendict(self._labels)

opentelemetry-instrumentation/src/opentelemetry/instrumentation/_blobupload/api/blob_uploader.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from opentelemetry.instrumentation._blobupload.api.constants import NOT_UPLOADED
66
from opentelemetry.instrumentation._blobupload.api.blob import Blob
77

8+
89
class BlobUploader(abc.ABC):
910
"""Pure abstract base class representing a component that does blob uploading."""
1011

opentelemetry-instrumentation/src/opentelemetry/instrumentation/_blobupload/api/content_type.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
class _FallBackModule(object):
66
"""Class that is shaped like the portion of 'magic' we need."""
77

8-
def from_buffer(self, raw_bytes):
8+
def from_buffer(self, raw_bytes, mime=True):
99
"""Fallback, subpar implementation of 'from_buffer'."""
1010
return 'application/octet-stream'
1111

@@ -21,4 +21,4 @@ def from_buffer(self, raw_bytes):
2121

2222
def detect_content_type(raw_bytes: bytes) -> str:
2323
"""Attempts to infer the content type of the specified data."""
24-
return _module.from_buffer(raw_bytes)
24+
return _module.from_buffer(raw_bytes, mime=True)

opentelemetry-instrumentation/src/opentelemetry/instrumentation/_blobupload/api/labels.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Provides utilities for providing basic identifying labels for blobs."""
22

3-
def generate_labels_for_span(trace_id, span_id) -> dict:
3+
def generate_labels_for_span(trace_id: str, span_id: str) -> dict:
44
"""Returns metadata for a span."""
55
return {
66
'otel_type': 'span',
@@ -9,7 +9,7 @@ def generate_labels_for_span(trace_id, span_id) -> dict:
99
}
1010

1111

12-
def generate_labels_for_event(trace_id, span_id, event_name) -> dict:
12+
def generate_labels_for_event(trace_id: str, span_id: str, event_name: str) -> dict:
1313
"""Returns metadata for an event."""
1414
result = generate_labels_for_span(trace_id, span_id)
1515
result.update({
@@ -19,7 +19,7 @@ def generate_labels_for_event(trace_id, span_id, event_name) -> dict:
1919
return result
2020

2121

22-
def generate_labels_for_span_event(trace_id, span_id, event_name, event_index) -> dict:
22+
def generate_labels_for_span_event(trace_id: str, span_id: str, event_name: str, event_index: int) -> dict:
2323
"""Returns metadata for a span event."""
2424
result = generate_labels_for_event(trace_id, span_id, event_name)
2525
result.update({

opentelemetry-instrumentation/src/opentelemetry/instrumentation/_blobupload/api/provider.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
from typing import Optional
2+
13
import abc
24
import logging
35

4-
from opentelemetry.instrumentation._blobupload.api import BlobUploader
6+
from opentelemetry.instrumentation._blobupload.api.blob import Blob
7+
from opentelemetry.instrumentation._blobupload.api.blob_uploader import BlobUploader
58

69

710
_logger = logging.getLogger(__name__)

opentelemetry-instrumentation/src/opentelemetry/instrumentation/_blobupload/backend/registry.py

Whitespace-only changes.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#! /usr/bin/env python3
2+
3+
if __name__ == '__main__':
4+
import sys
5+
sys.path.append('../../../src')
6+
7+
from opentelemetry.instrumentation._blobupload.api import detect_content_type
8+
from PIL import Image
9+
10+
import io
11+
import unittest
12+
13+
14+
def create_test_image(format):
15+
"""Helper for creating a PIL Image for verifying image format support."""
16+
test_img = Image.new('RGB', (2, 2))
17+
output_buffer = io.BytesIO()
18+
test_img.save(output_buffer, format)
19+
result = output_buffer.getvalue()
20+
output_buffer.close()
21+
test_img.close()
22+
return result
23+
24+
25+
class TestContentType(unittest.TestCase):
26+
27+
def test_detects_plaintext(self):
28+
input = 'this is just regular text'
29+
output = detect_content_type(input.encode())
30+
self.assertEqual(output, 'text/plain')
31+
32+
def test_detects_json(self):
33+
input = '''{
34+
"this": {
35+
"contains": "json"
36+
}
37+
}'''
38+
output = detect_content_type(input.encode())
39+
self.assertEqual(output, 'application/json')
40+
41+
def test_detects_jpeg(self):
42+
input = create_test_image('jpeg')
43+
output = detect_content_type(input)
44+
self.assertEqual(output, 'image/jpeg')
45+
46+
def test_detects_png(self):
47+
input = create_test_image('png')
48+
output = detect_content_type(input)
49+
self.assertEqual(output, 'image/png')
50+
51+
52+
if __name__ == '__main__':
53+
unittest.main()
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#! /usr/bin/env python3
2+
3+
if __name__ == '__main__':
4+
import sys
5+
sys.path.append('../../../src')
6+
7+
from opentelemetry.instrumentation._blobupload.api import (
8+
generate_labels_for_span,
9+
generate_labels_for_event,
10+
generate_labels_for_span_event)
11+
12+
import unittest
13+
14+
15+
class TestLabels(unittest.TestCase):
16+
17+
def test_generate_labels_for_span(self):
18+
trace_id = 'test-trace-id'
19+
span_id = 'test-span-id'
20+
labels = generate_labels_for_span(
21+
trace_id=trace_id,
22+
span_id=span_id
23+
)
24+
self.assertEqual(labels, {
25+
'otel_type': 'span',
26+
'trace_id': 'test-trace-id',
27+
'span_id': 'test-span-id'
28+
})
29+
30+
def test_generate_labels_for_event(self):
31+
trace_id = 'test-trace-id'
32+
span_id = 'test-span-id'
33+
event_name = 'some-event'
34+
labels = generate_labels_for_event(
35+
trace_id=trace_id,
36+
span_id=span_id,
37+
event_name=event_name
38+
)
39+
self.assertEqual(labels, {
40+
'otel_type': 'event',
41+
'trace_id': 'test-trace-id',
42+
'span_id': 'test-span-id',
43+
'event_name': 'some-event'
44+
})
45+
46+
def test_generate_labels_for_span_event(self):
47+
trace_id = 'test-trace-id'
48+
span_id = 'test-span-id'
49+
event_name = 'some-event'
50+
event_index = 2
51+
labels = generate_labels_for_span_event(
52+
trace_id=trace_id,
53+
span_id=span_id,
54+
event_name=event_name,
55+
event_index=event_index
56+
)
57+
self.assertEqual(labels, {
58+
'otel_type': 'span_event',
59+
'trace_id': 'test-trace-id',
60+
'span_id': 'test-span-id',
61+
'event_name': 'some-event',
62+
'event_index': 2
63+
})
64+
65+
66+
if __name__ == '__main__':
67+
unittest.main()

0 commit comments

Comments
 (0)