github.com/netdata/go.d.plugin@v0.58.1/modules/bind/bind_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package bind 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 jsonServerData, _ = os.ReadFile("testdata/query-server.json") 17 xmlServerData, _ = os.ReadFile("testdata/query-server.xml") 18 ) 19 20 func TestNew(t *testing.T) { 21 job := New() 22 assert.IsType(t, (*Bind)(nil), job) 23 assert.NotNil(t, job.charts) 24 assert.Equal(t, defaultURL, job.URL) 25 assert.Equal(t, defaultHTTPTimeout, job.Timeout.Duration) 26 } 27 28 func TestBind_Cleanup(t *testing.T) { New().Cleanup() } 29 30 func TestBind_Init(t *testing.T) { 31 // OK 32 job := New() 33 assert.True(t, job.Init()) 34 assert.NotNil(t, job.bindAPIClient) 35 36 //NG 37 job = New() 38 job.URL = "" 39 assert.False(t, job.Init()) 40 job.URL = defaultURL[:len(defaultURL)-1] 41 assert.False(t, job.Init()) 42 } 43 44 func TestBind_Check(t *testing.T) { 45 ts := httptest.NewServer( 46 http.HandlerFunc( 47 func(w http.ResponseWriter, r *http.Request) { 48 if r.URL.Path == "/json/v1/server" { 49 _, _ = w.Write(jsonServerData) 50 } 51 })) 52 defer ts.Close() 53 54 job := New() 55 job.URL = ts.URL + "/json/v1" 56 57 require.True(t, job.Init()) 58 require.True(t, job.Check()) 59 } 60 61 func TestBind_CheckNG(t *testing.T) { 62 job := New() 63 64 job.URL = "http://127.0.0.1:38001/xml/v3" 65 require.True(t, job.Init()) 66 assert.False(t, job.Check()) 67 } 68 69 func TestBind_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) } 70 71 func TestBind_CollectJSON(t *testing.T) { 72 ts := httptest.NewServer( 73 http.HandlerFunc( 74 func(w http.ResponseWriter, r *http.Request) { 75 if r.URL.Path == "/json/v1/server" { 76 _, _ = w.Write(jsonServerData) 77 } 78 })) 79 defer ts.Close() 80 81 job := New() 82 job.URL = ts.URL + "/json/v1" 83 job.PermitView = "*" 84 85 require.True(t, job.Init()) 86 require.True(t, job.Check()) 87 88 expected := map[string]int64{ 89 "_default_Queryv4": 4503685324, 90 "_default_NSEC": 53193, 91 "_default_NSEC3PARAM": 993, 92 "_default_ANY": 5149356, 93 "QryFORMERR": 8, 94 "CookieMatch": 125065, 95 "A6": 538255, 96 "MAILA": 44, 97 "ExpireOpt": 195, 98 "CNAME": 534171, 99 "TYPE115": 285, 100 "_default_RESERVED0": 19, 101 "_default_ClientCookieOut": 3790767469, 102 "_default_CookieClientOk": 297765763, 103 "QryFailure": 225786697, 104 "TYPE127": 1, 105 "_default_GlueFetchv4": 110619519, 106 "_default_Queryv6": 291939086, 107 "UPDATE": 18836, 108 "RESERVED0": 13705, 109 "_default_CacheHits": 405229520524, 110 "Requestv6": 155, 111 "QryTCP": 4226324, 112 "RESERVED15": 0, 113 "QUERY": 36766967932, 114 "EUI64": 627, 115 "_default_NXDOMAIN": 1245990908, 116 "_default_REFUSED": 106664780, 117 "_default_EUI64": 2087, 118 "QrySERVFAIL": 219515158, 119 "QryRecursion": 3666523564, 120 "MX": 1483690, 121 "DNSKEY": 143483, 122 "_default_TYPE115": 112, 123 "_default_Others": 813, 124 "_default_CacheMisses": 127371, 125 "RateDropped": 219, 126 "NAPTR": 109959, 127 "NSEC": 81, 128 "AAAA": 3304112238, 129 "_default_QryRTT500": 2071767970, 130 "_default_TYPE127": 2, 131 "_default_A6": 556692, 132 "QryAuthAns": 440508475, 133 "RecursClients": 74, 134 "XfrRej": 97, 135 "LOC": 52, 136 "CookieIn": 1217208, 137 "RRSIG": 25192, 138 "_default_LOC": 21, 139 "ReqBadEDNSVer": 450, 140 "MG": 4, 141 "_default_GlueFetchv6": 121100044, 142 "_default_HINFO": 1, 143 "IQUERY": 199, 144 "_default_BadCookieRcode": 14779, 145 "AuthQryRej": 148023, 146 "QrySuccess": 28766465065, 147 "SRV": 27637747, 148 "TYPE223": 2, 149 "CookieNew": 1058677, 150 "_default_QryRTT10": 628295, 151 "_default_ServerCookieOut": 364811250, 152 "RESERVED11": 3, 153 "_default_CookieIn": 298084581, 154 "_default_DS": 973892, 155 "_bind_CacheHits": 0, 156 "STATUS": 35546, 157 "TLSA": 297, 158 "_default_SERVFAIL": 6523360, 159 "_default_GlueFetchv4Fail": 3949012, 160 "_default_NULL": 3548, 161 "UpdateRej": 15661, 162 "RESERVED10": 5, 163 "_default_EDNS0Fail": 3982564, 164 "_default_DLV": 20418, 165 "ANY": 298451299, 166 "_default_GlueFetchv6Fail": 91728801, 167 "_default_RP": 134, 168 "_default_AAAA": 817525939, 169 "X25": 2, 170 "NS": 5537956, 171 "_default_NumFetch": 100, 172 "_default_DNSKEY": 182224, 173 "QryUDP": 36455909449, 174 "QryReferral": 1152155, 175 "QryNXDOMAIN": 5902446156, 176 "TruncatedResp": 25882799, 177 "DNAME": 1, 178 "DLV": 37676, 179 "_default_FORMERR": 3827518, 180 "_default_RRSIG": 191628, 181 "RecQryRej": 225638588, 182 "QryDropped": 52141050, 183 "Response": 36426730232, 184 "RESERVED14": 0, 185 "_default_SPF": 16521, 186 "_default_DNAME": 6, 187 "Requestv4": 36767496594, 188 "CookieNoMatch": 33466, 189 "RESERVED9": 0, 190 "_default_QryRTT800": 2709649, 191 "_default_QryRTT1600": 455315, 192 "_default_OtherError": 1426431, 193 "_default_MX": 1575795, 194 "QryNoauthAns": 35538538399, 195 "NSIDOpt": 81, 196 "ReqTCP": 4234792, 197 "SOA": 3860272, 198 "RESERVED8": 0, 199 "RESERVED13": 8, 200 "MAILB": 42, 201 "AXFR": 105, 202 "QryNxrrset": 1308983498, 203 "SPF": 2872, 204 "PTR": 693769261, 205 "_default_Responsev4": 4169576370, 206 "_default_QryRTT100": 2086168894, 207 "_default_Retry": 783763680, 208 "_default_SRV": 3848459, 209 "QryDuplicate": 288617636, 210 "ECSOpt": 8742938, 211 "A": 32327037206, 212 "DS": 1687895, 213 "RESERVED12": 1, 214 "_default_QryRTT1600+": 27639, 215 "_default_TXT": 43595113, 216 "_default_CDS": 251, 217 "RESERVED6": 7401, 218 "RESERVED3": 2, 219 "_default_Truncated": 14015078, 220 "_default_NextItem": 1788902, 221 "_default_Responsev6": 151, 222 "_default_QueryTimeout": 335575100, 223 "_default_A": 3673673090, 224 "ReqEdns0": 532104182, 225 "OtherOpt": 3425542, 226 "NULL": 3604, 227 "HINFO": 9, 228 "_default_SOA": 1326766, 229 "_default_NAPTR": 30685, 230 "_default_PTR": 208067284, 231 "_default_CNAME": 38153754, 232 "RespEDNS0": 527991455, 233 "RESERVED7": 0, 234 "TXT": 100045556, 235 "_default_Lame": 1975334, 236 "_bind_CacheMisses": 509, 237 "IXFR": 33, 238 "_default_NS": 675609, 239 "_default_AFSDB": 5, 240 "NOTIFY": 390443, 241 "Others": 74006, 242 } 243 244 assert.Equal(t, expected, job.Collect()) 245 assert.Len(t, *job.charts, 17) 246 } 247 248 func TestBind_CollectXML3(t *testing.T) { 249 ts := httptest.NewServer( 250 http.HandlerFunc( 251 func(w http.ResponseWriter, r *http.Request) { 252 if r.URL.Path == "/xml/v3/server" { 253 _, _ = w.Write(xmlServerData) 254 } 255 })) 256 defer ts.Close() 257 258 job := New() 259 job.PermitView = "*" 260 job.URL = ts.URL + "/xml/v3" 261 262 require.True(t, job.Init()) 263 require.True(t, job.Check()) 264 265 expected := map[string]int64{ 266 "_bind_CookieClientOk": 0, 267 "_bind_ValNegOk": 0, 268 "_bind_GlueFetchv4Fail": 0, 269 "_bind_ValFail": 0, 270 "RateSlipped": 0, 271 "_default_ValFail": 0, 272 "_default_TYPE127": 2, 273 "TLSA": 299, 274 "_default_FORMERR": 3831796, 275 "_default_ValNegOk": 0, 276 "_default_RRSIG": 191877, 277 "_default_CacheHits": 405816752908, 278 "CookieBadTime": 0, 279 "RESERVED14": 0, 280 "_default_SPF": 16563, 281 "RESERVED3": 2, 282 "NS": 5545011, 283 "QrySERVFAIL": 219790234, 284 "UPDATE": 18839, 285 "_default_NAPTR": 30706, 286 "RESERVED13": 8, 287 "_default_CookieIn": 298556974, 288 "_bind_Retry": 0, 289 "_default_SOA": 1327966, 290 "_bind_Truncated": 0, 291 "RESERVED6": 7401, 292 "_default_CookieClientOk": 298237641, 293 "_default_QueryTimeout": 336165169, 294 "SPF": 2887, 295 "_default_DNAME": 6, 296 "_bind_Lame": 0, 297 "QryUDP": 36511992002, 298 "NOTIFY": 390521, 299 "DNAME": 1, 300 "DS": 1688561, 301 "_default_OtherError": 1464741, 302 "_default_Retry": 784916992, 303 "_default_TXT": 43650696, 304 "QryBADCOOKIE": 0, 305 "RespEDNS0": 528451140, 306 "TXT": 100195931, 307 "OtherOpt": 3431439, 308 "_default_HINFO": 1, 309 "RESERVED0": 13705, 310 "_bind_CacheHits": 0, 311 "ReqTCP": 4241537, 312 "RespTSIG": 0, 313 "RESERVED11": 3, 314 "_default_QryRTT100": 2087797539, 315 "_default_REFUSED": 106782830, 316 "_bind_SERVFAIL": 0, 317 "X25": 2, 318 "_default_RP": 134, 319 "QryDuplicate": 289518897, 320 "CookieNoMatch": 34013, 321 "_default_BadCookieRcode": 15399, 322 "_default_CacheMisses": 127371, 323 "_bind_Mismatch": 0, 324 "_default_ServerCookieOut": 365308714, 325 "_bind_QryRTT500": 0, 326 "RPZRewrites": 0, 327 "A": 32377004350, 328 "_default_NextItem": 1790135, 329 "_default_MX": 1576150, 330 "_bind_REFUSED": 0, 331 "_bind_ZoneQuota": 0, 332 "_default_ServerQuota": 0, 333 "_default_ANY": 5149916, 334 "_default_EUI64": 2087, 335 "_default_QueryCurUDP": 0, 336 "RESERVED7": 0, 337 "IXFR": 33, 338 "_default_Queryv4": 4509791268, 339 "_default_GlueFetchv4": 110749701, 340 "_default_TYPE115": 112, 341 "_bind_QueryAbort": 0, 342 "UpdateReqFwd": 0, 343 "_default_NSEC3PARAM": 995, 344 "_bind_NextItem": 0, 345 "RecursClients": 64, 346 "QryReferral": 1152178, 347 "QryFORMERR": 8, 348 "CookieIn": 1220424, 349 "NSIDOpt": 81, 350 "MAILA": 44, 351 "TYPE223": 2, 352 "RRSIG": 25193, 353 "UpdateBadPrereq": 0, 354 "UpdateRej": 15661, 355 "QryAuthAns": 440885288, 356 "_default_PTR": 208337408, 357 "_default_Others": 813, 358 "_default_NS": 676773, 359 "_bind_GlueFetchv4": 0, 360 "QryNoauthAns": 35593104164, 361 "QryRecursion": 3671792792, 362 "_default_ClientCookieOut": 3795901994, 363 "_bind_BadEDNSVersion": 0, 364 "ReqEdns0": 532586114, 365 "RateDropped": 230, 366 "_default_ValOk": 0, 367 "CNAME": 535141, 368 "AuthQryRej": 148159, 369 "RESERVED10": 5, 370 "_default_QueryCurTCP": 0, 371 "_bind_Queryv4": 0, 372 "_bind_CacheMisses": 509, 373 "ExpireOpt": 195, 374 "XfrRej": 97, 375 "_default_DNSKEY": 182399, 376 "RecQryRej": 225832466, 377 "NSEC": 81, 378 "_default_Responsev4": 4175093103, 379 "_bind_ValOk": 0, 380 "_bind_QueryCurTCP": 0, 381 "Requestv4": 36823884979, 382 "DNSKEY": 143600, 383 "_default_LOC": 21, 384 "UpdateRespFwd": 0, 385 "AXFR": 105, 386 "_bind_CookieIn": 0, 387 "_default_QryRTT1600": 455849, 388 "_bind_BadCookieRcode": 0, 389 "QryNXDOMAIN": 5911582433, 390 "ReqSIG0": 0, 391 "QUERY": 36823356081, 392 "NULL": 3606, 393 "_default_Lame": 1979599, 394 "_default_DS": 974240, 395 "SRV": 27709732, 396 "_bind_QuerySockFail": 0, 397 "MG": 4, 398 "_default_QryRTT800": 2712733, 399 "_bind_QryRTT1600+": 0, 400 "DNS64": 0, 401 "_default_Truncated": 14028716, 402 "_default_QryRTT10": 629577, 403 "_default_SERVFAIL": 6533579, 404 "_default_AFSDB": 5, 405 "STATUS": 35585, 406 "Response": 36482142477, 407 "KeyTagOpt": 0, 408 "_default_Mismatch": 0, 409 "Requestv6": 156, 410 "LOC": 52, 411 "_bind_NXDOMAIN": 0, 412 "PTR": 694347710, 413 "_default_NSEC": 53712, 414 "_bind_QryRTT100": 0, 415 "RESERVED8": 0, 416 "DLV": 37712, 417 "HINFO": 9, 418 "_default_AAAA": 818803359, 419 "QryNXRedirRLookup": 0, 420 "TYPE127": 1, 421 "_default_EDNS0Fail": 3987571, 422 "_default_CDS": 251, 423 "_bind_ServerCookieOut": 0, 424 "_bind_QueryCurUDP": 0, 425 "_bind_GlueFetchv6Fail": 0, 426 "UpdateFail": 0, 427 "_default_ZoneQuota": 0, 428 "_default_QuerySockFail": 0, 429 "_default_GlueFetchv6Fail": 91852240, 430 "RespSIG0": 0, 431 "_default_GlueFetchv4Fail": 3964627, 432 "_bind_Responsev6": 0, 433 "_default_GlueFetchv6": 121268854, 434 "_default_Queryv6": 292282376, 435 "TruncatedResp": 25899017, 436 "ReqTSIG": 0, 437 "_default_BadEDNSVersion": 0, 438 "_bind_NumFetch": 0, 439 "RESERVED12": 1, 440 "_default_Responsev6": 152, 441 "_default_SRV": 3855156, 442 "ANY": 298567781, 443 "_default_CNAME": 38213966, 444 "_bind_ClientCookieOut": 0, 445 "NAPTR": 109998, 446 "_default_QryRTT500": 2075608518, 447 "_default_A6": 558874, 448 "_bind_OtherError": 0, 449 "CookieMatch": 125340, 450 "_default_QryRTT1600+": 27681, 451 "_default_DLV": 20468, 452 "_default_NULL": 3554, 453 "_bind_Queryv6": 0, 454 "_bind_QueryTimeout": 0, 455 "_bind_ValAttempt": 0, 456 "RESERVED9": 0, 457 "A6": 539773, 458 "MX": 1484497, 459 "QrySuccess": 28810069822, 460 "XfrReqDone": 0, 461 "RESERVED15": 0, 462 "MAILB": 42, 463 "Others": 74007, 464 "_bind_ServerQuota": 0, 465 "_bind_EDNS0Fail": 0, 466 "QryNxrrset": 1311185019, 467 "QryFailure": 225980711, 468 "ReqBadSIG": 0, 469 "UpdateFwdFail": 0, 470 "ECSOpt": 8743959, 471 "QryDropped": 52215943, 472 "EUI64": 627, 473 "_default_ValAttempt": 0, 474 "_default_A": 3678445415, 475 "_bind_QryRTT800": 0, 476 "_default_NXDOMAIN": 1247746765, 477 "_default_RESERVED0": 19, 478 "_default_NumFetch": 62, 479 "_bind_Responsev4": 0, 480 "_bind_QryRTT1600": 0, 481 "CookieNew": 1061071, 482 "ReqBadEDNSVer": 450, 483 "TYPE115": 285, 484 "_bind_FORMERR": 0, 485 "SOA": 3863889, 486 "_bind_QryRTT10": 0, 487 "CookieBadSize": 0, 488 "_bind_GlueFetchv6": 0, 489 "QryNXRedir": 0, 490 "AAAA": 3309600766, 491 "_default_QueryAbort": 0, 492 "QryTCP": 4233061, 493 "UpdateDone": 0, 494 "IQUERY": 199, 495 } 496 497 assert.Equal(t, expected, job.Collect()) 498 assert.Len(t, *job.charts, 20) 499 } 500 501 func TestBind_InvalidData(t *testing.T) { 502 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("hello and goodbye")) })) 503 defer ts.Close() 504 505 job := New() 506 job.URL = ts.URL + "/json/v1" 507 require.True(t, job.Init()) 508 assert.False(t, job.Check()) 509 } 510 511 func TestBind_404(t *testing.T) { 512 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(404) })) 513 defer ts.Close() 514 515 job := New() 516 job.URL = ts.URL + "/json/v1" 517 require.True(t, job.Init()) 518 assert.False(t, job.Check()) 519 }