github.com/lzy4123/fabric@v2.1.1+incompatible/common/metrics/internal/namer/namer_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package namer 8 9 import ( 10 "github.com/hyperledger/fabric/common/metrics" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/ginkgo/extensions/table" 13 . "github.com/onsi/gomega" 14 ) 15 16 var _ = Describe("This is the thing", func() { 17 var n *Namer 18 19 BeforeEach(func() { 20 n = &Namer{ 21 namespace: "namespace", 22 subsystem: "subsystem", 23 name: "name", 24 nameFormat: "prefix.%{#namespace}.%{#subsystem}.%{#name}.%{alpha}.bravo.%{bravo}.suffix", 25 labelNames: map[string]struct{}{ 26 "alpha": {}, 27 "bravo": {}, 28 }, 29 } 30 }) 31 32 It("formats names from labels", func() { 33 name := n.Format("alpha", "a", "bravo", "b") 34 Expect(name).To(Equal("prefix.namespace.subsystem.name.a.bravo.b.suffix")) 35 }) 36 37 Context("when the wrong labels are provided", func() { 38 It("panics", func() { 39 recovered := func() (recovered interface{}) { 40 defer func() { recovered = recover() }() 41 n.Format("charlie", "c", "delta", "d") 42 return 43 }() 44 Expect(recovered).To(Equal("invalid label name: charlie")) 45 }) 46 }) 47 48 Context("when the format references an unknown label", func() { 49 BeforeEach(func() { 50 n.nameFormat = "%{bad_label}" 51 }) 52 53 It("panics", func() { 54 recovered := func() (recovered interface{}) { 55 defer func() { recovered = recover() }() 56 n.Format("alpha", "a", "bravo", "b") 57 return 58 }() 59 Expect(recovered).To(Equal("invalid label in name format: bad_label")) 60 }) 61 }) 62 63 Context("when labels are missing", func() { 64 It("uses unknown for the missing value", func() { 65 name := n.Format("alpha", "a", "bravo") 66 Expect(name).To(Equal("prefix.namespace.subsystem.name.a.bravo.unknown.suffix")) 67 }) 68 }) 69 70 Context("when label values contain invalid characters", func() { 71 It("replaces them with underscores", func() { 72 name := n.Format("alpha", ":colon:colon:", "bravo", "|bar|bar|") 73 Expect(name).To(Equal("prefix.namespace.subsystem.name._colon_colon_.bravo._bar_bar_.suffix")) 74 }) 75 }) 76 77 Context("when label values contain new line, spaces, or tabs", func() { 78 It("replaces them with underscores", func() { 79 name := n.Format("alpha", "a\nb\tc", "bravo", "b c") 80 Expect(name).To(Equal("prefix.namespace.subsystem.name.a_b_c.bravo.b_c.suffix")) 81 }) 82 }) 83 84 Context("when label values contain periods", func() { 85 It("replaces them with underscores", func() { 86 name := n.Format("alpha", "period.period", "bravo", "...") 87 Expect(name).To(Equal("prefix.namespace.subsystem.name.period_period.bravo.___.suffix")) 88 }) 89 }) 90 91 Context("when label values contain multi-byte utf8 runes", func() { 92 It("leaves them alone", func() { 93 name := n.Format("alpha", "Ʊpsilon", "bravo", "b") 94 Expect(name).To(Equal("prefix.namespace.subsystem.name.Ʊpsilon.bravo.b.suffix")) 95 }) 96 }) 97 98 DescribeTable("#fqname", 99 func(n *Namer, expectedName string) { 100 n.nameFormat = "%{#fqname}" 101 Expect(n.Format()).To(Equal(expectedName)) 102 }, 103 Entry("missing nothing", &Namer{namespace: "namespace", subsystem: "subsystem", name: "name"}, "namespace.subsystem.name"), 104 Entry("missing namespace", &Namer{namespace: "", subsystem: "subsystem", name: "name"}, "subsystem.name"), 105 Entry("missing subsystem", &Namer{namespace: "namespace", subsystem: "", name: "name"}, "namespace.name"), 106 Entry("missing namespace and subsystem", &Namer{namespace: "", subsystem: "", name: "name"}, "name"), 107 ) 108 109 Describe("NewCounterNamer", func() { 110 It("creates a namer from CounterOpts", func() { 111 namer := NewCounterNamer(metrics.CounterOpts{ 112 Namespace: "namespace", 113 Subsystem: "subsystem", 114 Name: "name", 115 StatsdFormat: "name-format", 116 LabelNames: []string{"label-one", "label-two"}, 117 }) 118 Expect(namer).To(Equal(&Namer{ 119 namespace: "namespace", 120 subsystem: "subsystem", 121 name: "name", 122 nameFormat: "name-format", 123 labelNames: map[string]struct{}{ 124 "label-one": {}, 125 "label-two": {}, 126 }, 127 })) 128 }) 129 }) 130 131 Describe("NewGaugeNamer", func() { 132 It("creates a namer from GaugeOpts", func() { 133 namer := NewGaugeNamer(metrics.GaugeOpts{ 134 Namespace: "namespace", 135 Subsystem: "subsystem", 136 Name: "name", 137 StatsdFormat: "name-format", 138 LabelNames: []string{"label-one", "label-two"}, 139 }) 140 Expect(namer).To(Equal(&Namer{ 141 namespace: "namespace", 142 subsystem: "subsystem", 143 name: "name", 144 nameFormat: "name-format", 145 labelNames: map[string]struct{}{ 146 "label-one": {}, 147 "label-two": {}, 148 }, 149 })) 150 }) 151 }) 152 153 Describe("NewHistogramNamer", func() { 154 It("creates a namer from HistogramOpts", func() { 155 namer := NewHistogramNamer(metrics.HistogramOpts{ 156 Namespace: "namespace", 157 Subsystem: "subsystem", 158 Name: "name", 159 StatsdFormat: "name-format", 160 LabelNames: []string{"label-one", "label-two"}, 161 }) 162 Expect(namer).To(Equal(&Namer{ 163 namespace: "namespace", 164 subsystem: "subsystem", 165 name: "name", 166 nameFormat: "name-format", 167 labelNames: map[string]struct{}{ 168 "label-one": {}, 169 "label-two": {}, 170 }, 171 })) 172 }) 173 }) 174 })