github.com/ethereum/go-ethereum@v1.14.3/metrics/registry_test.go (about)

     1  package metrics
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  )
     7  
     8  func BenchmarkRegistry(b *testing.B) {
     9  	r := NewRegistry()
    10  	r.Register("foo", NewCounter())
    11  	b.ResetTimer()
    12  	for i := 0; i < b.N; i++ {
    13  		r.Each(func(string, interface{}) {})
    14  	}
    15  }
    16  
    17  func BenchmarkRegistryGetOrRegisterParallel_8(b *testing.B) {
    18  	benchmarkRegistryGetOrRegisterParallel(b, 8)
    19  }
    20  
    21  func BenchmarkRegistryGetOrRegisterParallel_32(b *testing.B) {
    22  	benchmarkRegistryGetOrRegisterParallel(b, 32)
    23  }
    24  
    25  func benchmarkRegistryGetOrRegisterParallel(b *testing.B, amount int) {
    26  	r := NewRegistry()
    27  	b.ResetTimer()
    28  	var wg sync.WaitGroup
    29  	for i := 0; i < amount; i++ {
    30  		wg.Add(1)
    31  		go func() {
    32  			for i := 0; i < b.N; i++ {
    33  				r.GetOrRegister("foo", NewMeter)
    34  			}
    35  			wg.Done()
    36  		}()
    37  	}
    38  	wg.Wait()
    39  }
    40  
    41  func TestRegistry(t *testing.T) {
    42  	r := NewRegistry()
    43  	r.Register("foo", NewCounter())
    44  	i := 0
    45  	r.Each(func(name string, iface interface{}) {
    46  		i++
    47  		if name != "foo" {
    48  			t.Fatal(name)
    49  		}
    50  		if _, ok := iface.(Counter); !ok {
    51  			t.Fatal(iface)
    52  		}
    53  	})
    54  	if i != 1 {
    55  		t.Fatal(i)
    56  	}
    57  	r.Unregister("foo")
    58  	i = 0
    59  	r.Each(func(string, interface{}) { i++ })
    60  	if i != 0 {
    61  		t.Fatal(i)
    62  	}
    63  }
    64  
    65  func TestRegistryDuplicate(t *testing.T) {
    66  	r := NewRegistry()
    67  	if err := r.Register("foo", NewCounter()); nil != err {
    68  		t.Fatal(err)
    69  	}
    70  	if err := r.Register("foo", NewGauge()); nil == err {
    71  		t.Fatal(err)
    72  	}
    73  	i := 0
    74  	r.Each(func(name string, iface interface{}) {
    75  		i++
    76  		if _, ok := iface.(Counter); !ok {
    77  			t.Fatal(iface)
    78  		}
    79  	})
    80  	if i != 1 {
    81  		t.Fatal(i)
    82  	}
    83  }
    84  
    85  func TestRegistryGet(t *testing.T) {
    86  	r := NewRegistry()
    87  	r.Register("foo", NewCounter())
    88  	if count := r.Get("foo").(Counter).Snapshot().Count(); count != 0 {
    89  		t.Fatal(count)
    90  	}
    91  	r.Get("foo").(Counter).Inc(1)
    92  	if count := r.Get("foo").(Counter).Snapshot().Count(); count != 1 {
    93  		t.Fatal(count)
    94  	}
    95  }
    96  
    97  func TestRegistryGetOrRegister(t *testing.T) {
    98  	r := NewRegistry()
    99  
   100  	// First metric wins with GetOrRegister
   101  	_ = r.GetOrRegister("foo", NewCounter())
   102  	m := r.GetOrRegister("foo", NewGauge())
   103  	if _, ok := m.(Counter); !ok {
   104  		t.Fatal(m)
   105  	}
   106  
   107  	i := 0
   108  	r.Each(func(name string, iface interface{}) {
   109  		i++
   110  		if name != "foo" {
   111  			t.Fatal(name)
   112  		}
   113  		if _, ok := iface.(Counter); !ok {
   114  			t.Fatal(iface)
   115  		}
   116  	})
   117  	if i != 1 {
   118  		t.Fatal(i)
   119  	}
   120  }
   121  
   122  func TestRegistryGetOrRegisterWithLazyInstantiation(t *testing.T) {
   123  	r := NewRegistry()
   124  
   125  	// First metric wins with GetOrRegister
   126  	_ = r.GetOrRegister("foo", NewCounter)
   127  	m := r.GetOrRegister("foo", NewGauge)
   128  	if _, ok := m.(Counter); !ok {
   129  		t.Fatal(m)
   130  	}
   131  
   132  	i := 0
   133  	r.Each(func(name string, iface interface{}) {
   134  		i++
   135  		if name != "foo" {
   136  			t.Fatal(name)
   137  		}
   138  		if _, ok := iface.(Counter); !ok {
   139  			t.Fatal(iface)
   140  		}
   141  	})
   142  	if i != 1 {
   143  		t.Fatal(i)
   144  	}
   145  }
   146  
   147  func TestRegistryUnregister(t *testing.T) {
   148  	l := len(arbiter.meters)
   149  	r := NewRegistry()
   150  	r.Register("foo", NewCounter())
   151  	r.Register("bar", NewMeter())
   152  	r.Register("baz", NewTimer())
   153  	if len(arbiter.meters) != l+2 {
   154  		t.Errorf("arbiter.meters: %d != %d\n", l+2, len(arbiter.meters))
   155  	}
   156  	r.Unregister("foo")
   157  	r.Unregister("bar")
   158  	r.Unregister("baz")
   159  	if len(arbiter.meters) != l {
   160  		t.Errorf("arbiter.meters: %d != %d\n", l+2, len(arbiter.meters))
   161  	}
   162  }
   163  
   164  func TestPrefixedChildRegistryGetOrRegister(t *testing.T) {
   165  	r := NewRegistry()
   166  	pr := NewPrefixedChildRegistry(r, "prefix.")
   167  
   168  	_ = pr.GetOrRegister("foo", NewCounter())
   169  
   170  	i := 0
   171  	r.Each(func(name string, m interface{}) {
   172  		i++
   173  		if name != "prefix.foo" {
   174  			t.Fatal(name)
   175  		}
   176  	})
   177  	if i != 1 {
   178  		t.Fatal(i)
   179  	}
   180  }
   181  
   182  func TestPrefixedRegistryGetOrRegister(t *testing.T) {
   183  	r := NewPrefixedRegistry("prefix.")
   184  
   185  	_ = r.GetOrRegister("foo", NewCounter())
   186  
   187  	i := 0
   188  	r.Each(func(name string, m interface{}) {
   189  		i++
   190  		if name != "prefix.foo" {
   191  			t.Fatal(name)
   192  		}
   193  	})
   194  	if i != 1 {
   195  		t.Fatal(i)
   196  	}
   197  }
   198  
   199  func TestPrefixedRegistryRegister(t *testing.T) {
   200  	r := NewPrefixedRegistry("prefix.")
   201  	err := r.Register("foo", NewCounter())
   202  	c := NewCounter()
   203  	Register("bar", c)
   204  	if err != nil {
   205  		t.Fatal(err.Error())
   206  	}
   207  
   208  	i := 0
   209  	r.Each(func(name string, m interface{}) {
   210  		i++
   211  		if name != "prefix.foo" {
   212  			t.Fatal(name)
   213  		}
   214  	})
   215  	if i != 1 {
   216  		t.Fatal(i)
   217  	}
   218  }
   219  
   220  func TestPrefixedRegistryUnregister(t *testing.T) {
   221  	r := NewPrefixedRegistry("prefix.")
   222  
   223  	_ = r.Register("foo", NewCounter())
   224  
   225  	i := 0
   226  	r.Each(func(name string, m interface{}) {
   227  		i++
   228  		if name != "prefix.foo" {
   229  			t.Fatal(name)
   230  		}
   231  	})
   232  	if i != 1 {
   233  		t.Fatal(i)
   234  	}
   235  
   236  	r.Unregister("foo")
   237  
   238  	i = 0
   239  	r.Each(func(name string, m interface{}) {
   240  		i++
   241  	})
   242  
   243  	if i != 0 {
   244  		t.Fatal(i)
   245  	}
   246  }
   247  
   248  func TestPrefixedRegistryGet(t *testing.T) {
   249  	pr := NewPrefixedRegistry("prefix.")
   250  	name := "foo"
   251  	pr.Register(name, NewCounter())
   252  
   253  	fooCounter := pr.Get(name)
   254  	if fooCounter == nil {
   255  		t.Fatal(name)
   256  	}
   257  }
   258  
   259  func TestPrefixedChildRegistryGet(t *testing.T) {
   260  	r := NewRegistry()
   261  	pr := NewPrefixedChildRegistry(r, "prefix.")
   262  	name := "foo"
   263  	pr.Register(name, NewCounter())
   264  	fooCounter := pr.Get(name)
   265  	if fooCounter == nil {
   266  		t.Fatal(name)
   267  	}
   268  }
   269  
   270  func TestChildPrefixedRegistryRegister(t *testing.T) {
   271  	r := NewPrefixedChildRegistry(DefaultRegistry, "prefix.")
   272  	err := r.Register("foo", NewCounter())
   273  	c := NewCounter()
   274  	Register("bar", c)
   275  	if err != nil {
   276  		t.Fatal(err.Error())
   277  	}
   278  
   279  	i := 0
   280  	r.Each(func(name string, m interface{}) {
   281  		i++
   282  		if name != "prefix.foo" {
   283  			t.Fatal(name)
   284  		}
   285  	})
   286  	if i != 1 {
   287  		t.Fatal(i)
   288  	}
   289  }
   290  
   291  func TestChildPrefixedRegistryOfChildRegister(t *testing.T) {
   292  	r := NewPrefixedChildRegistry(NewRegistry(), "prefix.")
   293  	r2 := NewPrefixedChildRegistry(r, "prefix2.")
   294  	err := r.Register("foo2", NewCounter())
   295  	if err != nil {
   296  		t.Fatal(err.Error())
   297  	}
   298  	err = r2.Register("baz", NewCounter())
   299  	if err != nil {
   300  		t.Fatal(err.Error())
   301  	}
   302  	c := NewCounter()
   303  	Register("bars", c)
   304  
   305  	i := 0
   306  	r2.Each(func(name string, m interface{}) {
   307  		i++
   308  		if name != "prefix.prefix2.baz" {
   309  			t.Fatal(name)
   310  		}
   311  	})
   312  	if i != 1 {
   313  		t.Fatal(i)
   314  	}
   315  }
   316  
   317  func TestWalkRegistries(t *testing.T) {
   318  	r := NewPrefixedChildRegistry(NewRegistry(), "prefix.")
   319  	r2 := NewPrefixedChildRegistry(r, "prefix2.")
   320  	err := r.Register("foo2", NewCounter())
   321  	if err != nil {
   322  		t.Fatal(err.Error())
   323  	}
   324  	err = r2.Register("baz", NewCounter())
   325  	if err != nil {
   326  		t.Fatal(err.Error())
   327  	}
   328  	c := NewCounter()
   329  	Register("bars", c)
   330  
   331  	_, prefix := findPrefix(r2, "")
   332  	if prefix != "prefix.prefix2." {
   333  		t.Fatal(prefix)
   334  	}
   335  }