github.com/netdata/go.d.plugin@v0.58.1/modules/coredns/coredns_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package coredns
     4  
     5  import (
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  var (
    16  	testNoLoad169, _       = os.ReadFile("testdata/version169/no_load.txt")
    17  	testSomeLoad169, _     = os.ReadFile("testdata/version169/some_load.txt")
    18  	testNoLoad170, _       = os.ReadFile("testdata/version170/no_load.txt")
    19  	testSomeLoad170, _     = os.ReadFile("testdata/version170/some_load.txt")
    20  	testNoLoadNoVersion, _ = os.ReadFile("testdata/no_version/no_load.txt")
    21  )
    22  
    23  func TestNew(t *testing.T) {
    24  	job := New()
    25  
    26  	assert.IsType(t, (*CoreDNS)(nil), job)
    27  	assert.Equal(t, defaultURL, job.URL)
    28  	assert.Equal(t, defaultHTTPTimeout, job.Timeout.Duration)
    29  }
    30  
    31  func TestCoreDNS_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) }
    32  
    33  func TestCoreDNS_Cleanup(t *testing.T) { New().Cleanup() }
    34  
    35  func TestCoreDNS_Init(t *testing.T) { assert.True(t, New().Init()) }
    36  
    37  func TestCoreDNS_InitNG(t *testing.T) {
    38  	job := New()
    39  	job.URL = ""
    40  	assert.False(t, job.Init())
    41  }
    42  
    43  func TestCoreDNS_Check(t *testing.T) {
    44  	tests := []struct {
    45  		name string
    46  		data []byte
    47  	}{
    48  		{"version 1.6.9", testNoLoad169},
    49  		{"version 1.7.0", testNoLoad170},
    50  	}
    51  	for _, testNoLoad := range tests {
    52  		t.Run(testNoLoad.name, func(t *testing.T) {
    53  
    54  			ts := httptest.NewServer(
    55  				http.HandlerFunc(
    56  					func(w http.ResponseWriter, r *http.Request) {
    57  						_, _ = w.Write(testNoLoad.data)
    58  					}))
    59  			defer ts.Close()
    60  
    61  			job := New()
    62  			job.URL = ts.URL + "/metrics"
    63  			require.True(t, job.Init())
    64  			assert.True(t, job.Check())
    65  		})
    66  	}
    67  }
    68  
    69  func TestCoreDNS_CheckNG(t *testing.T) {
    70  	job := New()
    71  	job.URL = "http://127.0.0.1:38001/metrics"
    72  	require.True(t, job.Init())
    73  	assert.False(t, job.Check())
    74  }
    75  
    76  func TestCoreDNS_Collect(t *testing.T) {
    77  	tests := []struct {
    78  		name string
    79  		data []byte
    80  	}{
    81  		{"version 1.6.9", testSomeLoad169},
    82  		{"version 1.7.0", testSomeLoad170},
    83  	}
    84  	for _, testSomeLoad := range tests {
    85  		t.Run(testSomeLoad.name, func(t *testing.T) {
    86  
    87  			ts := httptest.NewServer(
    88  				http.HandlerFunc(
    89  					func(w http.ResponseWriter, r *http.Request) {
    90  						_, _ = w.Write(testSomeLoad.data)
    91  					}))
    92  			defer ts.Close()
    93  
    94  			job := New()
    95  			job.URL = ts.URL + "/metrics"
    96  			job.PerServerStats.Includes = []string{"glob:*"}
    97  			job.PerZoneStats.Includes = []string{"glob:*"}
    98  			require.True(t, job.Init())
    99  			require.True(t, job.Check())
   100  
   101  			expected := map[string]int64{
   102  				"coredns.io._request_per_ip_family_v4":     19,
   103  				"coredns.io._request_per_ip_family_v6":     0,
   104  				"coredns.io._request_per_proto_tcp":        0,
   105  				"coredns.io._request_per_proto_udp":        19,
   106  				"coredns.io._request_per_status_dropped":   0,
   107  				"coredns.io._request_per_status_processed": 0,
   108  				"coredns.io._request_per_type_A":           6,
   109  				"coredns.io._request_per_type_AAAA":        6,
   110  				"coredns.io._request_per_type_ANY":         0,
   111  				"coredns.io._request_per_type_CNAME":       0,
   112  				"coredns.io._request_per_type_DNSKEY":      0,
   113  				"coredns.io._request_per_type_DS":          0,
   114  				"coredns.io._request_per_type_IXFR":        0,
   115  				"coredns.io._request_per_type_MX":          7,
   116  				"coredns.io._request_per_type_NS":          0,
   117  				"coredns.io._request_per_type_NSEC":        0,
   118  				"coredns.io._request_per_type_NSEC3":       0,
   119  				"coredns.io._request_per_type_PTR":         0,
   120  				"coredns.io._request_per_type_RRSIG":       0,
   121  				"coredns.io._request_per_type_SOA":         0,
   122  				"coredns.io._request_per_type_SRV":         0,
   123  				"coredns.io._request_per_type_TXT":         0,
   124  				"coredns.io._request_per_type_other":       0,
   125  				"coredns.io._request_total":                19,
   126  				"coredns.io._response_per_rcode_BADALG":    0,
   127  				"coredns.io._response_per_rcode_BADCOOKIE": 0,
   128  				"coredns.io._response_per_rcode_BADKEY":    0,
   129  				"coredns.io._response_per_rcode_BADMODE":   0,
   130  				"coredns.io._response_per_rcode_BADNAME":   0,
   131  				"coredns.io._response_per_rcode_BADSIG":    0,
   132  				"coredns.io._response_per_rcode_BADTIME":   0,
   133  				"coredns.io._response_per_rcode_BADTRUNC":  0,
   134  				"coredns.io._response_per_rcode_FORMERR":   0,
   135  				"coredns.io._response_per_rcode_NOERROR":   19,
   136  				"coredns.io._response_per_rcode_NOTAUTH":   0,
   137  				"coredns.io._response_per_rcode_NOTIMP":    0,
   138  				"coredns.io._response_per_rcode_NOTZONE":   0,
   139  				"coredns.io._response_per_rcode_NXDOMAIN":  0,
   140  				"coredns.io._response_per_rcode_NXRRSET":   0,
   141  				"coredns.io._response_per_rcode_REFUSED":   0,
   142  				"coredns.io._response_per_rcode_SERVFAIL":  0,
   143  				"coredns.io._response_per_rcode_YXDOMAIN":  0,
   144  				"coredns.io._response_per_rcode_YXRRSET":   0,
   145  				"coredns.io._response_per_rcode_other":     0,
   146  				"coredns.io._response_total":               19,
   147  				"dns://:53_request_per_ip_family_v4":       15,
   148  				"dns://:53_request_per_ip_family_v6":       0,
   149  				"dns://:53_request_per_proto_tcp":          0,
   150  				"dns://:53_request_per_proto_udp":          15,
   151  				"dns://:53_request_per_status_dropped":     9,
   152  				"dns://:53_request_per_status_processed":   6,
   153  				"dns://:53_request_per_type_A":             5,
   154  				"dns://:53_request_per_type_AAAA":          5,
   155  				"dns://:53_request_per_type_ANY":           0,
   156  				"dns://:53_request_per_type_CNAME":         0,
   157  				"dns://:53_request_per_type_DNSKEY":        0,
   158  				"dns://:53_request_per_type_DS":            0,
   159  				"dns://:53_request_per_type_IXFR":          0,
   160  				"dns://:53_request_per_type_MX":            5,
   161  				"dns://:53_request_per_type_NS":            0,
   162  				"dns://:53_request_per_type_NSEC":          0,
   163  				"dns://:53_request_per_type_NSEC3":         0,
   164  				"dns://:53_request_per_type_PTR":           0,
   165  				"dns://:53_request_per_type_RRSIG":         0,
   166  				"dns://:53_request_per_type_SOA":           0,
   167  				"dns://:53_request_per_type_SRV":           0,
   168  				"dns://:53_request_per_type_TXT":           0,
   169  				"dns://:53_request_per_type_other":         0,
   170  				"dns://:53_request_total":                  15,
   171  				"dns://:53_response_per_rcode_BADALG":      0,
   172  				"dns://:53_response_per_rcode_BADCOOKIE":   0,
   173  				"dns://:53_response_per_rcode_BADKEY":      0,
   174  				"dns://:53_response_per_rcode_BADMODE":     0,
   175  				"dns://:53_response_per_rcode_BADNAME":     0,
   176  				"dns://:53_response_per_rcode_BADSIG":      0,
   177  				"dns://:53_response_per_rcode_BADTIME":     0,
   178  				"dns://:53_response_per_rcode_BADTRUNC":    0,
   179  				"dns://:53_response_per_rcode_FORMERR":     0,
   180  				"dns://:53_response_per_rcode_NOERROR":     6,
   181  				"dns://:53_response_per_rcode_NOTAUTH":     0,
   182  				"dns://:53_response_per_rcode_NOTIMP":      0,
   183  				"dns://:53_response_per_rcode_NOTZONE":     0,
   184  				"dns://:53_response_per_rcode_NXDOMAIN":    0,
   185  				"dns://:53_response_per_rcode_NXRRSET":     0,
   186  				"dns://:53_response_per_rcode_REFUSED":     0,
   187  				"dns://:53_response_per_rcode_SERVFAIL":    9,
   188  				"dns://:53_response_per_rcode_YXDOMAIN":    0,
   189  				"dns://:53_response_per_rcode_YXRRSET":     0,
   190  				"dns://:53_response_per_rcode_other":       0,
   191  				"dns://:53_response_total":                 15,
   192  				"dns://:54_request_per_ip_family_v4":       25,
   193  				"dns://:54_request_per_ip_family_v6":       0,
   194  				"dns://:54_request_per_proto_tcp":          0,
   195  				"dns://:54_request_per_proto_udp":          25,
   196  				"dns://:54_request_per_status_dropped":     12,
   197  				"dns://:54_request_per_status_processed":   13,
   198  				"dns://:54_request_per_type_A":             8,
   199  				"dns://:54_request_per_type_AAAA":          8,
   200  				"dns://:54_request_per_type_ANY":           0,
   201  				"dns://:54_request_per_type_CNAME":         0,
   202  				"dns://:54_request_per_type_DNSKEY":        0,
   203  				"dns://:54_request_per_type_DS":            0,
   204  				"dns://:54_request_per_type_IXFR":          0,
   205  				"dns://:54_request_per_type_MX":            9,
   206  				"dns://:54_request_per_type_NS":            0,
   207  				"dns://:54_request_per_type_NSEC":          0,
   208  				"dns://:54_request_per_type_NSEC3":         0,
   209  				"dns://:54_request_per_type_PTR":           0,
   210  				"dns://:54_request_per_type_RRSIG":         0,
   211  				"dns://:54_request_per_type_SOA":           0,
   212  				"dns://:54_request_per_type_SRV":           0,
   213  				"dns://:54_request_per_type_TXT":           0,
   214  				"dns://:54_request_per_type_other":         0,
   215  				"dns://:54_request_total":                  25,
   216  				"dns://:54_response_per_rcode_BADALG":      0,
   217  				"dns://:54_response_per_rcode_BADCOOKIE":   0,
   218  				"dns://:54_response_per_rcode_BADKEY":      0,
   219  				"dns://:54_response_per_rcode_BADMODE":     0,
   220  				"dns://:54_response_per_rcode_BADNAME":     0,
   221  				"dns://:54_response_per_rcode_BADSIG":      0,
   222  				"dns://:54_response_per_rcode_BADTIME":     0,
   223  				"dns://:54_response_per_rcode_BADTRUNC":    0,
   224  				"dns://:54_response_per_rcode_FORMERR":     0,
   225  				"dns://:54_response_per_rcode_NOERROR":     13,
   226  				"dns://:54_response_per_rcode_NOTAUTH":     0,
   227  				"dns://:54_response_per_rcode_NOTIMP":      0,
   228  				"dns://:54_response_per_rcode_NOTZONE":     0,
   229  				"dns://:54_response_per_rcode_NXDOMAIN":    0,
   230  				"dns://:54_response_per_rcode_NXRRSET":     0,
   231  				"dns://:54_response_per_rcode_REFUSED":     0,
   232  				"dns://:54_response_per_rcode_SERVFAIL":    12,
   233  				"dns://:54_response_per_rcode_YXDOMAIN":    0,
   234  				"dns://:54_response_per_rcode_YXRRSET":     0,
   235  				"dns://:54_response_per_rcode_other":       0,
   236  				"dns://:54_response_total":                 25,
   237  				"dropped_request_per_ip_family_v4":         42,
   238  				"dropped_request_per_ip_family_v6":         0,
   239  				"dropped_request_per_proto_tcp":            0,
   240  				"dropped_request_per_proto_udp":            42,
   241  				"dropped_request_per_status_dropped":       0,
   242  				"dropped_request_per_status_processed":     0,
   243  				"dropped_request_per_type_A":               14,
   244  				"dropped_request_per_type_AAAA":            14,
   245  				"dropped_request_per_type_ANY":             0,
   246  				"dropped_request_per_type_CNAME":           0,
   247  				"dropped_request_per_type_DNSKEY":          0,
   248  				"dropped_request_per_type_DS":              0,
   249  				"dropped_request_per_type_IXFR":            0,
   250  				"dropped_request_per_type_MX":              14,
   251  				"dropped_request_per_type_NS":              0,
   252  				"dropped_request_per_type_NSEC":            0,
   253  				"dropped_request_per_type_NSEC3":           0,
   254  				"dropped_request_per_type_PTR":             0,
   255  				"dropped_request_per_type_RRSIG":           0,
   256  				"dropped_request_per_type_SOA":             0,
   257  				"dropped_request_per_type_SRV":             0,
   258  				"dropped_request_per_type_TXT":             0,
   259  				"dropped_request_per_type_other":           0,
   260  				"dropped_request_total":                    42,
   261  				"dropped_response_per_rcode_BADALG":        0,
   262  				"dropped_response_per_rcode_BADCOOKIE":     0,
   263  				"dropped_response_per_rcode_BADKEY":        0,
   264  				"dropped_response_per_rcode_BADMODE":       0,
   265  				"dropped_response_per_rcode_BADNAME":       0,
   266  				"dropped_response_per_rcode_BADSIG":        0,
   267  				"dropped_response_per_rcode_BADTIME":       0,
   268  				"dropped_response_per_rcode_BADTRUNC":      0,
   269  				"dropped_response_per_rcode_FORMERR":       0,
   270  				"dropped_response_per_rcode_NOERROR":       0,
   271  				"dropped_response_per_rcode_NOTAUTH":       0,
   272  				"dropped_response_per_rcode_NOTIMP":        0,
   273  				"dropped_response_per_rcode_NOTZONE":       0,
   274  				"dropped_response_per_rcode_NXDOMAIN":      0,
   275  				"dropped_response_per_rcode_NXRRSET":       0,
   276  				"dropped_response_per_rcode_REFUSED":       21,
   277  				"dropped_response_per_rcode_SERVFAIL":      21,
   278  				"dropped_response_per_rcode_YXDOMAIN":      0,
   279  				"dropped_response_per_rcode_YXRRSET":       0,
   280  				"dropped_response_per_rcode_other":         0,
   281  				"dropped_response_total":                   42,
   282  				"empty_request_per_ip_family_v4":           21,
   283  				"empty_request_per_ip_family_v6":           0,
   284  				"empty_request_per_proto_tcp":              0,
   285  				"empty_request_per_proto_udp":              21,
   286  				"empty_request_per_status_dropped":         21,
   287  				"empty_request_per_status_processed":       0,
   288  				"empty_request_per_type_A":                 7,
   289  				"empty_request_per_type_AAAA":              7,
   290  				"empty_request_per_type_ANY":               0,
   291  				"empty_request_per_type_CNAME":             0,
   292  				"empty_request_per_type_DNSKEY":            0,
   293  				"empty_request_per_type_DS":                0,
   294  				"empty_request_per_type_IXFR":              0,
   295  				"empty_request_per_type_MX":                7,
   296  				"empty_request_per_type_NS":                0,
   297  				"empty_request_per_type_NSEC":              0,
   298  				"empty_request_per_type_NSEC3":             0,
   299  				"empty_request_per_type_PTR":               0,
   300  				"empty_request_per_type_RRSIG":             0,
   301  				"empty_request_per_type_SOA":               0,
   302  				"empty_request_per_type_SRV":               0,
   303  				"empty_request_per_type_TXT":               0,
   304  				"empty_request_per_type_other":             0,
   305  				"empty_request_total":                      21,
   306  				"empty_response_per_rcode_BADALG":          0,
   307  				"empty_response_per_rcode_BADCOOKIE":       0,
   308  				"empty_response_per_rcode_BADKEY":          0,
   309  				"empty_response_per_rcode_BADMODE":         0,
   310  				"empty_response_per_rcode_BADNAME":         0,
   311  				"empty_response_per_rcode_BADSIG":          0,
   312  				"empty_response_per_rcode_BADTIME":         0,
   313  				"empty_response_per_rcode_BADTRUNC":        0,
   314  				"empty_response_per_rcode_FORMERR":         0,
   315  				"empty_response_per_rcode_NOERROR":         0,
   316  				"empty_response_per_rcode_NOTAUTH":         0,
   317  				"empty_response_per_rcode_NOTIMP":          0,
   318  				"empty_response_per_rcode_NOTZONE":         0,
   319  				"empty_response_per_rcode_NXDOMAIN":        0,
   320  				"empty_response_per_rcode_NXRRSET":         0,
   321  				"empty_response_per_rcode_REFUSED":         21,
   322  				"empty_response_per_rcode_SERVFAIL":        0,
   323  				"empty_response_per_rcode_YXDOMAIN":        0,
   324  				"empty_response_per_rcode_YXRRSET":         0,
   325  				"empty_response_per_rcode_other":           0,
   326  				"empty_response_total":                     21,
   327  				"no_matching_zone_dropped_total":           21,
   328  				"panic_total":                              0,
   329  				"request_per_ip_family_v4":                 61,
   330  				"request_per_ip_family_v6":                 0,
   331  				"request_per_proto_tcp":                    0,
   332  				"request_per_proto_udp":                    61,
   333  				"request_per_status_dropped":               42,
   334  				"request_per_status_processed":             19,
   335  				"request_per_type_A":                       20,
   336  				"request_per_type_AAAA":                    20,
   337  				"request_per_type_ANY":                     0,
   338  				"request_per_type_CNAME":                   0,
   339  				"request_per_type_DNSKEY":                  0,
   340  				"request_per_type_DS":                      0,
   341  				"request_per_type_IXFR":                    0,
   342  				"request_per_type_MX":                      21,
   343  				"request_per_type_NS":                      0,
   344  				"request_per_type_NSEC":                    0,
   345  				"request_per_type_NSEC3":                   0,
   346  				"request_per_type_PTR":                     0,
   347  				"request_per_type_RRSIG":                   0,
   348  				"request_per_type_SOA":                     0,
   349  				"request_per_type_SRV":                     0,
   350  				"request_per_type_TXT":                     0,
   351  				"request_per_type_other":                   0,
   352  				"request_total":                            61,
   353  				"response_per_rcode_BADALG":                0,
   354  				"response_per_rcode_BADCOOKIE":             0,
   355  				"response_per_rcode_BADKEY":                0,
   356  				"response_per_rcode_BADMODE":               0,
   357  				"response_per_rcode_BADNAME":               0,
   358  				"response_per_rcode_BADSIG":                0,
   359  				"response_per_rcode_BADTIME":               0,
   360  				"response_per_rcode_BADTRUNC":              0,
   361  				"response_per_rcode_FORMERR":               0,
   362  				"response_per_rcode_NOERROR":               19,
   363  				"response_per_rcode_NOTAUTH":               0,
   364  				"response_per_rcode_NOTIMP":                0,
   365  				"response_per_rcode_NOTZONE":               0,
   366  				"response_per_rcode_NXDOMAIN":              0,
   367  				"response_per_rcode_NXRRSET":               0,
   368  				"response_per_rcode_REFUSED":               21,
   369  				"response_per_rcode_SERVFAIL":              21,
   370  				"response_per_rcode_YXDOMAIN":              0,
   371  				"response_per_rcode_YXRRSET":               0,
   372  				"response_per_rcode_other":                 0,
   373  				"response_total":                           61,
   374  				"ya.ru._request_per_ip_family_v4":          21,
   375  				"ya.ru._request_per_ip_family_v6":          0,
   376  				"ya.ru._request_per_proto_tcp":             0,
   377  				"ya.ru._request_per_proto_udp":             21,
   378  				"ya.ru._request_per_status_dropped":        0,
   379  				"ya.ru._request_per_status_processed":      0,
   380  				"ya.ru._request_per_type_A":                7,
   381  				"ya.ru._request_per_type_AAAA":             7,
   382  				"ya.ru._request_per_type_ANY":              0,
   383  				"ya.ru._request_per_type_CNAME":            0,
   384  				"ya.ru._request_per_type_DNSKEY":           0,
   385  				"ya.ru._request_per_type_DS":               0,
   386  				"ya.ru._request_per_type_IXFR":             0,
   387  				"ya.ru._request_per_type_MX":               7,
   388  				"ya.ru._request_per_type_NS":               0,
   389  				"ya.ru._request_per_type_NSEC":             0,
   390  				"ya.ru._request_per_type_NSEC3":            0,
   391  				"ya.ru._request_per_type_PTR":              0,
   392  				"ya.ru._request_per_type_RRSIG":            0,
   393  				"ya.ru._request_per_type_SOA":              0,
   394  				"ya.ru._request_per_type_SRV":              0,
   395  				"ya.ru._request_per_type_TXT":              0,
   396  				"ya.ru._request_per_type_other":            0,
   397  				"ya.ru._request_total":                     21,
   398  				"ya.ru._response_per_rcode_BADALG":         0,
   399  				"ya.ru._response_per_rcode_BADCOOKIE":      0,
   400  				"ya.ru._response_per_rcode_BADKEY":         0,
   401  				"ya.ru._response_per_rcode_BADMODE":        0,
   402  				"ya.ru._response_per_rcode_BADNAME":        0,
   403  				"ya.ru._response_per_rcode_BADSIG":         0,
   404  				"ya.ru._response_per_rcode_BADTIME":        0,
   405  				"ya.ru._response_per_rcode_BADTRUNC":       0,
   406  				"ya.ru._response_per_rcode_FORMERR":        0,
   407  				"ya.ru._response_per_rcode_NOERROR":        0,
   408  				"ya.ru._response_per_rcode_NOTAUTH":        0,
   409  				"ya.ru._response_per_rcode_NOTIMP":         0,
   410  				"ya.ru._response_per_rcode_NOTZONE":        0,
   411  				"ya.ru._response_per_rcode_NXDOMAIN":       0,
   412  				"ya.ru._response_per_rcode_NXRRSET":        0,
   413  				"ya.ru._response_per_rcode_REFUSED":        0,
   414  				"ya.ru._response_per_rcode_SERVFAIL":       21,
   415  				"ya.ru._response_per_rcode_YXDOMAIN":       0,
   416  				"ya.ru._response_per_rcode_YXRRSET":        0,
   417  				"ya.ru._response_per_rcode_other":          0,
   418  				"ya.ru._response_total":                    21,
   419  			}
   420  
   421  			assert.Equal(t, expected, job.Collect())
   422  		})
   423  	}
   424  }
   425  
   426  func TestCoreDNS_CollectNoLoad(t *testing.T) {
   427  	tests := []struct {
   428  		name string
   429  		data []byte
   430  	}{
   431  		{"version 1.6.9", testNoLoad169},
   432  		{"version 1.7.0", testNoLoad170},
   433  	}
   434  	for _, testNoLoad := range tests {
   435  		t.Run(testNoLoad.name, func(t *testing.T) {
   436  			ts := httptest.NewServer(
   437  				http.HandlerFunc(
   438  					func(w http.ResponseWriter, r *http.Request) {
   439  						_, _ = w.Write(testNoLoad.data)
   440  					}))
   441  			defer ts.Close()
   442  
   443  			job := New()
   444  			job.URL = ts.URL + "/metrics"
   445  			job.PerServerStats.Includes = []string{"glob:*"}
   446  			job.PerZoneStats.Includes = []string{"glob:*"}
   447  			require.True(t, job.Init())
   448  			require.True(t, job.Check())
   449  
   450  			expected := map[string]int64{
   451  				"no_matching_zone_dropped_total": 0,
   452  				"panic_total":                    99,
   453  				"request_per_ip_family_v4":       0,
   454  				"request_per_ip_family_v6":       0,
   455  				"request_per_proto_tcp":          0,
   456  				"request_per_proto_udp":          0,
   457  				"request_per_status_dropped":     0,
   458  				"request_per_status_processed":   0,
   459  				"request_per_type_A":             0,
   460  				"request_per_type_AAAA":          0,
   461  				"request_per_type_ANY":           0,
   462  				"request_per_type_CNAME":         0,
   463  				"request_per_type_DNSKEY":        0,
   464  				"request_per_type_DS":            0,
   465  				"request_per_type_IXFR":          0,
   466  				"request_per_type_MX":            0,
   467  				"request_per_type_NS":            0,
   468  				"request_per_type_NSEC":          0,
   469  				"request_per_type_NSEC3":         0,
   470  				"request_per_type_PTR":           0,
   471  				"request_per_type_RRSIG":         0,
   472  				"request_per_type_SOA":           0,
   473  				"request_per_type_SRV":           0,
   474  				"request_per_type_TXT":           0,
   475  				"request_per_type_other":         0,
   476  				"request_total":                  0,
   477  				"response_per_rcode_BADALG":      0,
   478  				"response_per_rcode_BADCOOKIE":   0,
   479  				"response_per_rcode_BADKEY":      0,
   480  				"response_per_rcode_BADMODE":     0,
   481  				"response_per_rcode_BADNAME":     0,
   482  				"response_per_rcode_BADSIG":      0,
   483  				"response_per_rcode_BADTIME":     0,
   484  				"response_per_rcode_BADTRUNC":    0,
   485  				"response_per_rcode_FORMERR":     0,
   486  				"response_per_rcode_NOERROR":     0,
   487  				"response_per_rcode_NOTAUTH":     0,
   488  				"response_per_rcode_NOTIMP":      0,
   489  				"response_per_rcode_NOTZONE":     0,
   490  				"response_per_rcode_NXDOMAIN":    0,
   491  				"response_per_rcode_NXRRSET":     0,
   492  				"response_per_rcode_REFUSED":     0,
   493  				"response_per_rcode_SERVFAIL":    0,
   494  				"response_per_rcode_YXDOMAIN":    0,
   495  				"response_per_rcode_YXRRSET":     0,
   496  				"response_per_rcode_other":       0,
   497  				"response_total":                 0,
   498  			}
   499  
   500  			assert.Equal(t, expected, job.Collect())
   501  		})
   502  	}
   503  
   504  }
   505  
   506  func TestCoreDNS_InvalidData(t *testing.T) {
   507  	ts := httptest.NewServer(
   508  		http.HandlerFunc(
   509  			func(w http.ResponseWriter, r *http.Request) {
   510  				_, _ = w.Write([]byte("hello and goodbye"))
   511  			}))
   512  	defer ts.Close()
   513  
   514  	job := New()
   515  	job.URL = ts.URL + "/metrics"
   516  	require.True(t, job.Init())
   517  	assert.False(t, job.Check())
   518  }
   519  
   520  func TestCoreDNS_404(t *testing.T) {
   521  	ts := httptest.NewServer(
   522  		http.HandlerFunc(
   523  			func(w http.ResponseWriter, r *http.Request) {
   524  				w.WriteHeader(http.StatusNotFound)
   525  			}))
   526  	defer ts.Close()
   527  
   528  	job := New()
   529  	job.URL = ts.URL + "/metrics"
   530  	require.True(t, job.Init())
   531  	assert.False(t, job.Check())
   532  }
   533  
   534  func TestCoreDNS_CollectNoVersion(t *testing.T) {
   535  	ts := httptest.NewServer(
   536  		http.HandlerFunc(
   537  			func(w http.ResponseWriter, r *http.Request) {
   538  				_, _ = w.Write(testNoLoadNoVersion)
   539  			}))
   540  	defer ts.Close()
   541  
   542  	job := New()
   543  	job.URL = ts.URL + "/metrics"
   544  	job.PerServerStats.Includes = []string{"glob:*"}
   545  	job.PerZoneStats.Includes = []string{"glob:*"}
   546  	require.True(t, job.Init())
   547  	require.False(t, job.Check())
   548  
   549  	assert.Nil(t, job.Collect())
   550  }