1717import unittest
1818
1919from opentelemetry .attributes import (
20+ _clean_attribute_value ,
21+ _clean_attributes ,
2022 _create_immutable_attributes ,
21- _filter_attributes ,
22- _is_valid_attribute_value ,
2323)
2424
2525
2626class TestAttributes (unittest .TestCase ):
27- def test_is_valid_attribute_value (self ):
28- self .assertFalse (_is_valid_attribute_value ([1 , 2 , 3.4 , "ss" , 4 ]))
29- self .assertFalse (_is_valid_attribute_value ([dict (), 1 , 2 , 3.4 , 4 ]))
30- self .assertFalse (_is_valid_attribute_value (["sw" , "lf" , 3.4 , "ss" ]))
31- self .assertFalse (_is_valid_attribute_value ([1 , 2 , 3.4 , 5 ]))
32- self .assertFalse (_is_valid_attribute_value (dict ()))
33- self .assertTrue (_is_valid_attribute_value (True ))
34- self .assertTrue (_is_valid_attribute_value ("hi" ))
35- self .assertTrue (_is_valid_attribute_value (3.4 ))
36- self .assertTrue (_is_valid_attribute_value (15 ))
37- self .assertTrue (_is_valid_attribute_value ([1 , 2 , 3 , 5 ]))
38- self .assertTrue (_is_valid_attribute_value ([1.2 , 2.3 , 3.4 , 4.5 ]))
39- self .assertTrue (_is_valid_attribute_value ([True , False ]))
40- self .assertTrue (_is_valid_attribute_value (["ss" , "dw" , "fw" ]))
41- self .assertTrue (_is_valid_attribute_value ([]))
42- # None in sequences are valid
43- self .assertTrue (_is_valid_attribute_value (["A" , None , None ]))
44- self .assertTrue (_is_valid_attribute_value (["A" , None , None , "B" ]))
45- self .assertTrue (_is_valid_attribute_value ([None , None ]))
46- self .assertFalse (_is_valid_attribute_value (["A" , None , 1 ]))
47- self .assertFalse (_is_valid_attribute_value ([None , "A" , None , 1 ]))
27+ def assertCleanAttr (self , value , valid ):
28+ # pylint: disable=protected-access
29+ is_valid , cleaned = _clean_attribute_value (value , None )
30+ self .assertEqual (is_valid , valid )
31+ self .assertEqual (cleaned , value if valid else None )
4832
49- def test_filter_attributes (self ):
33+ def test_validate_attribute_value (self ):
34+ test_cases = [
35+ (
36+ [1 , 2 , 3.4 , "ss" , 4 ],
37+ False ,
38+ ),
39+ (
40+ [dict (), 1 , 2 , 3.4 , 4 ],
41+ False ,
42+ ),
43+ (
44+ ["sw" , "lf" , 3.4 , "ss" ],
45+ False ,
46+ ),
47+ (
48+ [1 , 2 , 3.4 , 5 ],
49+ False ,
50+ ),
51+ (
52+ dict (),
53+ False ,
54+ ),
55+ (
56+ True ,
57+ True ,
58+ ),
59+ (
60+ "hi" ,
61+ True ,
62+ ),
63+ (
64+ 3.4 ,
65+ True ,
66+ ),
67+ (
68+ 15 ,
69+ True ,
70+ ),
71+ (
72+ (1 , 2 , 3 , 5 ),
73+ True ,
74+ ),
75+ (
76+ (1.2 , 2.3 , 3.4 , 4.5 ),
77+ True ,
78+ ),
79+ (
80+ (True , False ),
81+ True ,
82+ ),
83+ (
84+ ("ss" , "dw" , "fw" ),
85+ True ,
86+ ),
87+ (
88+ [],
89+ True ,
90+ ),
91+ # None in sequences are valid
92+ (
93+ ("A" , None , None ),
94+ True ,
95+ ),
96+ (
97+ ("A" , None , None , "B" ),
98+ True ,
99+ ),
100+ (
101+ (None , None ),
102+ True ,
103+ ),
104+ (
105+ ["A" , None , 1 ],
106+ False ,
107+ ),
108+ (
109+ [None , "A" , None , 1 ],
110+ False ,
111+ ),
112+ ]
113+
114+ for value , want_valid in test_cases :
115+ # pylint: disable=protected-access
116+ got_valid , cleaned_value = _clean_attribute_value (value , None )
117+ self .assertEqual (got_valid , want_valid )
118+ self .assertIsNone (cleaned_value )
119+
120+ def test_clean_attribute_value_truncate (self ):
121+ test_cases = [
122+ ("a" * 50 , None , None ),
123+ ("a" * 50 , "a" * 10 , 10 ),
124+ ("abc" , "a" , 1 ),
125+ ("abc" * 50 , "abcabcabca" , 10 ),
126+ ("abc" * 50 , "abc" * 50 , 1000 ),
127+ ("abc" * 50 , None , None ),
128+ ([1 , 2 , 3 , 5 ], (1 , 2 , 3 , 5 ), 10 ),
129+ (
130+ [1.2 , 2.3 ],
131+ (
132+ 1.2 ,
133+ 2.3 ,
134+ ),
135+ 20 ,
136+ ),
137+ ([True , False ], (True , False ), 10 ),
138+ ([], None , 10 ),
139+ (True , None , 10 ),
140+ (
141+ 3.4 ,
142+ None ,
143+ True ,
144+ ),
145+ (
146+ 15 ,
147+ None ,
148+ True ,
149+ ),
150+ ]
151+
152+ for value , expected , limit in test_cases :
153+ # pylint: disable=protected-access
154+ valid , cleaned = _clean_attribute_value (value , limit )
155+ self .assertTrue (valid )
156+ self .assertEqual (cleaned , expected )
157+
158+ def test_clean_attributes (self ):
50159 attrs_with_invalid_keys = {
51160 "" : "empty-key" ,
52161 None : "None-value" ,
53162 "attr-key" : "attr-value" ,
54163 }
55- _filter_attributes (attrs_with_invalid_keys )
164+ _clean_attributes (attrs_with_invalid_keys , None )
56165 self .assertTrue (len (attrs_with_invalid_keys ), 1 )
57166 self .assertEqual (attrs_with_invalid_keys , {"attr-key" : "attr-value" })
58167
@@ -66,7 +175,7 @@ def test_filter_attributes(self):
66175 "boolkey" : True ,
67176 "valid-byte-string" : b"hello-otel" ,
68177 }
69- _filter_attributes (attrs_with_invalid_values )
178+ _clean_attributes (attrs_with_invalid_values , None )
70179 self .assertEqual (len (attrs_with_invalid_values ), 5 )
71180 self .assertEqual (
72181 attrs_with_invalid_values ,
0 commit comments