go_study/fabric-main/common/metrics/internal/namer/namer_test.go

174 lines
4.9 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package namer
import (
"github.com/hyperledger/fabric/common/metrics"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("This is the thing", func() {
var n *Namer
BeforeEach(func() {
n = &Namer{
namespace: "namespace",
subsystem: "subsystem",
name: "name",
nameFormat: "prefix.%{#namespace}.%{#subsystem}.%{#name}.%{alpha}.bravo.%{bravo}.suffix",
labelNames: map[string]struct{}{
"alpha": {},
"bravo": {},
},
}
})
It("formats names from labels", func() {
name := n.Format("alpha", "a", "bravo", "b")
Expect(name).To(Equal("prefix.namespace.subsystem.name.a.bravo.b.suffix"))
})
Context("when the wrong labels are provided", func() {
It("panics", func() {
recovered := func() (recovered interface{}) {
defer func() { recovered = recover() }()
n.Format("charlie", "c", "delta", "d")
return
}()
Expect(recovered).To(Equal("invalid label name: charlie"))
})
})
Context("when the format references an unknown label", func() {
BeforeEach(func() {
n.nameFormat = "%{bad_label}"
})
It("panics", func() {
recovered := func() (recovered interface{}) {
defer func() { recovered = recover() }()
n.Format("alpha", "a", "bravo", "b")
return
}()
Expect(recovered).To(Equal("invalid label in name format: bad_label"))
})
})
Context("when labels are missing", func() {
It("uses unknown for the missing value", func() {
name := n.Format("alpha", "a", "bravo")
Expect(name).To(Equal("prefix.namespace.subsystem.name.a.bravo.unknown.suffix"))
})
})
Context("when label values contain invalid characters", func() {
It("replaces them with underscores", func() {
name := n.Format("alpha", ":colon:colon:", "bravo", "|bar|bar|")
Expect(name).To(Equal("prefix.namespace.subsystem.name._colon_colon_.bravo._bar_bar_.suffix"))
})
})
Context("when label values contain new line, spaces, or tabs", func() {
It("replaces them with underscores", func() {
name := n.Format("alpha", "a\nb\tc", "bravo", "b c")
Expect(name).To(Equal("prefix.namespace.subsystem.name.a_b_c.bravo.b_c.suffix"))
})
})
Context("when label values contain periods", func() {
It("replaces them with underscores", func() {
name := n.Format("alpha", "period.period", "bravo", "...")
Expect(name).To(Equal("prefix.namespace.subsystem.name.period_period.bravo.___.suffix"))
})
})
Context("when label values contain multi-byte utf8 runes", func() {
It("leaves them alone", func() {
name := n.Format("alpha", "Ʊpsilon", "bravo", "b")
Expect(name).To(Equal("prefix.namespace.subsystem.name.Ʊpsilon.bravo.b.suffix"))
})
})
DescribeTable("#fqname",
func(n *Namer, expectedName string) {
n.nameFormat = "%{#fqname}"
Expect(n.Format()).To(Equal(expectedName))
},
Entry("missing nothing", &Namer{namespace: "namespace", subsystem: "subsystem", name: "name"}, "namespace.subsystem.name"),
Entry("missing namespace", &Namer{namespace: "", subsystem: "subsystem", name: "name"}, "subsystem.name"),
Entry("missing subsystem", &Namer{namespace: "namespace", subsystem: "", name: "name"}, "namespace.name"),
Entry("missing namespace and subsystem", &Namer{namespace: "", subsystem: "", name: "name"}, "name"),
)
Describe("NewCounterNamer", func() {
It("creates a namer from CounterOpts", func() {
namer := NewCounterNamer(metrics.CounterOpts{
Namespace: "namespace",
Subsystem: "subsystem",
Name: "name",
StatsdFormat: "name-format",
LabelNames: []string{"label-one", "label-two"},
})
Expect(namer).To(Equal(&Namer{
namespace: "namespace",
subsystem: "subsystem",
name: "name",
nameFormat: "name-format",
labelNames: map[string]struct{}{
"label-one": {},
"label-two": {},
},
}))
})
})
Describe("NewGaugeNamer", func() {
It("creates a namer from GaugeOpts", func() {
namer := NewGaugeNamer(metrics.GaugeOpts{
Namespace: "namespace",
Subsystem: "subsystem",
Name: "name",
StatsdFormat: "name-format",
LabelNames: []string{"label-one", "label-two"},
})
Expect(namer).To(Equal(&Namer{
namespace: "namespace",
subsystem: "subsystem",
name: "name",
nameFormat: "name-format",
labelNames: map[string]struct{}{
"label-one": {},
"label-two": {},
},
}))
})
})
Describe("NewHistogramNamer", func() {
It("creates a namer from HistogramOpts", func() {
namer := NewHistogramNamer(metrics.HistogramOpts{
Namespace: "namespace",
Subsystem: "subsystem",
Name: "name",
StatsdFormat: "name-format",
LabelNames: []string{"label-one", "label-two"},
})
Expect(namer).To(Equal(&Namer{
namespace: "namespace",
subsystem: "subsystem",
name: "name",
nameFormat: "name-format",
labelNames: map[string]struct{}{
"label-one": {},
"label-two": {},
},
}))
})
})
})