@@ -167,14 +167,32 @@ def test_commas(self):
167167 families = text_string_to_metric_families ("""# TYPE a counter
168168# HELP a help
169169a{foo="bar",} 1
170+ a{foo="baz", } 1
170171# TYPE b counter
171172# HELP b help
172173b{,} 2
174+ # TYPE c counter
175+ # HELP c help
176+ c{ ,} 3
177+ # TYPE d counter
178+ # HELP d help
179+ d{, } 4
173180""" )
174181 a = CounterMetricFamily ("a" , "help" , labels = ["foo" ])
175182 a .add_metric (["bar" ], 1 )
183+ a .add_metric (["baz" ], 1 )
176184 b = CounterMetricFamily ("b" , "help" , value = 2 )
177- self .assertEqual ([a , b ], list (families ))
185+ c = CounterMetricFamily ("c" , "help" , value = 3 )
186+ d = CounterMetricFamily ("d" , "help" , value = 4 )
187+ self .assertEqual ([a , b , c , d ], list (families ))
188+
189+ def test_multiple_trailing_commas (self ):
190+ text = """# TYPE a counter
191+ # HELP a help
192+ a{foo="bar",, } 1
193+ """
194+ self .assertRaises (ValueError ,
195+ lambda : list (text_string_to_metric_families (text )))
178196
179197 def test_empty_brackets (self ):
180198 families = text_string_to_metric_families ("""# TYPE a counter
@@ -200,6 +218,50 @@ def test_empty_label(self):
200218 metric_family .add_metric (["" ], 2 )
201219 self .assertEqual ([metric_family ], list (families ))
202220
221+ def test_label_escaping (self ):
222+ for escaped_val , unescaped_val in [
223+ ('foo' , 'foo' ),
224+ ('\\ foo' , '\\ foo' ),
225+ ('\\ \\ foo' , '\\ foo' ),
226+ ('foo\\ \\ ' , 'foo\\ ' ),
227+ ('\\ \\ ' , '\\ ' ),
228+ ('\\ n' , '\n ' ),
229+ ('\\ \\ n' , '\\ n' ),
230+ ('\\ \\ \\ n' , '\\ \n ' ),
231+ ('\\ "' , '"' ),
232+ ('\\ \\ \\ "' , '\\ "' )]:
233+ families = list (text_string_to_metric_families ("""
234+ # TYPE a counter
235+ # HELP a help
236+ a{foo="%s",bar="baz"} 1
237+ """ % escaped_val ))
238+ metric_family = CounterMetricFamily (
239+ "a" , "help" , labels = ["foo" , "bar" ])
240+ metric_family .add_metric ([unescaped_val , "baz" ], 1 )
241+ self .assertEqual ([metric_family ], list (families ))
242+
243+ def test_help_escaping (self ):
244+ for escaped_val , unescaped_val in [
245+ ('foo' , 'foo' ),
246+ ('\\ foo' , '\\ foo' ),
247+ ('\\ \\ foo' , '\\ foo' ),
248+ ('foo\\ ' , 'foo\\ ' ),
249+ ('foo\\ \\ ' , 'foo\\ ' ),
250+ ('\\ n' , '\n ' ),
251+ ('\\ \\ n' , '\\ n' ),
252+ ('\\ \\ \\ n' , '\\ \n ' ),
253+ ('\\ "' , '\\ "' ),
254+ ('\\ \\ "' , '\\ "' ),
255+ ('\\ \\ \\ "' , '\\ \\ "' )]:
256+ families = list (text_string_to_metric_families ("""
257+ # TYPE a counter
258+ # HELP a %s
259+ a{foo="bar"} 1
260+ """ % escaped_val ))
261+ metric_family = CounterMetricFamily ("a" , unescaped_val , labels = ["foo" ])
262+ metric_family .add_metric (["bar" ], 1 )
263+ self .assertEqual ([metric_family ], list (families ))
264+
203265 def test_escaping (self ):
204266 families = text_string_to_metric_families ("""# TYPE a counter
205267# HELP a he\\ n\\ \\ l\\ tp
0 commit comments