1- from dataclasses import dataclass
1+ from __future__ import annotations
2+
23import random
34import re
45import typing as t
56
67
8+ if t .TYPE_CHECKING :
9+ from ddtrace .trace import Span
10+
11+
712DDTESTOPT_ROOT_SPAN_RESOURCE = "ddtestpy_root_span"
813
914
@@ -21,15 +26,52 @@ def asbool(value: t.Union[str, bool, None]) -> bool:
2126 return value .lower () in ("true" , "1" )
2227
2328
29+ def ensure_text (s : t .Any ) -> str :
30+ if isinstance (s , str ):
31+ return s
32+ if isinstance (s , bytes ):
33+ return s .decode ("utf-8" , errors = "ignore" )
34+ return str (s )
35+
36+
2437_RE_URL = re .compile (r"(https?://|ssh://)[^/]*@" )
2538
2639
2740def _filter_sensitive_info (url : t .Optional [str ]) -> t .Optional [str ]:
2841 return _RE_URL .sub ("\\ 1" , url ) if url is not None else None
2942
3043
31- @dataclass
32- class TestContext :
44+ class TestContext (t .Protocol ):
3345 span_id : int
3446 trace_id : int
35- __test__ = False
47+
48+ def get_tags (self ) -> t .Dict [str , str ]: ...
49+
50+ def get_metrics (self ) -> t .Dict [str , float ]: ...
51+
52+
53+ class PlainTestContext (TestContext ):
54+ def __init__ (self , span_id : t .Optional [int ] = None , trace_id : t .Optional [int ] = None ):
55+ self .span_id = span_id or _gen_item_id ()
56+ self .trace_id = trace_id or _gen_item_id ()
57+
58+ def get_tags (self ) -> t .Dict [str , str ]:
59+ return {}
60+
61+ def get_metrics (self ) -> t .Dict [str , float ]:
62+ return {}
63+
64+
65+ class DDTraceTestContext (TestContext ):
66+ def __init__ (self , span : Span ):
67+ self .trace_id = span .trace_id % (1 << 64 )
68+ self .span_id = span .span_id % (1 << 64 )
69+ self ._span = span
70+
71+ def get_tags (self ) -> t .Dict [str , str ]:
72+ # DEV: in ddtrace < 4.x, key names can be bytes.
73+ return {ensure_text (k ): v for k , v in self ._span .get_tags ().items ()}
74+
75+ def get_metrics (self ) -> t .Dict [str , float ]:
76+ # DEV: in ddtrace < 4.x, key names can be bytes.
77+ return {ensure_text (k ): v for k , v in self ._span .get_metrics ().items ()}
0 commit comments