]>
git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.auth-py/test_Carbon.py
7 from queue
import Queue
9 from authtests
import AuthTest
11 class TestCarbon(AuthTest
):
12 _carbonNamespace
= 'NS'
13 _carbonInstance
= 'Instance'
14 _carbonServerName
= "carbonname1"
16 _carbonServer1Port
= 8000
17 _carbonServer2Port
= 8001
18 _carbonQueue1
= Queue()
19 _carbonQueue2
= Queue()
21 _config_template
= """
27 carbon-server=127.0.0.1:%s,127.0.01:%s
28 """ % (_carbonNamespace
, _carbonInstance
, _carbonInterval
, _carbonServerName
, _carbonServer1Port
, _carbonServer2Port
)
31 def CarbonResponder(cls
, port
):
32 sock
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
33 sock
.setsockopt(socket
.SOL_SOCKET
, socket
.SO_REUSEPORT
, 1)
35 sock
.bind(("127.0.0.1", port
))
36 except socket
.error
as e
:
37 print("Error binding in the Carbon responder: %s" % str(e
))
42 (conn
, _
) = sock
.accept()
46 data
= conn
.recv(4096)
51 if port
== cls
._carbonServer
1Port
:
52 cls
._carbonQueue
1.put(lines
, True, timeout
=2.0)
54 cls
._carbonQueue
2.put(lines
, True, timeout
=2.0)
55 if threading
.currentThread().name
in cls
._carbonCounters
:
56 cls
._carbonCounters
[threading
.currentThread().name
] += 1
58 cls
._carbonCounters
[threading
.currentThread().name
] = 1
64 def startResponders(cls
):
65 cls
._CarbonResponder
1 = threading
.Thread(name
='Carbon Responder 1', target
=cls
.CarbonResponder
, args
=[cls
._carbonServer
1Port
])
66 cls
._CarbonResponder
1.setDaemon(True)
67 cls
._CarbonResponder
1.start()
69 cls
._CarbonResponder
2 = threading
.Thread(name
='Carbon Responder 2', target
=cls
.CarbonResponder
, args
=[cls
._carbonServer
2Port
])
70 cls
._CarbonResponder
2.setDaemon(True)
71 cls
._CarbonResponder
2.start()
75 Carbon: send data to 2 carbon servers
77 # wait for the carbon data to be sent
78 time
.sleep(self
._carbonInterval
+ 1)
80 # check if the servers have received our data
81 # we will block for a short while if the data is not already there,
82 # and an exception will be raised after the timeout
84 data1
= self
._carbonQueue
1.get(block
=True, timeout
=2.0)
86 data2
= self
._carbonQueue
2.get(block
=True, timeout
=2.0)
89 self
.assertTrue(data1
)
90 self
.assertTrue(len(data1
.splitlines()) > 1)
91 expectedStart
= b
"%s.%s.%s." % (self
._carbonNamespace
.encode('UTF8'), self
._carbonServerName
.encode('UTF-8'), self
._carbonInstance
.encode('UTF8'))
92 for line
in data1
.splitlines():
93 self
.assertTrue(line
.startswith(expectedStart
))
94 parts
= line
.split(b
' ')
95 self
.assertEqual(len(parts
), 3)
96 self
.assertTrue(parts
[1].isdigit())
97 self
.assertTrue(parts
[2].isdigit())
98 self
.assertTrue(int(parts
[2]) <= int(after
))
100 self
.assertTrue(data2
)
101 self
.assertTrue(len(data2
.splitlines()) > 1)
102 expectedStart
= b
"%s.%s.%s." % (self
._carbonNamespace
.encode('UTF8'), self
._carbonServerName
.encode('UTF-8'), self
._carbonInstance
.encode('UTF8'))
103 for line
in data2
.splitlines():
104 self
.assertTrue(line
.startswith(expectedStart
))
105 parts
= line
.split(b
' ')
106 self
.assertEqual(len(parts
), 3)
107 self
.assertTrue(parts
[1].isdigit())
108 self
.assertTrue(parts
[2].isdigit())
109 self
.assertTrue(int(parts
[2]) <= int(after
))
111 # make sure every carbon server has received at least one connection
112 for key
in self
._carbonCounters
:
113 value
= self
._carbonCounters
[key
]
114 self
.assertTrue(value
>= 1)