| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package mtproto
- import (
- "testing"
- )
- // TestParseMetricLineBraceBoundary pins the contract of the brace-position
- // guard in parseMetricLine (manager.go:425 -> `if end < brace`).
- //
- // Once a '{' is found at index `brace`, the matching '}' must appear AFTER it.
- // A '}' that precedes the '{', or a '{' with no closing '}' at all
- // (strings.IndexByte returns -1, which is < brace), is a malformed line and
- // must yield an error rather than slicing past the brace.
- func TestParseMetricLineBraceBoundary(t *testing.T) {
- t.Run("closing brace before opening brace is malformed", func(t *testing.T) {
- // '}' at index 8 comes before '{' at index 16: end < brace must hold,
- // so this is rejected. Mutating `<` to `>`/`>=` would accept it.
- _, _, _, err := parseMetricLine(`mtg_x_a}_b{direction="x"} 5`)
- if err == nil {
- t.Fatal("expected error for '}' appearing before '{'")
- }
- })
- t.Run("opening brace with no closing brace is malformed", func(t *testing.T) {
- // No '}' at all -> end == -1, which is < brace. Must error.
- // If the guard were dropped/inverted the code would slice line[brace+1:-1]
- // and panic; asserting a clean error keeps that contract.
- _, _, _, err := parseMetricLine(`mtg_traffic{direction="x" 5`)
- if err == nil {
- t.Fatal("expected error for '{' without a closing '}'")
- }
- })
- t.Run("well-formed braces are accepted", func(t *testing.T) {
- // '{' at index 11, '}' at index 25: end > brace, so the guard must NOT
- // fire and parsing must succeed. Guards against a mutant that always errors.
- name, labels, val, err := parseMetricLine(`mtg_traffic{direction="up"} 42`)
- if err != nil {
- t.Fatalf("well-formed line should parse: %v", err)
- }
- if name != "mtg_traffic" {
- t.Fatalf("name=%q", name)
- }
- if labels["direction"] != "up" {
- t.Fatalf("labels=%v", labels)
- }
- if val != 42 {
- t.Fatalf("val=%v", val)
- }
- })
- }
- // TestParseMetricLineLabelEqualsBoundary pins the contract of the '=' guard in
- // the per-label loop (manager.go:430 -> `if eq < 0`).
- //
- // - eq < 0 (no '=' in the segment): the segment is skipped, no label added.
- // - eq == 0 (segment begins with '='): the key is empty but the pair is STILL
- // parsed, producing labels[""] = value. The boundary is `< 0`, not `<= 0`.
- func TestParseMetricLineLabelEqualsBoundary(t *testing.T) {
- t.Run("label segment without '=' is skipped, not fatal", func(t *testing.T) {
- // "novalue" has no '=' (eq == -1) and must be skipped. A real key=val
- // segment in the same line must still be parsed. Mutating `< 0` to `> 0`
- // would take kv[:eq] with eq=-1 and panic; mutating away the skip would
- // also corrupt parsing.
- name, labels, val, err := parseMetricLine(`mtg_traffic{novalue,direction="down"} 9`)
- if err != nil {
- t.Fatalf("line with a value-less label should still parse: %v", err)
- }
- if name != "mtg_traffic" {
- t.Fatalf("name=%q", name)
- }
- if _, present := labels["novalue"]; present {
- t.Fatalf("value-less segment must not create a label: %v", labels)
- }
- if labels["direction"] != "down" {
- t.Fatalf("real label must still be parsed: %v", labels)
- }
- if val != 9 {
- t.Fatalf("val=%v", val)
- }
- })
- t.Run("label segment beginning with '=' is parsed as empty key", func(t *testing.T) {
- // "=onlyvalue": eq == 0. Since the guard is `< 0`, this is NOT skipped:
- // it yields labels[""] = "onlyvalue". A mutant changing `< 0` to `<= 0`
- // would skip it, losing the empty-key entry.
- _, labels, _, err := parseMetricLine(`mtg_traffic{=onlyvalue} 1`)
- if err != nil {
- t.Fatalf("segment with empty key should still parse: %v", err)
- }
- v, present := labels[""]
- if !present {
- t.Fatalf("eq==0 segment must produce an empty-key label: %v", labels)
- }
- if v != "onlyvalue" {
- t.Fatalf("empty-key label value=%q", v)
- }
- })
- }
|