blocky/resolver/metrics_resolver_test.go

97 lines
2.4 KiB
Go

package resolver
import (
"context"
"errors"
"github.com/0xERR0R/blocky/config"
"github.com/0xERR0R/blocky/log"
. "github.com/0xERR0R/blocky/helpertest"
. "github.com/0xERR0R/blocky/model"
"github.com/miekg/dns"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"
"github.com/stretchr/testify/mock"
)
var _ = Describe("MetricResolver", func() {
var (
sut *MetricsResolver
m *mockResolver
ctx context.Context
cancelFn context.CancelFunc
)
Describe("Type", func() {
It("follows conventions", func() {
expectValidResolverType(sut)
})
})
BeforeEach(func() {
ctx, cancelFn = context.WithCancel(context.Background())
DeferCleanup(cancelFn)
sut = NewMetricsResolver(config.Metrics{Enable: true})
m = &mockResolver{}
m.On("Resolve", mock.Anything).Return(&Response{Res: new(dns.Msg)}, nil)
sut.Next(m)
})
Describe("IsEnabled", func() {
It("is true", func() {
Expect(sut.IsEnabled()).Should(BeTrue())
})
})
Describe("LogConfig", func() {
It("should log something", func() {
logger, hook := log.NewMockEntry()
sut.LogConfig(logger)
Expect(hook.Calls).ShouldNot(BeEmpty())
})
})
Describe("Recording prometheus metrics", func() {
Context("Recording request metrics", func() {
When("Request will be performed", func() {
It("Should record metrics", func() {
Expect(sut.Resolve(ctx, newRequestWithClient("example.com.", A, "", "client"))).
Should(
SatisfyAll(
HaveResponseType(ResponseTypeRESOLVED),
HaveReturnCode(dns.RcodeSuccess),
))
cnt, err := sut.totalQueries.GetMetricWith(prometheus.Labels{"client": "client", "type": "A"})
Expect(err).Should(Succeed())
Expect(testutil.ToFloat64(cnt)).Should(BeNumerically("==", 1))
m.AssertExpectations(GinkgoT())
})
})
When("Error occurs while request processing", func() {
BeforeEach(func() {
m = &mockResolver{}
m.On("Resolve", mock.Anything).Return(nil, errors.New("error"))
sut.Next(m)
})
It("Error should be recorded", func() {
_, err := sut.Resolve(ctx, newRequestWithClient("example.com.", A, "", "client"))
Expect(err).Should(HaveOccurred())
Expect(testutil.ToFloat64(sut.totalErrors)).Should(BeNumerically("==", 1))
})
})
})
})
})