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  })