From 1f69110731c37f6ba6570752f32047a8c8252edd Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Mon, 7 Aug 2023 16:34:36 +0000 Subject: [PATCH] chore(all): prefer local over imported interfaces --- cmd/dns/main.go | 2 +- internal/dns/loop.go | 2 +- internal/health/client.go | 6 - internal/metrics/setup.go | 8 +- internal/models/server.go | 7 - internal/server/exchange.go | 3 +- internal/server/handler.go | 12 +- internal/server/interfaces.go | 29 ++ internal/setup/cache.go | 7 +- internal/setup/filter.go | 5 +- internal/setup/interfaces.go | 27 +- internal/setup/metrics.go | 10 +- pkg/blockbuilder/builder.go | 7 - pkg/cache/cache.go | 11 - pkg/cache/lru/interfaces.go | 15 + pkg/cache/lru/lru.go | 3 +- pkg/cache/lru/lru_test.go | 2 - pkg/cache/lru/mocks_generate_test.go | 3 + .../{mock_metrics_test.go => mocks_test.go} | 4 +- pkg/cache/lru/settings.go | 3 +- pkg/cache/metrics/interface.go | 49 ---- pkg/cache/noop/interfaces.go | 5 + pkg/cache/noop/noop.go | 3 +- pkg/cache/noop/settings.go | 3 +- pkg/doh/integration_test.go | 10 +- pkg/doh/interfaces.go | 30 ++ pkg/doh/interfaces_test.go | 11 + pkg/doh/metrics/interface.go | 23 -- pkg/doh/metrics/noop/metrics.go | 26 +- pkg/doh/metrics/prometheus/interfaces.go | 6 + pkg/doh/metrics/prometheus/metrics.go | 6 +- pkg/doh/metrics/prometheus/settings.go | 3 +- pkg/doh/mock_cache_test.go | 73 ----- pkg/doh/mock_doh_metrics_test.go | 70 ----- pkg/doh/mock_filter_test.go | 76 ----- pkg/doh/mock_logger_test.go | 82 ------ pkg/doh/mock_middleware_metrics_test.go | 118 -------- pkg/doh/mocks_generate_test.go | 4 + pkg/doh/mocks_local_test.go | 118 ++++++++ pkg/doh/mocks_test.go | 267 ++++++++++++++++++ pkg/doh/server.go | 3 +- pkg/doh/settings.go | 14 +- pkg/dot/dial.go | 6 +- pkg/dot/dial_test.go | 9 +- pkg/dot/integration_test.go | 8 +- pkg/dot/interfaces.go | 29 ++ pkg/dot/interfaces_test.go | 11 + pkg/dot/metrics/interface.go | 22 -- pkg/dot/metrics/noop/metrics.go | 12 +- pkg/dot/mock_cache_test.go | 73 ----- pkg/dot/mock_dot_metrics_test.go | 58 ---- pkg/dot/mock_filter_test.go | 76 ----- pkg/dot/mock_logger_test.go | 82 ------ pkg/dot/mock_middleware_metrics_test.go | 118 -------- pkg/dot/mock_warner_test.go | 46 --- pkg/dot/mocks_generate_test.go | 4 + pkg/dot/mocks_local_test.go | 118 ++++++++ pkg/dot/mocks_test.go | 246 +++++++++++++++- pkg/dot/server.go | 3 +- pkg/dot/settings.go | 14 +- pkg/filter/interface.go | 19 -- pkg/filter/mapfilter/filter.go | 4 +- pkg/filter/mapfilter/interfaces.go | 9 + pkg/filter/mapfilter/settings.go | 3 +- pkg/filter/metrics/interface.go | 20 -- pkg/log/interface.go | 19 -- pkg/middlewares/metrics/interface.go | 21 -- pkg/middlewares/metrics/interfaces.go | 11 + pkg/middlewares/metrics/middleware.go | 4 +- pkg/middlewares/metrics/settings.go | 2 +- 70 files changed, 1001 insertions(+), 1212 deletions(-) delete mode 100644 internal/models/server.go create mode 100644 internal/server/interfaces.go delete mode 100644 pkg/cache/cache.go create mode 100644 pkg/cache/lru/interfaces.go create mode 100644 pkg/cache/lru/mocks_generate_test.go rename pkg/cache/lru/{mock_metrics_test.go => mocks_test.go} (97%) delete mode 100644 pkg/cache/metrics/interface.go create mode 100644 pkg/cache/noop/interfaces.go create mode 100644 pkg/doh/interfaces_test.go delete mode 100644 pkg/doh/metrics/interface.go create mode 100644 pkg/doh/metrics/prometheus/interfaces.go delete mode 100644 pkg/doh/mock_cache_test.go delete mode 100644 pkg/doh/mock_doh_metrics_test.go delete mode 100644 pkg/doh/mock_filter_test.go delete mode 100644 pkg/doh/mock_logger_test.go delete mode 100644 pkg/doh/mock_middleware_metrics_test.go create mode 100644 pkg/doh/mocks_generate_test.go create mode 100644 pkg/doh/mocks_local_test.go create mode 100644 pkg/doh/mocks_test.go create mode 100644 pkg/dot/interfaces_test.go delete mode 100644 pkg/dot/metrics/interface.go delete mode 100644 pkg/dot/mock_cache_test.go delete mode 100644 pkg/dot/mock_dot_metrics_test.go delete mode 100644 pkg/dot/mock_filter_test.go delete mode 100644 pkg/dot/mock_logger_test.go delete mode 100644 pkg/dot/mock_middleware_metrics_test.go delete mode 100644 pkg/dot/mock_warner_test.go create mode 100644 pkg/dot/mocks_generate_test.go create mode 100644 pkg/dot/mocks_local_test.go delete mode 100644 pkg/filter/interface.go create mode 100644 pkg/filter/mapfilter/interfaces.go delete mode 100644 pkg/filter/metrics/interface.go delete mode 100644 pkg/log/interface.go delete mode 100644 pkg/middlewares/metrics/interface.go create mode 100644 pkg/middlewares/metrics/interfaces.go diff --git a/cmd/dns/main.go b/cmd/dns/main.go index 8297c86c..31ae7945 100644 --- a/cmd/dns/main.go +++ b/cmd/dns/main.go @@ -136,7 +136,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, //nolint:cycl client := &http.Client{Timeout: clientTimeout} blockBuilder := setup.BuildBlockBuilder(settings.Block, client) prometheusRegistry := prometheus.NewRegistry() - cacheMetrics, err := setup.CacheMetrics(settings.Metrics, prometheusRegistry) + cacheMetrics, err := setup.BuildCacheMetrics(settings.Metrics, prometheusRegistry) if err != nil { return fmt.Errorf("cache metrics: %w", err) } diff --git a/internal/dns/loop.go b/internal/dns/loop.go index c8d1ecb1..186aa499 100644 --- a/internal/dns/loop.go +++ b/internal/dns/loop.go @@ -140,7 +140,7 @@ func (l *loop) runSubsequent(ctx context.Context, ready chan<- struct{}) (err er func (l *loop) setupAll(ctx context.Context, downloadBlockFiles bool) ( //nolint:ireturn dnsServer Service, err error) { - filterMetrics, err := setup.FilterMetrics(l.settings.Metrics, l.prometheusRegistry) + filterMetrics, err := setup.BuildFilterMetrics(l.settings.Metrics, l.prometheusRegistry) if err != nil { return nil, fmt.Errorf("setting up filter metrics: %w", err) } diff --git a/internal/health/client.go b/internal/health/client.go index 23b60824..16a6ec0c 100644 --- a/internal/health/client.go +++ b/internal/health/client.go @@ -13,12 +13,6 @@ func IsClientMode(args []string) bool { return len(args) > 1 && args[1] == "healthcheck" } -var _ Querier = (*Client)(nil) - -type Querier interface { - Query(ctx context.Context) error -} - type Client struct { *http.Client } diff --git a/internal/metrics/setup.go b/internal/metrics/setup.go index 88585015..74d46c6c 100644 --- a/internal/metrics/setup.go +++ b/internal/metrics/setup.go @@ -11,12 +11,8 @@ import ( "github.com/qdm12/log" ) -type Logger interface { +type ParentLogger interface { New(options ...log.Option) *log.Logger - Debug(s string) - Info(s string) - Warn(s string) - Error(s string) } type PrometheusGatherer interface { @@ -30,7 +26,7 @@ type Service interface { } func New(settings settings.Metrics, //nolint:ireturn - parentLogger Logger, prometheusGatherer PrometheusGatherer) ( + parentLogger ParentLogger, prometheusGatherer PrometheusGatherer) ( service Service, err error) { switch settings.Type { case "noop": diff --git a/internal/models/server.go b/internal/models/server.go deleted file mode 100644 index 2f71be29..00000000 --- a/internal/models/server.go +++ /dev/null @@ -1,7 +0,0 @@ -package models - -import "context" - -type Server interface { - Run(ctx context.Context, crashed chan<- error) -} diff --git a/internal/server/exchange.go b/internal/server/exchange.go index f18dfa9c..ed3f69c9 100644 --- a/internal/server/exchange.go +++ b/internal/server/exchange.go @@ -6,7 +6,6 @@ import ( "net" "github.com/miekg/dns" - "github.com/qdm12/dns/v2/pkg/log" ) type Exchange = func(ctx context.Context, request *dns.Msg) ( @@ -15,7 +14,7 @@ type Exchange = func(ctx context.Context, request *dns.Msg) ( type Dial = func(ctx context.Context, _, _ string) (net.Conn, error) -func NewExchange(name string, dial Dial, warner log.Warner) Exchange { +func NewExchange(name string, dial Dial, warner Warner) Exchange { client := &dns.Client{} return func(ctx context.Context, request *dns.Msg) (response *dns.Msg, err error) { netConn, err := dial(ctx, "", "") diff --git a/internal/server/handler.go b/internal/server/handler.go index 8cf1938f..4c3f218e 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -4,9 +4,6 @@ import ( "context" "github.com/miekg/dns" - "github.com/qdm12/dns/v2/pkg/cache" - "github.com/qdm12/dns/v2/pkg/filter" - "github.com/qdm12/dns/v2/pkg/log" ) var _ dns.Handler = (*Handler)(nil) @@ -14,14 +11,13 @@ var _ dns.Handler = (*Handler)(nil) type Handler struct { ctx context.Context //nolint:containedctx exchange Exchange - filter filter.Interface - cache cache.Interface - logger log.Logger + filter Filter + cache Cache + logger Logger } func New(ctx context.Context, exchange Exchange, - filter filter.Interface, cache cache.Interface, - logger log.Logger) *Handler { + filter Filter, cache Cache, logger Logger) *Handler { return &Handler{ ctx: ctx, exchange: exchange, diff --git a/internal/server/interfaces.go b/internal/server/interfaces.go new file mode 100644 index 00000000..b13cd7c5 --- /dev/null +++ b/internal/server/interfaces.go @@ -0,0 +1,29 @@ +package server + +import ( + "github.com/miekg/dns" + "github.com/qdm12/dns/v2/pkg/filter/update" +) + +type Filter interface { + FilterRequest(request *dns.Msg) (blocked bool) + FilterResponse(response *dns.Msg) (blocked bool) + Update(settings update.Settings) +} + +type Cache interface { + Add(request, response *dns.Msg) + Get(request *dns.Msg) (response *dns.Msg) + Remove(request *dns.Msg) +} + +type Logger interface { + Debug(s string) + Info(s string) + Warner + Error(s string) +} + +type Warner interface { + Warn(s string) +} diff --git a/internal/setup/cache.go b/internal/setup/cache.go index 15513472..147a2cce 100644 --- a/internal/setup/cache.go +++ b/internal/setup/cache.go @@ -7,7 +7,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/qdm12/dns/v2/internal/config/settings" "github.com/qdm12/dns/v2/pkg/cache/lru" - "github.com/qdm12/dns/v2/pkg/cache/metrics" noopmetrics "github.com/qdm12/dns/v2/pkg/cache/metrics/noop" prommetrics "github.com/qdm12/dns/v2/pkg/cache/metrics/prometheus" "github.com/qdm12/dns/v2/pkg/cache/noop" @@ -21,7 +20,7 @@ type Cache interface { } func BuildCache(userSettings settings.Cache, //nolint:ireturn - metrics metrics.Interface) ( + metrics CacheMetrics) ( cache Cache) { switch userSettings.Type { case noop.CacheType: @@ -36,9 +35,9 @@ func BuildCache(userSettings settings.Cache, //nolint:ireturn } } -func CacheMetrics(userSettings settings.Metrics, //nolint:ireturn +func BuildCacheMetrics(userSettings settings.Metrics, //nolint:ireturn registry prometheus.Registerer) ( - metrics metrics.Interface, err error) { + metrics CacheMetrics, err error) { switch userSettings.Type { case noopString: return noopmetrics.New(), nil diff --git a/internal/setup/filter.go b/internal/setup/filter.go index 0c979564..5a984f5c 100644 --- a/internal/setup/filter.go +++ b/internal/setup/filter.go @@ -5,15 +5,14 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/qdm12/dns/v2/internal/config/settings" - "github.com/qdm12/dns/v2/pkg/filter/metrics" noopmetrics "github.com/qdm12/dns/v2/pkg/filter/metrics/noop" prommetrics "github.com/qdm12/dns/v2/pkg/filter/metrics/prometheus" promcommon "github.com/qdm12/dns/v2/pkg/metrics/prometheus" ) -func FilterMetrics(userSettings settings.Metrics, //nolint:ireturn +func BuildFilterMetrics(userSettings settings.Metrics, //nolint:ireturn registry prometheus.Registerer) ( - metrics metrics.Interface, err error) { + metrics FilterMetrics, err error) { switch userSettings.Type { case noopString: return noopmetrics.New(), nil diff --git a/internal/setup/interfaces.go b/internal/setup/interfaces.go index 747d4e37..671ece9e 100644 --- a/internal/setup/interfaces.go +++ b/internal/setup/interfaces.go @@ -19,17 +19,20 @@ type Filter interface { Update(settings update.Settings) } +type FilterMetrics interface { + SetBlockedHostnames(n int) + SetBlockedIPs(n int) + SetBlockedIPPrefixes(n int) + HostnamesFilteredInc(qClass, qType string) + IPsFilteredInc(rrtype string) +} + type Middleware interface { Wrap(next dns.Handler) dns.Handler } type PrometheusRegisterer prometheus.Registerer -type Metrics interface { - DoTMetrics - DoHMetrics -} - type DoTMetrics interface { DoTDialInc(provider, address, outcome string) DNSDialInc(address, outcome string) @@ -40,3 +43,17 @@ type DoHMetrics interface { DoTDialInc(provider, address, outcome string) DNSDialInc(address, outcome string) } + +type CacheMetrics interface { //nolint:interfacebloat + SetCacheType(cacheType string) + CacheInsertInc() + CacheRemoveInc() + CacheMoveInc() + CacheGetEmptyInc() + CacheInsertEmptyInc() + CacheRemoveEmptyInc() + CacheHitInc() + CacheMissInc() + CacheExpiredInc() + CacheMaxEntriesSet(maxEntries uint) +} diff --git a/internal/setup/metrics.go b/internal/setup/metrics.go index 74bf7d18..f3e5c09d 100644 --- a/internal/setup/metrics.go +++ b/internal/setup/metrics.go @@ -12,7 +12,15 @@ import ( func middlewareMetrics(metricsType string, commonPrometheus prometheus.Settings) ( middleware *metricsmiddleware.Middleware, err error) { - var metrics metricsmiddleware.Interface + var metrics interface { + RequestsInc() + QuestionsInc(class, qType string) + RcodeInc(rcode string) + AnswersInc(class, qType string) + ResponsesInc() + InFlightRequestsInc() + InFlightRequestsDec() + } switch metricsType { case noopString: metrics = noopmetrics.New() diff --git a/pkg/blockbuilder/builder.go b/pkg/blockbuilder/builder.go index e504b60b..9958eaac 100644 --- a/pkg/blockbuilder/builder.go +++ b/pkg/blockbuilder/builder.go @@ -1,17 +1,10 @@ package blockbuilder import ( - "context" "net/http" "net/netip" ) -var _ Interface = (*Builder)(nil) - -type Interface interface { - BuildAll(ctx context.Context) Result -} - func New(settings Settings) *Builder { settings.SetDefaults() diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go deleted file mode 100644 index b22ec703..00000000 --- a/pkg/cache/cache.go +++ /dev/null @@ -1,11 +0,0 @@ -package cache - -import ( - "github.com/miekg/dns" -) - -type Interface interface { - Add(request, response *dns.Msg) - Get(request *dns.Msg) (response *dns.Msg) - Remove(request *dns.Msg) -} diff --git a/pkg/cache/lru/interfaces.go b/pkg/cache/lru/interfaces.go new file mode 100644 index 00000000..5db271f2 --- /dev/null +++ b/pkg/cache/lru/interfaces.go @@ -0,0 +1,15 @@ +package lru + +type Metrics interface { //nolint:interfacebloat + SetCacheType(cacheType string) + CacheInsertInc() + CacheRemoveInc() + CacheMoveInc() + CacheGetEmptyInc() + CacheInsertEmptyInc() + CacheRemoveEmptyInc() + CacheHitInc() + CacheMissInc() + CacheExpiredInc() + CacheMaxEntriesSet(maxEntries uint) +} diff --git a/pkg/cache/lru/lru.go b/pkg/cache/lru/lru.go index 13ff84c1..a71dbeab 100644 --- a/pkg/cache/lru/lru.go +++ b/pkg/cache/lru/lru.go @@ -6,7 +6,6 @@ import ( "time" "github.com/miekg/dns" - "github.com/qdm12/dns/v2/pkg/cache/metrics" ) type LRU struct { @@ -19,7 +18,7 @@ type LRU struct { mutex sync.Mutex // External objects - metrics metrics.Interface + metrics Metrics // Mock fields timeNow func() time.Time diff --git a/pkg/cache/lru/lru_test.go b/pkg/cache/lru/lru_test.go index 8c2767c5..e26bdf21 100644 --- a/pkg/cache/lru/lru_test.go +++ b/pkg/cache/lru/lru_test.go @@ -22,8 +22,6 @@ func newTestMsgs(name string, expUnix uint32) (request, response *dns.Msg) { return request, response } -//go:generate mockgen -destination=mock_metrics_test.go -package $GOPACKAGE -mock_names Interface=MockMetrics github.com/qdm12/dns/v2/pkg/cache/metrics Interface - func Test_lru_e2e(t *testing.T) { t.Parallel() diff --git a/pkg/cache/lru/mocks_generate_test.go b/pkg/cache/lru/mocks_generate_test.go new file mode 100644 index 00000000..3e57f239 --- /dev/null +++ b/pkg/cache/lru/mocks_generate_test.go @@ -0,0 +1,3 @@ +package lru + +//go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Metrics diff --git a/pkg/cache/lru/mock_metrics_test.go b/pkg/cache/lru/mocks_test.go similarity index 97% rename from pkg/cache/lru/mock_metrics_test.go rename to pkg/cache/lru/mocks_test.go index 9cd044c2..3b415235 100644 --- a/pkg/cache/lru/mock_metrics_test.go +++ b/pkg/cache/lru/mocks_test.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/cache/metrics (interfaces: Interface) +// Source: github.com/qdm12/dns/v2/pkg/cache/lru (interfaces: Metrics) // Package lru is a generated GoMock package. package lru @@ -10,7 +10,7 @@ import ( gomock "github.com/golang/mock/gomock" ) -// MockMetrics is a mock of Interface interface. +// MockMetrics is a mock of Metrics interface. type MockMetrics struct { ctrl *gomock.Controller recorder *MockMetricsMockRecorder diff --git a/pkg/cache/lru/settings.go b/pkg/cache/lru/settings.go index a70faf42..5779beac 100644 --- a/pkg/cache/lru/settings.go +++ b/pkg/cache/lru/settings.go @@ -1,7 +1,6 @@ package lru import ( - "github.com/qdm12/dns/v2/pkg/cache/metrics" "github.com/qdm12/dns/v2/pkg/cache/metrics/noop" "github.com/qdm12/gosettings" "github.com/qdm12/gotree" @@ -13,7 +12,7 @@ type Settings struct { MaxEntries uint // Metrics is the metrics interface to record metric information // for the cache. It defaults to a No-Op metric implementation. - Metrics metrics.Interface + Metrics Metrics } func (s *Settings) SetDefaults() { diff --git a/pkg/cache/metrics/interface.go b/pkg/cache/metrics/interface.go deleted file mode 100644 index c92f3134..00000000 --- a/pkg/cache/metrics/interface.go +++ /dev/null @@ -1,49 +0,0 @@ -// Package metrics defines an interface valid for all caches. -package metrics - -import ( - "fmt" - - "github.com/qdm12/dns/v2/pkg/cache/metrics/noop" - "github.com/qdm12/dns/v2/pkg/cache/metrics/prometheus" -) - -var ( - _ Interface = (*prometheus.Metrics)(nil) - _ Interface = (*noop.Metrics)(nil) -) - -type Interface interface { //nolint:interfacebloat - SetCacheType(cacheType string) - CacheInsertInc() - CacheRemoveInc() - CacheMoveInc() - CacheGetEmptyInc() - CacheInsertEmptyInc() - CacheRemoveEmptyInc() - CacheHitInc() - CacheMissInc() - CacheExpiredInc() - CacheMaxEntriesSet(maxEntries uint) -} - -type Settings struct { - Type string - Prometheus prometheus.Settings -} - -func Metrics(settings Settings) (metrics Interface, err error) { //nolint:ireturn - switch settings.Type { - case "noop": - return noop.New(), nil - case "prometheus": - metrics, err = prometheus.New(settings.Prometheus) - if err != nil { - return nil, fmt.Errorf("setting up Prometheus metrics: %w", err) - } - default: - panic(fmt.Sprintf("unknown metrics type: %s", settings.Type)) - } - - return metrics, nil -} diff --git a/pkg/cache/noop/interfaces.go b/pkg/cache/noop/interfaces.go new file mode 100644 index 00000000..d37f4389 --- /dev/null +++ b/pkg/cache/noop/interfaces.go @@ -0,0 +1,5 @@ +package noop + +type Metrics interface { + SetCacheType(cacheType string) +} diff --git a/pkg/cache/noop/noop.go b/pkg/cache/noop/noop.go index 97e90550..5bc965f9 100644 --- a/pkg/cache/noop/noop.go +++ b/pkg/cache/noop/noop.go @@ -2,11 +2,10 @@ package noop import ( "github.com/miekg/dns" - "github.com/qdm12/dns/v2/pkg/cache/metrics" ) type NoOp struct { - metrics metrics.Interface + metrics Metrics } func New(settings Settings) *NoOp { diff --git a/pkg/cache/noop/settings.go b/pkg/cache/noop/settings.go index 26c82dd3..7970a0ea 100644 --- a/pkg/cache/noop/settings.go +++ b/pkg/cache/noop/settings.go @@ -1,7 +1,6 @@ package noop import ( - "github.com/qdm12/dns/v2/pkg/cache/metrics" "github.com/qdm12/dns/v2/pkg/cache/metrics/noop" "github.com/qdm12/gosettings" "github.com/qdm12/gotree" @@ -10,7 +9,7 @@ import ( type Settings struct { // Metrics is the metrics interface to record the cache type. // It defaults to a No-Op metric implementation. - Metrics metrics.Interface + Metrics Metrics } func (s *Settings) SetDefaults() { diff --git a/pkg/doh/integration_test.go b/pkg/doh/integration_test.go index 4dcfcc40..74edfb53 100644 --- a/pkg/doh/integration_test.go +++ b/pkg/doh/integration_test.go @@ -86,12 +86,6 @@ func Test_Server(t *testing.T) { assert.NoError(t, err) } -//go:generate mockgen -destination=mock_cache_test.go -package $GOPACKAGE -mock_names Interface=MockCache github.com/qdm12/dns/v2/pkg/cache Interface -//go:generate mockgen -destination=mock_doh_metrics_test.go -package $GOPACKAGE -mock_names DialMetrics=MockDoHMetrics github.com/qdm12/dns/v2/pkg/doh/metrics DialMetrics -//go:generate mockgen -destination=mock_middleware_metrics_test.go -package $GOPACKAGE -mock_names Interface=MockMiddlewareMetrics github.com/qdm12/dns/v2/pkg/middlewares/metrics Interface -//go:generate mockgen -destination=mock_filter_test.go -package $GOPACKAGE -mock_names Interface=MockFilter github.com/qdm12/dns/v2/pkg/filter Interface -//go:generate mockgen -destination=mock_logger_test.go -package $GOPACKAGE github.com/qdm12/dns/v2/pkg/log Logger - func Test_Server_Mocks(t *testing.T) { ctrl := gomock.NewController(t) @@ -237,7 +231,7 @@ func Test_Server_Mocks(t *testing.T) { logger := NewMockLogger(ctrl) logger.EXPECT().Info("DNS server listening on :53") - metrics := NewMockDoHMetrics(ctrl) + metrics := NewMockMetrics(ctrl) metrics.EXPECT(). DoTDialInc("cloudflare-dns.com", mockhelp.NewMatcherOneOf("1.1.1.1:853", "1.0.0.1:853"), "success"). @@ -245,7 +239,7 @@ func Test_Server_Mocks(t *testing.T) { metrics.EXPECT(). DoHDialInc("https://cloudflare-dns.com/dns-query"). Times(2) - middlewareMetrics := NewMockMiddlewareMetrics(ctrl) + middlewareMetrics := NewMockmiddlewareMetrics(ctrl) middlewareMetrics.EXPECT().InFlightRequestsInc().Times(2) middlewareMetrics.EXPECT().InFlightRequestsDec().Times(2) middlewareMetrics.EXPECT().RequestsInc().Times(2) diff --git a/pkg/doh/interfaces.go b/pkg/doh/interfaces.go index 41365ad9..7f583abd 100644 --- a/pkg/doh/interfaces.go +++ b/pkg/doh/interfaces.go @@ -2,6 +2,7 @@ package doh import ( "github.com/miekg/dns" + "github.com/qdm12/dns/v2/pkg/filter/update" "github.com/qdm12/dns/v2/pkg/provider" ) @@ -9,6 +10,35 @@ type Middleware interface { Wrap(next dns.Handler) dns.Handler } +type Filter interface { + FilterRequest(request *dns.Msg) (blocked bool) + FilterResponse(response *dns.Msg) (blocked bool) + Update(settings update.Settings) +} + +type Cache interface { + Add(request, response *dns.Msg) + Get(request *dns.Msg) (response *dns.Msg) + Remove(request *dns.Msg) +} + +type Metrics interface { + DoHDialInc(url string) + DoTDialInc(provider, address, outcome string) + DNSDialInc(address, outcome string) +} + +type Logger interface { + Debug(s string) + Info(s string) + Warner + Error(s string) +} + +type Warner interface { + Warn(s string) +} + type Picker interface { DoHServer(servers []provider.DoHServer) provider.DoHServer } diff --git a/pkg/doh/interfaces_test.go b/pkg/doh/interfaces_test.go new file mode 100644 index 00000000..658310cd --- /dev/null +++ b/pkg/doh/interfaces_test.go @@ -0,0 +1,11 @@ +package doh + +type middlewareMetrics interface { //nolint:unused + RequestsInc() + QuestionsInc(class, qType string) + RcodeInc(rcode string) + AnswersInc(class, qType string) + ResponsesInc() + InFlightRequestsInc() + InFlightRequestsDec() +} diff --git a/pkg/doh/metrics/interface.go b/pkg/doh/metrics/interface.go deleted file mode 100644 index 5cef0db6..00000000 --- a/pkg/doh/metrics/interface.go +++ /dev/null @@ -1,23 +0,0 @@ -// Package metrics defines metric interfaces for the -// DoH server and resolver. -package metrics - -import ( - "github.com/qdm12/dns/v2/pkg/doh/metrics/noop" - "github.com/qdm12/dns/v2/pkg/doh/metrics/prometheus" - dotmetrics "github.com/qdm12/dns/v2/pkg/dot/metrics" -) - -var ( - _ DialMetrics = (*prometheus.Metrics)(nil) - _ DialMetrics = (*noop.Metrics)(nil) -) - -type DialMetrics interface { - DoHDialMetrics - dotmetrics.DialMetrics -} - -type DoHDialMetrics interface { - DoHDialInc(url string) -} diff --git a/pkg/doh/metrics/noop/metrics.go b/pkg/doh/metrics/noop/metrics.go index c20ec23d..b5139368 100644 --- a/pkg/doh/metrics/noop/metrics.go +++ b/pkg/doh/metrics/noop/metrics.go @@ -1,28 +1,12 @@ // Package noop defines a No-op metric implementation for DoH. package noop -import ( - dotmetrics "github.com/qdm12/dns/v2/pkg/dot/metrics" - dotnoop "github.com/qdm12/dns/v2/pkg/dot/metrics/noop" - middleware "github.com/qdm12/dns/v2/pkg/middlewares/metrics" - middlewarenoop "github.com/qdm12/dns/v2/pkg/middlewares/metrics/noop" -) - -type ( - dotDialMetrics = dotmetrics.DialMetrics - middlewareInterface = middleware.Interface -) - -type Metrics struct { - dotDialMetrics - middlewareInterface -} +type Metrics struct{} func New() (metrics *Metrics) { - return &Metrics{ - dotDialMetrics: dotnoop.New(), - middlewareInterface: middlewarenoop.New(), - } + return &Metrics{} } -func (m *Metrics) DoHDialInc(string) {} +func (m *Metrics) DNSDialInc(_, _ string) {} +func (m *Metrics) DoTDialInc(_, _, _ string) {} +func (m *Metrics) DoHDialInc(string) {} diff --git a/pkg/doh/metrics/prometheus/interfaces.go b/pkg/doh/metrics/prometheus/interfaces.go new file mode 100644 index 00000000..8712d1e0 --- /dev/null +++ b/pkg/doh/metrics/prometheus/interfaces.go @@ -0,0 +1,6 @@ +package prometheus + +type DialMetrics interface { + DoTDialInc(provider, address, outcome string) + DNSDialInc(address, outcome string) +} diff --git a/pkg/doh/metrics/prometheus/metrics.go b/pkg/doh/metrics/prometheus/metrics.go index 0b35ed65..69aa8d90 100644 --- a/pkg/doh/metrics/prometheus/metrics.go +++ b/pkg/doh/metrics/prometheus/metrics.go @@ -3,12 +3,12 @@ package prometheus import ( "fmt" - - dotmetrics "github.com/qdm12/dns/v2/pkg/dot/metrics" ) type ( - dotDialMetrics = dotmetrics.DialMetrics + // unexported alias so it is not exposed through + // the Metrics struct. + dotDialMetrics = DialMetrics ) type Metrics struct { diff --git a/pkg/doh/metrics/prometheus/settings.go b/pkg/doh/metrics/prometheus/settings.go index af034be3..7a6232ef 100644 --- a/pkg/doh/metrics/prometheus/settings.go +++ b/pkg/doh/metrics/prometheus/settings.go @@ -1,7 +1,6 @@ package prometheus import ( - dot "github.com/qdm12/dns/v2/pkg/dot/metrics" dotnoop "github.com/qdm12/dns/v2/pkg/dot/metrics/noop" prom "github.com/qdm12/dns/v2/pkg/metrics/prometheus" "github.com/qdm12/gosettings" @@ -12,7 +11,7 @@ type Settings struct { Prometheus prom.Settings // DoTDialMetrics is the metrics interface for the // DoT dialer. It defaults to a No-op implementation. - DoTDialMetrics dot.DialMetrics + DoTDialMetrics DialMetrics } func (s *Settings) SetDefaults() { diff --git a/pkg/doh/mock_cache_test.go b/pkg/doh/mock_cache_test.go deleted file mode 100644 index 7a23087d..00000000 --- a/pkg/doh/mock_cache_test.go +++ /dev/null @@ -1,73 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/cache (interfaces: Interface) - -// Package doh is a generated GoMock package. -package doh - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - dns "github.com/miekg/dns" -) - -// MockCache is a mock of Interface interface. -type MockCache struct { - ctrl *gomock.Controller - recorder *MockCacheMockRecorder -} - -// MockCacheMockRecorder is the mock recorder for MockCache. -type MockCacheMockRecorder struct { - mock *MockCache -} - -// NewMockCache creates a new mock instance. -func NewMockCache(ctrl *gomock.Controller) *MockCache { - mock := &MockCache{ctrl: ctrl} - mock.recorder = &MockCacheMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockCache) EXPECT() *MockCacheMockRecorder { - return m.recorder -} - -// Add mocks base method. -func (m *MockCache) Add(arg0, arg1 *dns.Msg) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Add", arg0, arg1) -} - -// Add indicates an expected call of Add. -func (mr *MockCacheMockRecorder) Add(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockCache)(nil).Add), arg0, arg1) -} - -// Get mocks base method. -func (m *MockCache) Get(arg0 *dns.Msg) *dns.Msg { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", arg0) - ret0, _ := ret[0].(*dns.Msg) - return ret0 -} - -// Get indicates an expected call of Get. -func (mr *MockCacheMockRecorder) Get(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockCache)(nil).Get), arg0) -} - -// Remove mocks base method. -func (m *MockCache) Remove(arg0 *dns.Msg) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Remove", arg0) -} - -// Remove indicates an expected call of Remove. -func (mr *MockCacheMockRecorder) Remove(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remove", reflect.TypeOf((*MockCache)(nil).Remove), arg0) -} diff --git a/pkg/doh/mock_doh_metrics_test.go b/pkg/doh/mock_doh_metrics_test.go deleted file mode 100644 index d744758d..00000000 --- a/pkg/doh/mock_doh_metrics_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/doh/metrics (interfaces: DialMetrics) - -// Package doh is a generated GoMock package. -package doh - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" -) - -// MockDoHMetrics is a mock of DialMetrics interface. -type MockDoHMetrics struct { - ctrl *gomock.Controller - recorder *MockDoHMetricsMockRecorder -} - -// MockDoHMetricsMockRecorder is the mock recorder for MockDoHMetrics. -type MockDoHMetricsMockRecorder struct { - mock *MockDoHMetrics -} - -// NewMockDoHMetrics creates a new mock instance. -func NewMockDoHMetrics(ctrl *gomock.Controller) *MockDoHMetrics { - mock := &MockDoHMetrics{ctrl: ctrl} - mock.recorder = &MockDoHMetricsMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDoHMetrics) EXPECT() *MockDoHMetricsMockRecorder { - return m.recorder -} - -// DNSDialInc mocks base method. -func (m *MockDoHMetrics) DNSDialInc(arg0, arg1 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "DNSDialInc", arg0, arg1) -} - -// DNSDialInc indicates an expected call of DNSDialInc. -func (mr *MockDoHMetricsMockRecorder) DNSDialInc(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DNSDialInc", reflect.TypeOf((*MockDoHMetrics)(nil).DNSDialInc), arg0, arg1) -} - -// DoHDialInc mocks base method. -func (m *MockDoHMetrics) DoHDialInc(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "DoHDialInc", arg0) -} - -// DoHDialInc indicates an expected call of DoHDialInc. -func (mr *MockDoHMetricsMockRecorder) DoHDialInc(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoHDialInc", reflect.TypeOf((*MockDoHMetrics)(nil).DoHDialInc), arg0) -} - -// DoTDialInc mocks base method. -func (m *MockDoHMetrics) DoTDialInc(arg0, arg1, arg2 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "DoTDialInc", arg0, arg1, arg2) -} - -// DoTDialInc indicates an expected call of DoTDialInc. -func (mr *MockDoHMetricsMockRecorder) DoTDialInc(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoTDialInc", reflect.TypeOf((*MockDoHMetrics)(nil).DoTDialInc), arg0, arg1, arg2) -} diff --git a/pkg/doh/mock_filter_test.go b/pkg/doh/mock_filter_test.go deleted file mode 100644 index 15e28dff..00000000 --- a/pkg/doh/mock_filter_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/filter (interfaces: Interface) - -// Package doh is a generated GoMock package. -package doh - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - dns "github.com/miekg/dns" - update "github.com/qdm12/dns/v2/pkg/filter/update" -) - -// MockFilter is a mock of Interface interface. -type MockFilter struct { - ctrl *gomock.Controller - recorder *MockFilterMockRecorder -} - -// MockFilterMockRecorder is the mock recorder for MockFilter. -type MockFilterMockRecorder struct { - mock *MockFilter -} - -// NewMockFilter creates a new mock instance. -func NewMockFilter(ctrl *gomock.Controller) *MockFilter { - mock := &MockFilter{ctrl: ctrl} - mock.recorder = &MockFilterMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockFilter) EXPECT() *MockFilterMockRecorder { - return m.recorder -} - -// FilterRequest mocks base method. -func (m *MockFilter) FilterRequest(arg0 *dns.Msg) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FilterRequest", arg0) - ret0, _ := ret[0].(bool) - return ret0 -} - -// FilterRequest indicates an expected call of FilterRequest. -func (mr *MockFilterMockRecorder) FilterRequest(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterRequest", reflect.TypeOf((*MockFilter)(nil).FilterRequest), arg0) -} - -// FilterResponse mocks base method. -func (m *MockFilter) FilterResponse(arg0 *dns.Msg) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FilterResponse", arg0) - ret0, _ := ret[0].(bool) - return ret0 -} - -// FilterResponse indicates an expected call of FilterResponse. -func (mr *MockFilterMockRecorder) FilterResponse(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterResponse", reflect.TypeOf((*MockFilter)(nil).FilterResponse), arg0) -} - -// Update mocks base method. -func (m *MockFilter) Update(arg0 update.Settings) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Update", arg0) -} - -// Update indicates an expected call of Update. -func (mr *MockFilterMockRecorder) Update(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockFilter)(nil).Update), arg0) -} diff --git a/pkg/doh/mock_logger_test.go b/pkg/doh/mock_logger_test.go deleted file mode 100644 index 492fd3e8..00000000 --- a/pkg/doh/mock_logger_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/log (interfaces: Logger) - -// Package doh is a generated GoMock package. -package doh - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" -) - -// MockLogger is a mock of Logger interface. -type MockLogger struct { - ctrl *gomock.Controller - recorder *MockLoggerMockRecorder -} - -// MockLoggerMockRecorder is the mock recorder for MockLogger. -type MockLoggerMockRecorder struct { - mock *MockLogger -} - -// NewMockLogger creates a new mock instance. -func NewMockLogger(ctrl *gomock.Controller) *MockLogger { - mock := &MockLogger{ctrl: ctrl} - mock.recorder = &MockLoggerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockLogger) EXPECT() *MockLoggerMockRecorder { - return m.recorder -} - -// Debug mocks base method. -func (m *MockLogger) Debug(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Debug", arg0) -} - -// Debug indicates an expected call of Debug. -func (mr *MockLoggerMockRecorder) Debug(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Debug", reflect.TypeOf((*MockLogger)(nil).Debug), arg0) -} - -// Error mocks base method. -func (m *MockLogger) Error(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Error", arg0) -} - -// Error indicates an expected call of Error. -func (mr *MockLoggerMockRecorder) Error(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Error", reflect.TypeOf((*MockLogger)(nil).Error), arg0) -} - -// Info mocks base method. -func (m *MockLogger) Info(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Info", arg0) -} - -// Info indicates an expected call of Info. -func (mr *MockLoggerMockRecorder) Info(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockLogger)(nil).Info), arg0) -} - -// Warn mocks base method. -func (m *MockLogger) Warn(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Warn", arg0) -} - -// Warn indicates an expected call of Warn. -func (mr *MockLoggerMockRecorder) Warn(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Warn", reflect.TypeOf((*MockLogger)(nil).Warn), arg0) -} diff --git a/pkg/doh/mock_middleware_metrics_test.go b/pkg/doh/mock_middleware_metrics_test.go deleted file mode 100644 index 7c65c1d3..00000000 --- a/pkg/doh/mock_middleware_metrics_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/middlewares/metrics (interfaces: Interface) - -// Package doh is a generated GoMock package. -package doh - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" -) - -// MockMiddlewareMetrics is a mock of Interface interface. -type MockMiddlewareMetrics struct { - ctrl *gomock.Controller - recorder *MockMiddlewareMetricsMockRecorder -} - -// MockMiddlewareMetricsMockRecorder is the mock recorder for MockMiddlewareMetrics. -type MockMiddlewareMetricsMockRecorder struct { - mock *MockMiddlewareMetrics -} - -// NewMockMiddlewareMetrics creates a new mock instance. -func NewMockMiddlewareMetrics(ctrl *gomock.Controller) *MockMiddlewareMetrics { - mock := &MockMiddlewareMetrics{ctrl: ctrl} - mock.recorder = &MockMiddlewareMetricsMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockMiddlewareMetrics) EXPECT() *MockMiddlewareMetricsMockRecorder { - return m.recorder -} - -// AnswersInc mocks base method. -func (m *MockMiddlewareMetrics) AnswersInc(arg0, arg1 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AnswersInc", arg0, arg1) -} - -// AnswersInc indicates an expected call of AnswersInc. -func (mr *MockMiddlewareMetricsMockRecorder) AnswersInc(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AnswersInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).AnswersInc), arg0, arg1) -} - -// InFlightRequestsDec mocks base method. -func (m *MockMiddlewareMetrics) InFlightRequestsDec() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "InFlightRequestsDec") -} - -// InFlightRequestsDec indicates an expected call of InFlightRequestsDec. -func (mr *MockMiddlewareMetricsMockRecorder) InFlightRequestsDec() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InFlightRequestsDec", reflect.TypeOf((*MockMiddlewareMetrics)(nil).InFlightRequestsDec)) -} - -// InFlightRequestsInc mocks base method. -func (m *MockMiddlewareMetrics) InFlightRequestsInc() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "InFlightRequestsInc") -} - -// InFlightRequestsInc indicates an expected call of InFlightRequestsInc. -func (mr *MockMiddlewareMetricsMockRecorder) InFlightRequestsInc() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InFlightRequestsInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).InFlightRequestsInc)) -} - -// QuestionsInc mocks base method. -func (m *MockMiddlewareMetrics) QuestionsInc(arg0, arg1 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "QuestionsInc", arg0, arg1) -} - -// QuestionsInc indicates an expected call of QuestionsInc. -func (mr *MockMiddlewareMetricsMockRecorder) QuestionsInc(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QuestionsInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).QuestionsInc), arg0, arg1) -} - -// RcodeInc mocks base method. -func (m *MockMiddlewareMetrics) RcodeInc(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RcodeInc", arg0) -} - -// RcodeInc indicates an expected call of RcodeInc. -func (mr *MockMiddlewareMetricsMockRecorder) RcodeInc(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RcodeInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).RcodeInc), arg0) -} - -// RequestsInc mocks base method. -func (m *MockMiddlewareMetrics) RequestsInc() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RequestsInc") -} - -// RequestsInc indicates an expected call of RequestsInc. -func (mr *MockMiddlewareMetricsMockRecorder) RequestsInc() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RequestsInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).RequestsInc)) -} - -// ResponsesInc mocks base method. -func (m *MockMiddlewareMetrics) ResponsesInc() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "ResponsesInc") -} - -// ResponsesInc indicates an expected call of ResponsesInc. -func (mr *MockMiddlewareMetricsMockRecorder) ResponsesInc() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResponsesInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).ResponsesInc)) -} diff --git a/pkg/doh/mocks_generate_test.go b/pkg/doh/mocks_generate_test.go new file mode 100644 index 00000000..b9342e0c --- /dev/null +++ b/pkg/doh/mocks_generate_test.go @@ -0,0 +1,4 @@ +package doh + +//go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Filter,Cache,Metrics,Logger +//go:generate mockgen -destination=mocks_local_test.go -package $GOPACKAGE -source interfaces_test.go diff --git a/pkg/doh/mocks_local_test.go b/pkg/doh/mocks_local_test.go new file mode 100644 index 00000000..7af5ecb3 --- /dev/null +++ b/pkg/doh/mocks_local_test.go @@ -0,0 +1,118 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: interfaces_test.go + +// Package doh is a generated GoMock package. +package doh + +import ( + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// MockmiddlewareMetrics is a mock of middlewareMetrics interface. +type MockmiddlewareMetrics struct { + ctrl *gomock.Controller + recorder *MockmiddlewareMetricsMockRecorder +} + +// MockmiddlewareMetricsMockRecorder is the mock recorder for MockmiddlewareMetrics. +type MockmiddlewareMetricsMockRecorder struct { + mock *MockmiddlewareMetrics +} + +// NewMockmiddlewareMetrics creates a new mock instance. +func NewMockmiddlewareMetrics(ctrl *gomock.Controller) *MockmiddlewareMetrics { + mock := &MockmiddlewareMetrics{ctrl: ctrl} + mock.recorder = &MockmiddlewareMetricsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockmiddlewareMetrics) EXPECT() *MockmiddlewareMetricsMockRecorder { + return m.recorder +} + +// AnswersInc mocks base method. +func (m *MockmiddlewareMetrics) AnswersInc(class, qType string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "AnswersInc", class, qType) +} + +// AnswersInc indicates an expected call of AnswersInc. +func (mr *MockmiddlewareMetricsMockRecorder) AnswersInc(class, qType interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AnswersInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).AnswersInc), class, qType) +} + +// InFlightRequestsDec mocks base method. +func (m *MockmiddlewareMetrics) InFlightRequestsDec() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "InFlightRequestsDec") +} + +// InFlightRequestsDec indicates an expected call of InFlightRequestsDec. +func (mr *MockmiddlewareMetricsMockRecorder) InFlightRequestsDec() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InFlightRequestsDec", reflect.TypeOf((*MockmiddlewareMetrics)(nil).InFlightRequestsDec)) +} + +// InFlightRequestsInc mocks base method. +func (m *MockmiddlewareMetrics) InFlightRequestsInc() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "InFlightRequestsInc") +} + +// InFlightRequestsInc indicates an expected call of InFlightRequestsInc. +func (mr *MockmiddlewareMetricsMockRecorder) InFlightRequestsInc() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InFlightRequestsInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).InFlightRequestsInc)) +} + +// QuestionsInc mocks base method. +func (m *MockmiddlewareMetrics) QuestionsInc(class, qType string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "QuestionsInc", class, qType) +} + +// QuestionsInc indicates an expected call of QuestionsInc. +func (mr *MockmiddlewareMetricsMockRecorder) QuestionsInc(class, qType interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QuestionsInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).QuestionsInc), class, qType) +} + +// RcodeInc mocks base method. +func (m *MockmiddlewareMetrics) RcodeInc(rcode string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RcodeInc", rcode) +} + +// RcodeInc indicates an expected call of RcodeInc. +func (mr *MockmiddlewareMetricsMockRecorder) RcodeInc(rcode interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RcodeInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).RcodeInc), rcode) +} + +// RequestsInc mocks base method. +func (m *MockmiddlewareMetrics) RequestsInc() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RequestsInc") +} + +// RequestsInc indicates an expected call of RequestsInc. +func (mr *MockmiddlewareMetricsMockRecorder) RequestsInc() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RequestsInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).RequestsInc)) +} + +// ResponsesInc mocks base method. +func (m *MockmiddlewareMetrics) ResponsesInc() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ResponsesInc") +} + +// ResponsesInc indicates an expected call of ResponsesInc. +func (mr *MockmiddlewareMetricsMockRecorder) ResponsesInc() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResponsesInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).ResponsesInc)) +} diff --git a/pkg/doh/mocks_test.go b/pkg/doh/mocks_test.go new file mode 100644 index 00000000..a969424e --- /dev/null +++ b/pkg/doh/mocks_test.go @@ -0,0 +1,267 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/qdm12/dns/v2/pkg/doh (interfaces: Filter,Cache,Metrics,Logger) + +// Package doh is a generated GoMock package. +package doh + +import ( + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + dns "github.com/miekg/dns" + update "github.com/qdm12/dns/v2/pkg/filter/update" +) + +// MockFilter is a mock of Filter interface. +type MockFilter struct { + ctrl *gomock.Controller + recorder *MockFilterMockRecorder +} + +// MockFilterMockRecorder is the mock recorder for MockFilter. +type MockFilterMockRecorder struct { + mock *MockFilter +} + +// NewMockFilter creates a new mock instance. +func NewMockFilter(ctrl *gomock.Controller) *MockFilter { + mock := &MockFilter{ctrl: ctrl} + mock.recorder = &MockFilterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockFilter) EXPECT() *MockFilterMockRecorder { + return m.recorder +} + +// FilterRequest mocks base method. +func (m *MockFilter) FilterRequest(arg0 *dns.Msg) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FilterRequest", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// FilterRequest indicates an expected call of FilterRequest. +func (mr *MockFilterMockRecorder) FilterRequest(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterRequest", reflect.TypeOf((*MockFilter)(nil).FilterRequest), arg0) +} + +// FilterResponse mocks base method. +func (m *MockFilter) FilterResponse(arg0 *dns.Msg) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FilterResponse", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// FilterResponse indicates an expected call of FilterResponse. +func (mr *MockFilterMockRecorder) FilterResponse(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterResponse", reflect.TypeOf((*MockFilter)(nil).FilterResponse), arg0) +} + +// Update mocks base method. +func (m *MockFilter) Update(arg0 update.Settings) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Update", arg0) +} + +// Update indicates an expected call of Update. +func (mr *MockFilterMockRecorder) Update(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockFilter)(nil).Update), arg0) +} + +// MockCache is a mock of Cache interface. +type MockCache struct { + ctrl *gomock.Controller + recorder *MockCacheMockRecorder +} + +// MockCacheMockRecorder is the mock recorder for MockCache. +type MockCacheMockRecorder struct { + mock *MockCache +} + +// NewMockCache creates a new mock instance. +func NewMockCache(ctrl *gomock.Controller) *MockCache { + mock := &MockCache{ctrl: ctrl} + mock.recorder = &MockCacheMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockCache) EXPECT() *MockCacheMockRecorder { + return m.recorder +} + +// Add mocks base method. +func (m *MockCache) Add(arg0, arg1 *dns.Msg) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Add", arg0, arg1) +} + +// Add indicates an expected call of Add. +func (mr *MockCacheMockRecorder) Add(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockCache)(nil).Add), arg0, arg1) +} + +// Get mocks base method. +func (m *MockCache) Get(arg0 *dns.Msg) *dns.Msg { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0) + ret0, _ := ret[0].(*dns.Msg) + return ret0 +} + +// Get indicates an expected call of Get. +func (mr *MockCacheMockRecorder) Get(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockCache)(nil).Get), arg0) +} + +// Remove mocks base method. +func (m *MockCache) Remove(arg0 *dns.Msg) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Remove", arg0) +} + +// Remove indicates an expected call of Remove. +func (mr *MockCacheMockRecorder) Remove(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remove", reflect.TypeOf((*MockCache)(nil).Remove), arg0) +} + +// MockMetrics is a mock of Metrics interface. +type MockMetrics struct { + ctrl *gomock.Controller + recorder *MockMetricsMockRecorder +} + +// MockMetricsMockRecorder is the mock recorder for MockMetrics. +type MockMetricsMockRecorder struct { + mock *MockMetrics +} + +// NewMockMetrics creates a new mock instance. +func NewMockMetrics(ctrl *gomock.Controller) *MockMetrics { + mock := &MockMetrics{ctrl: ctrl} + mock.recorder = &MockMetricsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockMetrics) EXPECT() *MockMetricsMockRecorder { + return m.recorder +} + +// DNSDialInc mocks base method. +func (m *MockMetrics) DNSDialInc(arg0, arg1 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DNSDialInc", arg0, arg1) +} + +// DNSDialInc indicates an expected call of DNSDialInc. +func (mr *MockMetricsMockRecorder) DNSDialInc(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DNSDialInc", reflect.TypeOf((*MockMetrics)(nil).DNSDialInc), arg0, arg1) +} + +// DoHDialInc mocks base method. +func (m *MockMetrics) DoHDialInc(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DoHDialInc", arg0) +} + +// DoHDialInc indicates an expected call of DoHDialInc. +func (mr *MockMetricsMockRecorder) DoHDialInc(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoHDialInc", reflect.TypeOf((*MockMetrics)(nil).DoHDialInc), arg0) +} + +// DoTDialInc mocks base method. +func (m *MockMetrics) DoTDialInc(arg0, arg1, arg2 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DoTDialInc", arg0, arg1, arg2) +} + +// DoTDialInc indicates an expected call of DoTDialInc. +func (mr *MockMetricsMockRecorder) DoTDialInc(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoTDialInc", reflect.TypeOf((*MockMetrics)(nil).DoTDialInc), arg0, arg1, arg2) +} + +// MockLogger is a mock of Logger interface. +type MockLogger struct { + ctrl *gomock.Controller + recorder *MockLoggerMockRecorder +} + +// MockLoggerMockRecorder is the mock recorder for MockLogger. +type MockLoggerMockRecorder struct { + mock *MockLogger +} + +// NewMockLogger creates a new mock instance. +func NewMockLogger(ctrl *gomock.Controller) *MockLogger { + mock := &MockLogger{ctrl: ctrl} + mock.recorder = &MockLoggerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockLogger) EXPECT() *MockLoggerMockRecorder { + return m.recorder +} + +// Debug mocks base method. +func (m *MockLogger) Debug(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Debug", arg0) +} + +// Debug indicates an expected call of Debug. +func (mr *MockLoggerMockRecorder) Debug(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Debug", reflect.TypeOf((*MockLogger)(nil).Debug), arg0) +} + +// Error mocks base method. +func (m *MockLogger) Error(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Error", arg0) +} + +// Error indicates an expected call of Error. +func (mr *MockLoggerMockRecorder) Error(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Error", reflect.TypeOf((*MockLogger)(nil).Error), arg0) +} + +// Info mocks base method. +func (m *MockLogger) Info(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Info", arg0) +} + +// Info indicates an expected call of Info. +func (mr *MockLoggerMockRecorder) Info(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockLogger)(nil).Info), arg0) +} + +// Warn mocks base method. +func (m *MockLogger) Warn(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Warn", arg0) +} + +// Warn indicates an expected call of Warn. +func (mr *MockLoggerMockRecorder) Warn(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Warn", reflect.TypeOf((*MockLogger)(nil).Warn), arg0) +} diff --git a/pkg/doh/server.go b/pkg/doh/server.go index 4f9b371c..008ca5cc 100644 --- a/pkg/doh/server.go +++ b/pkg/doh/server.go @@ -6,13 +6,12 @@ import ( "sync" "github.com/miekg/dns" - "github.com/qdm12/dns/v2/pkg/log" ) type Server struct { // Dependencies injected settings ServerSettings - logger log.Logger + logger Logger // Internal state running bool diff --git a/pkg/doh/settings.go b/pkg/doh/settings.go index b07144e2..34a46b4f 100644 --- a/pkg/doh/settings.go +++ b/pkg/doh/settings.go @@ -7,13 +7,9 @@ import ( "time" "github.com/qdm12/dns/v2/internal/picker" - "github.com/qdm12/dns/v2/pkg/cache" cachenoop "github.com/qdm12/dns/v2/pkg/cache/noop" - "github.com/qdm12/dns/v2/pkg/doh/metrics" metricsnoop "github.com/qdm12/dns/v2/pkg/doh/metrics/noop" - "github.com/qdm12/dns/v2/pkg/filter" filternoop "github.com/qdm12/dns/v2/pkg/filter/noop" - "github.com/qdm12/dns/v2/pkg/log" lognoop "github.com/qdm12/dns/v2/pkg/log/noop" "github.com/qdm12/dns/v2/pkg/provider" "github.com/qdm12/gosettings" @@ -33,13 +29,13 @@ type ServerSettings struct { // Cache is the cache to use in the server. // It defaults to a No-Op cache implementation with // a No-Op cache metrics implementation. - Cache cache.Interface + Cache Cache // Filter is the filter for DNS requests and responses. // It defaults to a No-Op filter implementation. - Filter filter.Interface + Filter Filter // Logger is the logger to log information. // It defaults to a No-Op logger implementation. - Logger log.Logger + Logger Logger } type ResolverSettings struct { @@ -48,10 +44,10 @@ type ResolverSettings struct { Timeout time.Duration // Warner is the warning logger to log dial errors. // It defaults to a No-Op warner implementation. - Warner log.Warner + Warner Warner // Metrics is the metrics interface to record metric data. // It defaults to a No-Op metrics implementation. - Metrics metrics.DialMetrics + Metrics Metrics // Picker is the picker to use for each upstream call to pick // a server from a pool of servers. It must be thread safe. // It defaults to a fast thread safe pseudo random picker diff --git a/pkg/dot/dial.go b/pkg/dot/dial.go index e80d6c9e..8b9847b1 100644 --- a/pkg/dot/dial.go +++ b/pkg/dot/dial.go @@ -7,8 +7,6 @@ import ( "net" "github.com/qdm12/dns/v2/internal/server" - "github.com/qdm12/dns/v2/pkg/dot/metrics" - "github.com/qdm12/dns/v2/pkg/log" "github.com/qdm12/dns/v2/pkg/provider" ) @@ -85,7 +83,7 @@ func pickNameAddress(picker Picker, servers []provider.DoTServer, func onDialError(ctx context.Context, dialErr error, dotName, dotAddress string, dialer *net.Dialer, picker Picker, ipv6 bool, dnsServers []provider.DNSServer, - warner log.Warner, metrics metrics.DialMetrics) ( + warner Warner, metrics Metrics) ( conn net.Conn, err error) { warner.Warn(dialErr.Error()) metrics.DoTDialInc(dotName, dotAddress, "error") @@ -101,7 +99,7 @@ func onDialError(ctx context.Context, dialErr error, func dialPlaintext(ctx context.Context, dialer *net.Dialer, picker Picker, ipv6 bool, dnsServers []provider.DNSServer, - warner log.Warner, metrics metrics.DialDNSMetrics) ( + warner Warner, metrics Metrics) ( conn net.Conn, err error) { dnsServer := picker.DNSServer(dnsServers) ip := picker.DNSIP(dnsServer, ipv6) diff --git a/pkg/dot/dial_test.go b/pkg/dot/dial_test.go index 37aea760..79f6e33e 100644 --- a/pkg/dot/dial_test.go +++ b/pkg/dot/dial_test.go @@ -36,11 +36,6 @@ func Test_settingsToServers(t *testing.T) { }, dnsServers) } -//go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Picker -//go:generate mockgen -destination=mock_middleware_metrics_test.go -package $GOPACKAGE -mock_names Interface=MockMiddlewareMetrics github.com/qdm12/dns/v2/pkg/middlewares/metrics Interface -//go:generate mockgen -destination=mock_dot_metrics_test.go -package $GOPACKAGE github.com/qdm12/dns/v2/pkg/dot/metrics DialMetrics -//go:generate mockgen -destination=mock_warner_test.go -package $GOPACKAGE github.com/qdm12/dns/v2/pkg/log Warner - func Test_pickNameAddress(t *testing.T) { t.Parallel() ctrl := gomock.NewController(t) @@ -100,12 +95,12 @@ func Test_dialPlaintext(t *testing.T) { t.Parallel() ctrl := gomock.NewController(t) - warner := NewMockWarner(ctrl) + warner := NewMockLogger(ctrl) if testCase.err != nil { warner.EXPECT().Warn(testCase.err.Error()) } - metrics := NewMockDialMetrics(ctrl) + metrics := NewMockMetrics(ctrl) metrics.EXPECT().DNSDialInc(testCase.expectedAddr, testCase.metricOutcome) picker := NewMockPicker(ctrl) diff --git a/pkg/dot/integration_test.go b/pkg/dot/integration_test.go index bfce4518..240c2389 100644 --- a/pkg/dot/integration_test.go +++ b/pkg/dot/integration_test.go @@ -66,10 +66,6 @@ func Test_Server(t *testing.T) { assert.NoError(t, err) } -//go:generate mockgen -destination=mock_cache_test.go -package $GOPACKAGE -mock_names Interface=MockCache github.com/qdm12/dns/v2/pkg/cache Interface -//go:generate mockgen -destination=mock_filter_test.go -package $GOPACKAGE -mock_names Interface=MockFilter github.com/qdm12/dns/v2/pkg/filter Interface -//go:generate mockgen -destination=mock_logger_test.go -package $GOPACKAGE github.com/qdm12/dns/v2/pkg/log Logger - func Test_Server_Mocks(t *testing.T) { ctrl := gomock.NewController(t) @@ -231,14 +227,14 @@ func Test_Server_Mocks(t *testing.T) { logger := NewMockLogger(ctrl) logger.EXPECT().Info("DNS server listening on :53") - dotMetrics := NewMockDialMetrics(ctrl) + dotMetrics := NewMockMetrics(ctrl) dotMetrics.EXPECT(). DoTDialInc("cloudflare-dns.com", mockhelp.NewMatcherOneOf("1.1.1.1:853", "1.0.0.1:853"), "success"). Times(2) // middleware metrics - metrics := NewMockMiddlewareMetrics(ctrl) + metrics := NewMockmiddlewareMetrics(ctrl) metrics.EXPECT().InFlightRequestsInc().Times(2) metrics.EXPECT().InFlightRequestsDec().Times(2) metrics.EXPECT().RequestsInc().Times(2) diff --git a/pkg/dot/interfaces.go b/pkg/dot/interfaces.go index a9eed392..65e3b664 100644 --- a/pkg/dot/interfaces.go +++ b/pkg/dot/interfaces.go @@ -4,6 +4,7 @@ import ( "net/netip" "github.com/miekg/dns" + "github.com/qdm12/dns/v2/pkg/filter/update" "github.com/qdm12/dns/v2/pkg/provider" ) @@ -11,6 +12,34 @@ type Middleware interface { Wrap(next dns.Handler) dns.Handler } +type Filter interface { + FilterRequest(request *dns.Msg) (blocked bool) + FilterResponse(response *dns.Msg) (blocked bool) + Update(settings update.Settings) +} + +type Cache interface { + Add(request, response *dns.Msg) + Get(request *dns.Msg) (response *dns.Msg) + Remove(request *dns.Msg) +} + +type Metrics interface { + DoTDialInc(provider, address, outcome string) + DNSDialInc(address, outcome string) +} + +type Logger interface { + Debug(s string) + Info(s string) + Warner + Error(s string) +} + +type Warner interface { + Warn(s string) +} + type Picker interface { IP(ips []netip.Addr) netip.Addr DNSServer(servers []provider.DNSServer) provider.DNSServer diff --git a/pkg/dot/interfaces_test.go b/pkg/dot/interfaces_test.go new file mode 100644 index 00000000..ec635830 --- /dev/null +++ b/pkg/dot/interfaces_test.go @@ -0,0 +1,11 @@ +package dot + +type middlewareMetrics interface { //nolint:unused + RequestsInc() + QuestionsInc(class, qType string) + RcodeInc(rcode string) + AnswersInc(class, qType string) + ResponsesInc() + InFlightRequestsInc() + InFlightRequestsDec() +} diff --git a/pkg/dot/metrics/interface.go b/pkg/dot/metrics/interface.go deleted file mode 100644 index 61a21a0b..00000000 --- a/pkg/dot/metrics/interface.go +++ /dev/null @@ -1,22 +0,0 @@ -// Package metrics defines metric interfaces for the -// DoT server and resolver. -package metrics - -import ( - "github.com/qdm12/dns/v2/pkg/dot/metrics/noop" - "github.com/qdm12/dns/v2/pkg/dot/metrics/prometheus" -) - -var ( - _ DialMetrics = (*prometheus.Metrics)(nil) - _ DialMetrics = (*noop.Metrics)(nil) -) - -type DialMetrics interface { - DoTDialInc(provider, address, outcome string) - DialDNSMetrics -} - -type DialDNSMetrics interface { - DNSDialInc(address, outcome string) -} diff --git a/pkg/dot/metrics/noop/metrics.go b/pkg/dot/metrics/noop/metrics.go index a4f7e93c..a237fb40 100644 --- a/pkg/dot/metrics/noop/metrics.go +++ b/pkg/dot/metrics/noop/metrics.go @@ -1,21 +1,11 @@ // Package noop defines a No-Op metric implementation for DoT. package noop -import ( - middleware "github.com/qdm12/dns/v2/pkg/middlewares/metrics" - middlewarenoop "github.com/qdm12/dns/v2/pkg/middlewares/metrics/noop" -) - -type middlewareInterface = middleware.Interface - type Metrics struct { - middlewareInterface } func New() *Metrics { - return &Metrics{ - middlewareInterface: middlewarenoop.New(), - } + return &Metrics{} } func (m *Metrics) DoTDialInc(string, string, string) {} diff --git a/pkg/dot/mock_cache_test.go b/pkg/dot/mock_cache_test.go deleted file mode 100644 index b6b5cd94..00000000 --- a/pkg/dot/mock_cache_test.go +++ /dev/null @@ -1,73 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/cache (interfaces: Interface) - -// Package dot is a generated GoMock package. -package dot - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - dns "github.com/miekg/dns" -) - -// MockCache is a mock of Interface interface. -type MockCache struct { - ctrl *gomock.Controller - recorder *MockCacheMockRecorder -} - -// MockCacheMockRecorder is the mock recorder for MockCache. -type MockCacheMockRecorder struct { - mock *MockCache -} - -// NewMockCache creates a new mock instance. -func NewMockCache(ctrl *gomock.Controller) *MockCache { - mock := &MockCache{ctrl: ctrl} - mock.recorder = &MockCacheMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockCache) EXPECT() *MockCacheMockRecorder { - return m.recorder -} - -// Add mocks base method. -func (m *MockCache) Add(arg0, arg1 *dns.Msg) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Add", arg0, arg1) -} - -// Add indicates an expected call of Add. -func (mr *MockCacheMockRecorder) Add(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockCache)(nil).Add), arg0, arg1) -} - -// Get mocks base method. -func (m *MockCache) Get(arg0 *dns.Msg) *dns.Msg { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", arg0) - ret0, _ := ret[0].(*dns.Msg) - return ret0 -} - -// Get indicates an expected call of Get. -func (mr *MockCacheMockRecorder) Get(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockCache)(nil).Get), arg0) -} - -// Remove mocks base method. -func (m *MockCache) Remove(arg0 *dns.Msg) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Remove", arg0) -} - -// Remove indicates an expected call of Remove. -func (mr *MockCacheMockRecorder) Remove(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remove", reflect.TypeOf((*MockCache)(nil).Remove), arg0) -} diff --git a/pkg/dot/mock_dot_metrics_test.go b/pkg/dot/mock_dot_metrics_test.go deleted file mode 100644 index 4c7c43bd..00000000 --- a/pkg/dot/mock_dot_metrics_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/dot/metrics (interfaces: DialMetrics) - -// Package dot is a generated GoMock package. -package dot - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" -) - -// MockDialMetrics is a mock of DialMetrics interface. -type MockDialMetrics struct { - ctrl *gomock.Controller - recorder *MockDialMetricsMockRecorder -} - -// MockDialMetricsMockRecorder is the mock recorder for MockDialMetrics. -type MockDialMetricsMockRecorder struct { - mock *MockDialMetrics -} - -// NewMockDialMetrics creates a new mock instance. -func NewMockDialMetrics(ctrl *gomock.Controller) *MockDialMetrics { - mock := &MockDialMetrics{ctrl: ctrl} - mock.recorder = &MockDialMetricsMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDialMetrics) EXPECT() *MockDialMetricsMockRecorder { - return m.recorder -} - -// DNSDialInc mocks base method. -func (m *MockDialMetrics) DNSDialInc(arg0, arg1 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "DNSDialInc", arg0, arg1) -} - -// DNSDialInc indicates an expected call of DNSDialInc. -func (mr *MockDialMetricsMockRecorder) DNSDialInc(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DNSDialInc", reflect.TypeOf((*MockDialMetrics)(nil).DNSDialInc), arg0, arg1) -} - -// DoTDialInc mocks base method. -func (m *MockDialMetrics) DoTDialInc(arg0, arg1, arg2 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "DoTDialInc", arg0, arg1, arg2) -} - -// DoTDialInc indicates an expected call of DoTDialInc. -func (mr *MockDialMetricsMockRecorder) DoTDialInc(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoTDialInc", reflect.TypeOf((*MockDialMetrics)(nil).DoTDialInc), arg0, arg1, arg2) -} diff --git a/pkg/dot/mock_filter_test.go b/pkg/dot/mock_filter_test.go deleted file mode 100644 index 2ec0bf3e..00000000 --- a/pkg/dot/mock_filter_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/filter (interfaces: Interface) - -// Package dot is a generated GoMock package. -package dot - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - dns "github.com/miekg/dns" - update "github.com/qdm12/dns/v2/pkg/filter/update" -) - -// MockFilter is a mock of Interface interface. -type MockFilter struct { - ctrl *gomock.Controller - recorder *MockFilterMockRecorder -} - -// MockFilterMockRecorder is the mock recorder for MockFilter. -type MockFilterMockRecorder struct { - mock *MockFilter -} - -// NewMockFilter creates a new mock instance. -func NewMockFilter(ctrl *gomock.Controller) *MockFilter { - mock := &MockFilter{ctrl: ctrl} - mock.recorder = &MockFilterMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockFilter) EXPECT() *MockFilterMockRecorder { - return m.recorder -} - -// FilterRequest mocks base method. -func (m *MockFilter) FilterRequest(arg0 *dns.Msg) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FilterRequest", arg0) - ret0, _ := ret[0].(bool) - return ret0 -} - -// FilterRequest indicates an expected call of FilterRequest. -func (mr *MockFilterMockRecorder) FilterRequest(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterRequest", reflect.TypeOf((*MockFilter)(nil).FilterRequest), arg0) -} - -// FilterResponse mocks base method. -func (m *MockFilter) FilterResponse(arg0 *dns.Msg) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FilterResponse", arg0) - ret0, _ := ret[0].(bool) - return ret0 -} - -// FilterResponse indicates an expected call of FilterResponse. -func (mr *MockFilterMockRecorder) FilterResponse(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterResponse", reflect.TypeOf((*MockFilter)(nil).FilterResponse), arg0) -} - -// Update mocks base method. -func (m *MockFilter) Update(arg0 update.Settings) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Update", arg0) -} - -// Update indicates an expected call of Update. -func (mr *MockFilterMockRecorder) Update(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockFilter)(nil).Update), arg0) -} diff --git a/pkg/dot/mock_logger_test.go b/pkg/dot/mock_logger_test.go deleted file mode 100644 index 11e7be84..00000000 --- a/pkg/dot/mock_logger_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/log (interfaces: Logger) - -// Package dot is a generated GoMock package. -package dot - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" -) - -// MockLogger is a mock of Logger interface. -type MockLogger struct { - ctrl *gomock.Controller - recorder *MockLoggerMockRecorder -} - -// MockLoggerMockRecorder is the mock recorder for MockLogger. -type MockLoggerMockRecorder struct { - mock *MockLogger -} - -// NewMockLogger creates a new mock instance. -func NewMockLogger(ctrl *gomock.Controller) *MockLogger { - mock := &MockLogger{ctrl: ctrl} - mock.recorder = &MockLoggerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockLogger) EXPECT() *MockLoggerMockRecorder { - return m.recorder -} - -// Debug mocks base method. -func (m *MockLogger) Debug(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Debug", arg0) -} - -// Debug indicates an expected call of Debug. -func (mr *MockLoggerMockRecorder) Debug(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Debug", reflect.TypeOf((*MockLogger)(nil).Debug), arg0) -} - -// Error mocks base method. -func (m *MockLogger) Error(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Error", arg0) -} - -// Error indicates an expected call of Error. -func (mr *MockLoggerMockRecorder) Error(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Error", reflect.TypeOf((*MockLogger)(nil).Error), arg0) -} - -// Info mocks base method. -func (m *MockLogger) Info(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Info", arg0) -} - -// Info indicates an expected call of Info. -func (mr *MockLoggerMockRecorder) Info(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockLogger)(nil).Info), arg0) -} - -// Warn mocks base method. -func (m *MockLogger) Warn(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Warn", arg0) -} - -// Warn indicates an expected call of Warn. -func (mr *MockLoggerMockRecorder) Warn(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Warn", reflect.TypeOf((*MockLogger)(nil).Warn), arg0) -} diff --git a/pkg/dot/mock_middleware_metrics_test.go b/pkg/dot/mock_middleware_metrics_test.go deleted file mode 100644 index 01217754..00000000 --- a/pkg/dot/mock_middleware_metrics_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/middlewares/metrics (interfaces: Interface) - -// Package dot is a generated GoMock package. -package dot - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" -) - -// MockMiddlewareMetrics is a mock of Interface interface. -type MockMiddlewareMetrics struct { - ctrl *gomock.Controller - recorder *MockMiddlewareMetricsMockRecorder -} - -// MockMiddlewareMetricsMockRecorder is the mock recorder for MockMiddlewareMetrics. -type MockMiddlewareMetricsMockRecorder struct { - mock *MockMiddlewareMetrics -} - -// NewMockMiddlewareMetrics creates a new mock instance. -func NewMockMiddlewareMetrics(ctrl *gomock.Controller) *MockMiddlewareMetrics { - mock := &MockMiddlewareMetrics{ctrl: ctrl} - mock.recorder = &MockMiddlewareMetricsMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockMiddlewareMetrics) EXPECT() *MockMiddlewareMetricsMockRecorder { - return m.recorder -} - -// AnswersInc mocks base method. -func (m *MockMiddlewareMetrics) AnswersInc(arg0, arg1 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AnswersInc", arg0, arg1) -} - -// AnswersInc indicates an expected call of AnswersInc. -func (mr *MockMiddlewareMetricsMockRecorder) AnswersInc(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AnswersInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).AnswersInc), arg0, arg1) -} - -// InFlightRequestsDec mocks base method. -func (m *MockMiddlewareMetrics) InFlightRequestsDec() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "InFlightRequestsDec") -} - -// InFlightRequestsDec indicates an expected call of InFlightRequestsDec. -func (mr *MockMiddlewareMetricsMockRecorder) InFlightRequestsDec() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InFlightRequestsDec", reflect.TypeOf((*MockMiddlewareMetrics)(nil).InFlightRequestsDec)) -} - -// InFlightRequestsInc mocks base method. -func (m *MockMiddlewareMetrics) InFlightRequestsInc() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "InFlightRequestsInc") -} - -// InFlightRequestsInc indicates an expected call of InFlightRequestsInc. -func (mr *MockMiddlewareMetricsMockRecorder) InFlightRequestsInc() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InFlightRequestsInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).InFlightRequestsInc)) -} - -// QuestionsInc mocks base method. -func (m *MockMiddlewareMetrics) QuestionsInc(arg0, arg1 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "QuestionsInc", arg0, arg1) -} - -// QuestionsInc indicates an expected call of QuestionsInc. -func (mr *MockMiddlewareMetricsMockRecorder) QuestionsInc(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QuestionsInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).QuestionsInc), arg0, arg1) -} - -// RcodeInc mocks base method. -func (m *MockMiddlewareMetrics) RcodeInc(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RcodeInc", arg0) -} - -// RcodeInc indicates an expected call of RcodeInc. -func (mr *MockMiddlewareMetricsMockRecorder) RcodeInc(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RcodeInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).RcodeInc), arg0) -} - -// RequestsInc mocks base method. -func (m *MockMiddlewareMetrics) RequestsInc() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RequestsInc") -} - -// RequestsInc indicates an expected call of RequestsInc. -func (mr *MockMiddlewareMetricsMockRecorder) RequestsInc() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RequestsInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).RequestsInc)) -} - -// ResponsesInc mocks base method. -func (m *MockMiddlewareMetrics) ResponsesInc() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "ResponsesInc") -} - -// ResponsesInc indicates an expected call of ResponsesInc. -func (mr *MockMiddlewareMetricsMockRecorder) ResponsesInc() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResponsesInc", reflect.TypeOf((*MockMiddlewareMetrics)(nil).ResponsesInc)) -} diff --git a/pkg/dot/mock_warner_test.go b/pkg/dot/mock_warner_test.go deleted file mode 100644 index 58aa0fdb..00000000 --- a/pkg/dot/mock_warner_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/log (interfaces: Warner) - -// Package dot is a generated GoMock package. -package dot - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" -) - -// MockWarner is a mock of Warner interface. -type MockWarner struct { - ctrl *gomock.Controller - recorder *MockWarnerMockRecorder -} - -// MockWarnerMockRecorder is the mock recorder for MockWarner. -type MockWarnerMockRecorder struct { - mock *MockWarner -} - -// NewMockWarner creates a new mock instance. -func NewMockWarner(ctrl *gomock.Controller) *MockWarner { - mock := &MockWarner{ctrl: ctrl} - mock.recorder = &MockWarnerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockWarner) EXPECT() *MockWarnerMockRecorder { - return m.recorder -} - -// Warn mocks base method. -func (m *MockWarner) Warn(arg0 string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Warn", arg0) -} - -// Warn indicates an expected call of Warn. -func (mr *MockWarnerMockRecorder) Warn(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Warn", reflect.TypeOf((*MockWarner)(nil).Warn), arg0) -} diff --git a/pkg/dot/mocks_generate_test.go b/pkg/dot/mocks_generate_test.go new file mode 100644 index 00000000..18654685 --- /dev/null +++ b/pkg/dot/mocks_generate_test.go @@ -0,0 +1,4 @@ +package dot + +//go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Filter,Cache,Metrics,Logger,Picker +//go:generate mockgen -destination=mocks_local_test.go -package $GOPACKAGE -source interfaces_test.go diff --git a/pkg/dot/mocks_local_test.go b/pkg/dot/mocks_local_test.go new file mode 100644 index 00000000..74856299 --- /dev/null +++ b/pkg/dot/mocks_local_test.go @@ -0,0 +1,118 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: interfaces_test.go + +// Package dot is a generated GoMock package. +package dot + +import ( + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// MockmiddlewareMetrics is a mock of middlewareMetrics interface. +type MockmiddlewareMetrics struct { + ctrl *gomock.Controller + recorder *MockmiddlewareMetricsMockRecorder +} + +// MockmiddlewareMetricsMockRecorder is the mock recorder for MockmiddlewareMetrics. +type MockmiddlewareMetricsMockRecorder struct { + mock *MockmiddlewareMetrics +} + +// NewMockmiddlewareMetrics creates a new mock instance. +func NewMockmiddlewareMetrics(ctrl *gomock.Controller) *MockmiddlewareMetrics { + mock := &MockmiddlewareMetrics{ctrl: ctrl} + mock.recorder = &MockmiddlewareMetricsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockmiddlewareMetrics) EXPECT() *MockmiddlewareMetricsMockRecorder { + return m.recorder +} + +// AnswersInc mocks base method. +func (m *MockmiddlewareMetrics) AnswersInc(class, qType string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "AnswersInc", class, qType) +} + +// AnswersInc indicates an expected call of AnswersInc. +func (mr *MockmiddlewareMetricsMockRecorder) AnswersInc(class, qType interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AnswersInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).AnswersInc), class, qType) +} + +// InFlightRequestsDec mocks base method. +func (m *MockmiddlewareMetrics) InFlightRequestsDec() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "InFlightRequestsDec") +} + +// InFlightRequestsDec indicates an expected call of InFlightRequestsDec. +func (mr *MockmiddlewareMetricsMockRecorder) InFlightRequestsDec() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InFlightRequestsDec", reflect.TypeOf((*MockmiddlewareMetrics)(nil).InFlightRequestsDec)) +} + +// InFlightRequestsInc mocks base method. +func (m *MockmiddlewareMetrics) InFlightRequestsInc() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "InFlightRequestsInc") +} + +// InFlightRequestsInc indicates an expected call of InFlightRequestsInc. +func (mr *MockmiddlewareMetricsMockRecorder) InFlightRequestsInc() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InFlightRequestsInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).InFlightRequestsInc)) +} + +// QuestionsInc mocks base method. +func (m *MockmiddlewareMetrics) QuestionsInc(class, qType string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "QuestionsInc", class, qType) +} + +// QuestionsInc indicates an expected call of QuestionsInc. +func (mr *MockmiddlewareMetricsMockRecorder) QuestionsInc(class, qType interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QuestionsInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).QuestionsInc), class, qType) +} + +// RcodeInc mocks base method. +func (m *MockmiddlewareMetrics) RcodeInc(rcode string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RcodeInc", rcode) +} + +// RcodeInc indicates an expected call of RcodeInc. +func (mr *MockmiddlewareMetricsMockRecorder) RcodeInc(rcode interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RcodeInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).RcodeInc), rcode) +} + +// RequestsInc mocks base method. +func (m *MockmiddlewareMetrics) RequestsInc() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RequestsInc") +} + +// RequestsInc indicates an expected call of RequestsInc. +func (mr *MockmiddlewareMetricsMockRecorder) RequestsInc() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RequestsInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).RequestsInc)) +} + +// ResponsesInc mocks base method. +func (m *MockmiddlewareMetrics) ResponsesInc() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ResponsesInc") +} + +// ResponsesInc indicates an expected call of ResponsesInc. +func (mr *MockmiddlewareMetricsMockRecorder) ResponsesInc() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResponsesInc", reflect.TypeOf((*MockmiddlewareMetrics)(nil).ResponsesInc)) +} diff --git a/pkg/dot/mocks_test.go b/pkg/dot/mocks_test.go index a6e8306e..fc225447 100644 --- a/pkg/dot/mocks_test.go +++ b/pkg/dot/mocks_test.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/qdm12/dns/v2/pkg/dot (interfaces: Picker) +// Source: github.com/qdm12/dns/v2/pkg/dot (interfaces: Filter,Cache,Metrics,Logger,Picker) // Package dot is a generated GoMock package. package dot @@ -9,9 +9,253 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" + dns "github.com/miekg/dns" + update "github.com/qdm12/dns/v2/pkg/filter/update" provider "github.com/qdm12/dns/v2/pkg/provider" ) +// MockFilter is a mock of Filter interface. +type MockFilter struct { + ctrl *gomock.Controller + recorder *MockFilterMockRecorder +} + +// MockFilterMockRecorder is the mock recorder for MockFilter. +type MockFilterMockRecorder struct { + mock *MockFilter +} + +// NewMockFilter creates a new mock instance. +func NewMockFilter(ctrl *gomock.Controller) *MockFilter { + mock := &MockFilter{ctrl: ctrl} + mock.recorder = &MockFilterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockFilter) EXPECT() *MockFilterMockRecorder { + return m.recorder +} + +// FilterRequest mocks base method. +func (m *MockFilter) FilterRequest(arg0 *dns.Msg) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FilterRequest", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// FilterRequest indicates an expected call of FilterRequest. +func (mr *MockFilterMockRecorder) FilterRequest(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterRequest", reflect.TypeOf((*MockFilter)(nil).FilterRequest), arg0) +} + +// FilterResponse mocks base method. +func (m *MockFilter) FilterResponse(arg0 *dns.Msg) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FilterResponse", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// FilterResponse indicates an expected call of FilterResponse. +func (mr *MockFilterMockRecorder) FilterResponse(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterResponse", reflect.TypeOf((*MockFilter)(nil).FilterResponse), arg0) +} + +// Update mocks base method. +func (m *MockFilter) Update(arg0 update.Settings) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Update", arg0) +} + +// Update indicates an expected call of Update. +func (mr *MockFilterMockRecorder) Update(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockFilter)(nil).Update), arg0) +} + +// MockCache is a mock of Cache interface. +type MockCache struct { + ctrl *gomock.Controller + recorder *MockCacheMockRecorder +} + +// MockCacheMockRecorder is the mock recorder for MockCache. +type MockCacheMockRecorder struct { + mock *MockCache +} + +// NewMockCache creates a new mock instance. +func NewMockCache(ctrl *gomock.Controller) *MockCache { + mock := &MockCache{ctrl: ctrl} + mock.recorder = &MockCacheMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockCache) EXPECT() *MockCacheMockRecorder { + return m.recorder +} + +// Add mocks base method. +func (m *MockCache) Add(arg0, arg1 *dns.Msg) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Add", arg0, arg1) +} + +// Add indicates an expected call of Add. +func (mr *MockCacheMockRecorder) Add(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockCache)(nil).Add), arg0, arg1) +} + +// Get mocks base method. +func (m *MockCache) Get(arg0 *dns.Msg) *dns.Msg { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0) + ret0, _ := ret[0].(*dns.Msg) + return ret0 +} + +// Get indicates an expected call of Get. +func (mr *MockCacheMockRecorder) Get(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockCache)(nil).Get), arg0) +} + +// Remove mocks base method. +func (m *MockCache) Remove(arg0 *dns.Msg) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Remove", arg0) +} + +// Remove indicates an expected call of Remove. +func (mr *MockCacheMockRecorder) Remove(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remove", reflect.TypeOf((*MockCache)(nil).Remove), arg0) +} + +// MockMetrics is a mock of Metrics interface. +type MockMetrics struct { + ctrl *gomock.Controller + recorder *MockMetricsMockRecorder +} + +// MockMetricsMockRecorder is the mock recorder for MockMetrics. +type MockMetricsMockRecorder struct { + mock *MockMetrics +} + +// NewMockMetrics creates a new mock instance. +func NewMockMetrics(ctrl *gomock.Controller) *MockMetrics { + mock := &MockMetrics{ctrl: ctrl} + mock.recorder = &MockMetricsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockMetrics) EXPECT() *MockMetricsMockRecorder { + return m.recorder +} + +// DNSDialInc mocks base method. +func (m *MockMetrics) DNSDialInc(arg0, arg1 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DNSDialInc", arg0, arg1) +} + +// DNSDialInc indicates an expected call of DNSDialInc. +func (mr *MockMetricsMockRecorder) DNSDialInc(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DNSDialInc", reflect.TypeOf((*MockMetrics)(nil).DNSDialInc), arg0, arg1) +} + +// DoTDialInc mocks base method. +func (m *MockMetrics) DoTDialInc(arg0, arg1, arg2 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DoTDialInc", arg0, arg1, arg2) +} + +// DoTDialInc indicates an expected call of DoTDialInc. +func (mr *MockMetricsMockRecorder) DoTDialInc(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoTDialInc", reflect.TypeOf((*MockMetrics)(nil).DoTDialInc), arg0, arg1, arg2) +} + +// MockLogger is a mock of Logger interface. +type MockLogger struct { + ctrl *gomock.Controller + recorder *MockLoggerMockRecorder +} + +// MockLoggerMockRecorder is the mock recorder for MockLogger. +type MockLoggerMockRecorder struct { + mock *MockLogger +} + +// NewMockLogger creates a new mock instance. +func NewMockLogger(ctrl *gomock.Controller) *MockLogger { + mock := &MockLogger{ctrl: ctrl} + mock.recorder = &MockLoggerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockLogger) EXPECT() *MockLoggerMockRecorder { + return m.recorder +} + +// Debug mocks base method. +func (m *MockLogger) Debug(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Debug", arg0) +} + +// Debug indicates an expected call of Debug. +func (mr *MockLoggerMockRecorder) Debug(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Debug", reflect.TypeOf((*MockLogger)(nil).Debug), arg0) +} + +// Error mocks base method. +func (m *MockLogger) Error(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Error", arg0) +} + +// Error indicates an expected call of Error. +func (mr *MockLoggerMockRecorder) Error(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Error", reflect.TypeOf((*MockLogger)(nil).Error), arg0) +} + +// Info mocks base method. +func (m *MockLogger) Info(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Info", arg0) +} + +// Info indicates an expected call of Info. +func (mr *MockLoggerMockRecorder) Info(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockLogger)(nil).Info), arg0) +} + +// Warn mocks base method. +func (m *MockLogger) Warn(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Warn", arg0) +} + +// Warn indicates an expected call of Warn. +func (mr *MockLoggerMockRecorder) Warn(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Warn", reflect.TypeOf((*MockLogger)(nil).Warn), arg0) +} + // MockPicker is a mock of Picker interface. type MockPicker struct { ctrl *gomock.Controller diff --git a/pkg/dot/server.go b/pkg/dot/server.go index 924ca64d..694ea5ee 100644 --- a/pkg/dot/server.go +++ b/pkg/dot/server.go @@ -6,13 +6,12 @@ import ( "sync" "github.com/miekg/dns" - "github.com/qdm12/dns/v2/pkg/log" ) type Server struct { // Dependencies injected settings ServerSettings - logger log.Logger + logger Logger // Internal state running bool diff --git a/pkg/dot/settings.go b/pkg/dot/settings.go index 939bec52..2bd3f727 100644 --- a/pkg/dot/settings.go +++ b/pkg/dot/settings.go @@ -7,13 +7,9 @@ import ( "time" "github.com/qdm12/dns/v2/internal/picker" - "github.com/qdm12/dns/v2/pkg/cache" cachenoop "github.com/qdm12/dns/v2/pkg/cache/noop" - "github.com/qdm12/dns/v2/pkg/dot/metrics" metricsnoop "github.com/qdm12/dns/v2/pkg/dot/metrics/noop" - "github.com/qdm12/dns/v2/pkg/filter" filternoop "github.com/qdm12/dns/v2/pkg/filter/noop" - "github.com/qdm12/dns/v2/pkg/log" lognoop "github.com/qdm12/dns/v2/pkg/log/noop" "github.com/qdm12/dns/v2/pkg/provider" "github.com/qdm12/gosettings" @@ -33,13 +29,13 @@ type ServerSettings struct { // Cache is the cache to use in the server. // It defaults to a No-Op cache implementation with // a No-Op cache metrics implementation. - Cache cache.Interface + Cache Cache // Filter is the filter for DNS requests and responses. // It defaults to a No-Op filter implementation. - Filter filter.Interface + Filter Filter // Logger is the logger to log information. // It defaults to a No-Op logger implementation. - Logger log.Logger + Logger Logger // Metrics is the metrics interface to record metric data. // It defaults to a No-Op metrics implementation. // Metrics metrics.DialMetrics @@ -54,10 +50,10 @@ type ResolverSettings struct { IPv6 bool // Warner is the warning logger to log dial errors. // It defaults to a No-Op warner implementation. - Warner log.Warner + Warner Warner // Metrics is the metrics interface to record metric data. // It defaults to a No-Op metrics implementation. - Metrics metrics.DialMetrics + Metrics Metrics // Picker is the picker to use for each upstream call to pick // a server and/or IP address. It must be thread safe. // It defaults to a fast thread safe pseudo random picker diff --git a/pkg/filter/interface.go b/pkg/filter/interface.go deleted file mode 100644 index 3104f832..00000000 --- a/pkg/filter/interface.go +++ /dev/null @@ -1,19 +0,0 @@ -package filter - -import ( - "github.com/miekg/dns" - "github.com/qdm12/dns/v2/pkg/filter/mapfilter" - "github.com/qdm12/dns/v2/pkg/filter/noop" - "github.com/qdm12/dns/v2/pkg/filter/update" -) - -var ( - _ Interface = (*mapfilter.Filter)(nil) - _ Interface = (*noop.Filter)(nil) -) - -type Interface interface { - FilterRequest(request *dns.Msg) (blocked bool) - FilterResponse(response *dns.Msg) (blocked bool) - Update(settings update.Settings) -} diff --git a/pkg/filter/mapfilter/filter.go b/pkg/filter/mapfilter/filter.go index c86ae40c..36673184 100644 --- a/pkg/filter/mapfilter/filter.go +++ b/pkg/filter/mapfilter/filter.go @@ -3,15 +3,13 @@ package mapfilter import ( "net/netip" "sync" - - "github.com/qdm12/dns/v2/pkg/filter/metrics" ) type Filter struct { fqdnHostnames map[string]struct{} ips map[netip.Addr]struct{} ipPrefixes []netip.Prefix - metrics metrics.Interface + metrics Metrics updateLock sync.RWMutex } diff --git a/pkg/filter/mapfilter/interfaces.go b/pkg/filter/mapfilter/interfaces.go new file mode 100644 index 00000000..964931e7 --- /dev/null +++ b/pkg/filter/mapfilter/interfaces.go @@ -0,0 +1,9 @@ +package mapfilter + +type Metrics interface { + SetBlockedHostnames(n int) + SetBlockedIPs(n int) + SetBlockedIPPrefixes(n int) + HostnamesFilteredInc(qClass, qType string) + IPsFilteredInc(rrtype string) +} diff --git a/pkg/filter/mapfilter/settings.go b/pkg/filter/mapfilter/settings.go index 9c420cbf..4077941e 100644 --- a/pkg/filter/mapfilter/settings.go +++ b/pkg/filter/mapfilter/settings.go @@ -5,7 +5,6 @@ import ( "reflect" "strings" - "github.com/qdm12/dns/v2/pkg/filter/metrics" "github.com/qdm12/dns/v2/pkg/filter/metrics/noop" "github.com/qdm12/dns/v2/pkg/filter/metrics/prometheus" "github.com/qdm12/dns/v2/pkg/filter/update" @@ -18,7 +17,7 @@ type Settings struct { Update update.Settings // Metrics is the metric interface and defaults // to a no-op implementation if left unset. - Metrics metrics.Interface + Metrics Metrics } func (s *Settings) SetDefaults() { diff --git a/pkg/filter/metrics/interface.go b/pkg/filter/metrics/interface.go deleted file mode 100644 index e842f5a6..00000000 --- a/pkg/filter/metrics/interface.go +++ /dev/null @@ -1,20 +0,0 @@ -// Package metrics defines a metrics interface for the filter. -package metrics - -import ( - "github.com/qdm12/dns/v2/pkg/filter/metrics/noop" - "github.com/qdm12/dns/v2/pkg/filter/metrics/prometheus" -) - -var ( - _ Interface = (*prometheus.Metrics)(nil) - _ Interface = (*noop.Metrics)(nil) -) - -type Interface interface { - SetBlockedHostnames(n int) - SetBlockedIPs(n int) - SetBlockedIPPrefixes(n int) - HostnamesFilteredInc(qClass, qType string) - IPsFilteredInc(rrtype string) -} diff --git a/pkg/log/interface.go b/pkg/log/interface.go deleted file mode 100644 index a5d23b49..00000000 --- a/pkg/log/interface.go +++ /dev/null @@ -1,19 +0,0 @@ -package log - -import "github.com/qdm12/dns/v2/pkg/log/noop" - -var ( - _ Logger = (*noop.Logger)(nil) - _ Warner = (*noop.Logger)(nil) -) - -type Logger interface { - Debug(s string) - Info(s string) - Warner - Error(s string) -} - -type Warner interface { - Warn(s string) -} diff --git a/pkg/middlewares/metrics/interface.go b/pkg/middlewares/metrics/interface.go deleted file mode 100644 index b7436b0f..00000000 --- a/pkg/middlewares/metrics/interface.go +++ /dev/null @@ -1,21 +0,0 @@ -package metrics - -import ( - "github.com/qdm12/dns/v2/pkg/middlewares/metrics/noop" - "github.com/qdm12/dns/v2/pkg/middlewares/metrics/prometheus" -) - -var ( - _ Interface = (*prometheus.Metrics)(nil) - _ Interface = (*noop.Metrics)(nil) -) - -type Interface interface { - RequestsInc() - QuestionsInc(class, qType string) - RcodeInc(rcode string) - AnswersInc(class, qType string) - ResponsesInc() - InFlightRequestsInc() - InFlightRequestsDec() -} diff --git a/pkg/middlewares/metrics/interfaces.go b/pkg/middlewares/metrics/interfaces.go new file mode 100644 index 00000000..3a526d7b --- /dev/null +++ b/pkg/middlewares/metrics/interfaces.go @@ -0,0 +1,11 @@ +package metrics + +type Metrics interface { + RequestsInc() + QuestionsInc(class, qType string) + RcodeInc(rcode string) + AnswersInc(class, qType string) + ResponsesInc() + InFlightRequestsInc() + InFlightRequestsDec() +} diff --git a/pkg/middlewares/metrics/middleware.go b/pkg/middlewares/metrics/middleware.go index 2565bb41..7fd1eef1 100644 --- a/pkg/middlewares/metrics/middleware.go +++ b/pkg/middlewares/metrics/middleware.go @@ -10,7 +10,7 @@ import ( ) type Middleware struct { - metrics Interface + metrics Metrics } func New(settings Settings) *Middleware { @@ -30,7 +30,7 @@ func (m *Middleware) Wrap(next dns.Handler) dns.Handler { //nolint:ireturn type handler struct { next dns.Handler - metrics Interface + metrics Metrics } func (h *handler) ServeDNS(w dns.ResponseWriter, response *dns.Msg) { diff --git a/pkg/middlewares/metrics/settings.go b/pkg/middlewares/metrics/settings.go index d15eab41..659d92ac 100644 --- a/pkg/middlewares/metrics/settings.go +++ b/pkg/middlewares/metrics/settings.go @@ -8,7 +8,7 @@ import ( type Settings struct { // Metrics is the interface to interact with metrics in the // DNS middleware. It defaults to a No-Op implementation. - Metrics Interface + Metrics Metrics } func (s *Settings) SetDefaults() {