]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/test-dnsdistpacketcache_cc.cc
1 #define BOOST_TEST_DYN_LINK
2 #define BOOST_TEST_NO_MAIN
4 #include <boost/test/unit_test.hpp>
8 #include "dnswriter.hh"
9 #include "dnsdist-cache.hh"
11 BOOST_AUTO_TEST_SUITE(dnsdistpacketcache_cc
)
13 BOOST_AUTO_TEST_CASE(test_PacketCacheSimple
) {
14 const size_t maxEntries
= 150000;
15 DNSDistPacketCache
PC(maxEntries
, 86400, 1);
16 BOOST_CHECK_EQUAL(PC
.getSize(), 0);
22 for(counter
= 0; counter
< 100000; ++counter
) {
23 DNSName a
=DNSName(std::to_string(counter
))+DNSName(" hello");
24 BOOST_CHECK_EQUAL(DNSName(a
.toString()), a
);
26 vector
<uint8_t> query
;
27 DNSPacketWriter
pwQ(query
, a
, QType::A
, QClass::IN
, 0);
28 pwQ
.getHeader()->rd
= 1;
30 vector
<uint8_t> response
;
31 DNSPacketWriter
pwR(response
, a
, QType::A
, QClass::IN
, 0);
32 pwR
.getHeader()->rd
= 1;
33 pwR
.getHeader()->ra
= 1;
34 pwR
.getHeader()->qr
= 1;
35 pwR
.getHeader()->id
= pwQ
.getHeader()->id
;
36 pwR
.startRecord(a
, QType::A
, 100, QClass::IN
, DNSResourceRecord::ANSWER
);
37 pwR
.xfr32BitInt(0x01020304);
39 uint16_t responseLen
= response
.size();
41 char responseBuf
[4096];
42 uint16_t responseBufSize
= sizeof(responseBuf
);
44 DNSQuestion
dq(&a
, QType::A
, QClass::IN
, &remote
, &remote
, (struct dnsheader
*) query
.data(), query
.size(), query
.size(), false);
45 bool found
= PC
.get(dq
, a
.wirelength(), 0, responseBuf
, &responseBufSize
, &key
);
46 BOOST_CHECK_EQUAL(found
, false);
48 PC
.insert(key
, a
, QType::A
, QClass::IN
, (const char*) response
.data(), responseLen
, false, 0);
50 found
= PC
.get(dq
, a
.wirelength(), pwR
.getHeader()->id
, responseBuf
, &responseBufSize
, &key
, 0, true);
52 BOOST_CHECK_EQUAL(responseBufSize
, responseLen
);
53 int match
= memcmp(responseBuf
, response
.data(), responseLen
);
54 BOOST_CHECK_EQUAL(match
, 0);
61 BOOST_CHECK_EQUAL(skipped
, PC
.getInsertCollisions());
62 BOOST_CHECK_EQUAL(PC
.getSize(), counter
- skipped
);
66 for(delcounter
=0; delcounter
< counter
/1000; ++delcounter
) {
67 DNSName a
=DNSName(std::to_string(delcounter
))+DNSName(" hello");
68 vector
<uint8_t> query
;
69 DNSPacketWriter
pwQ(query
, a
, QType::A
, QClass::IN
, 0);
70 pwQ
.getHeader()->rd
= 1;
71 char responseBuf
[4096];
72 uint16_t responseBufSize
= sizeof(responseBuf
);
74 DNSQuestion
dq(&a
, QType::A
, QClass::IN
, &remote
, &remote
, (struct dnsheader
*) query
.data(), query
.size(), query
.size(), false);
75 bool found
= PC
.get(dq
, a
.wirelength(), 0, responseBuf
, &responseBufSize
, &key
);
81 BOOST_CHECK_EQUAL(PC
.getSize(), counter
- skipped
- deleted
);
85 vector
<DNSResourceRecord
> entry
;
86 size_t expected
=counter
-skipped
-deleted
;
87 for(; delcounter
< counter
; ++delcounter
) {
88 DNSName
a(DNSName(std::to_string(delcounter
))+DNSName(" hello"));
89 vector
<uint8_t> query
;
90 DNSPacketWriter
pwQ(query
, a
, QType::A
, QClass::IN
, 0);
91 pwQ
.getHeader()->rd
= 1;
92 uint16_t len
= query
.size();
95 uint16_t responseSize
= sizeof(response
);
96 DNSQuestion
dq(&a
, QType::A
, QClass::IN
, &remote
, &remote
, (struct dnsheader
*) query
.data(), len
, query
.size(), false);
97 if(PC
.get(dq
, a
.wirelength(), pwQ
.getHeader()->id
, response
, &responseSize
, &key
)) {
101 BOOST_CHECK_EQUAL(matches
, expected
);
103 PC
.expungeByName(DNSName(" hello"), QType::ANY
, true);
104 BOOST_CHECK_EQUAL(PC
.getSize(), 0);
106 catch(PDNSException
& e
) {
107 cerr
<<"Had error: "<<e
.reason
<<endl
;
112 static DNSDistPacketCache
PC(500000);
114 static void *threadMangler(void* off
)
118 unsigned int offset
=(unsigned int)(unsigned long)off
;
119 for(unsigned int counter
=0; counter
< 100000; ++counter
) {
120 DNSName a
=DNSName("hello ")+DNSName(std::to_string(counter
+offset
));
121 vector
<uint8_t> query
;
122 DNSPacketWriter
pwQ(query
, a
, QType::A
, QClass::IN
, 0);
123 pwQ
.getHeader()->rd
= 1;
125 vector
<uint8_t> response
;
126 DNSPacketWriter
pwR(response
, a
, QType::A
, QClass::IN
, 0);
127 pwR
.getHeader()->rd
= 1;
128 pwR
.getHeader()->ra
= 1;
129 pwR
.getHeader()->qr
= 1;
130 pwR
.getHeader()->id
= pwQ
.getHeader()->id
;
131 pwR
.startRecord(a
, QType::A
, 3600, QClass::IN
, DNSResourceRecord::ANSWER
);
132 pwR
.xfr32BitInt(0x01020304);
134 uint16_t responseLen
= response
.size();
136 char responseBuf
[4096];
137 uint16_t responseBufSize
= sizeof(responseBuf
);
139 DNSQuestion
dq(&a
, QType::A
, QClass::IN
, &remote
, &remote
, (struct dnsheader
*) query
.data(), query
.size(), query
.size(), false);
140 PC
.get(dq
, a
.wirelength(), 0, responseBuf
, &responseBufSize
, &key
);
142 PC
.insert(key
, a
, QType::A
, QClass::IN
, (const char*) response
.data(), responseLen
, false, 0);
145 catch(PDNSException
& e
) {
146 cerr
<<"Had error: "<<e
.reason
<<endl
;
152 AtomicCounter g_missing
;
154 static void *threadReader(void* off
)
158 unsigned int offset
=(unsigned int)(unsigned long)off
;
159 vector
<DNSResourceRecord
> entry
;
161 for(unsigned int counter
=0; counter
< 100000; ++counter
) {
162 DNSName a
=DNSName("hello ")+DNSName(std::to_string(counter
+offset
));
163 vector
<uint8_t> query
;
164 DNSPacketWriter
pwQ(query
, a
, QType::A
, QClass::IN
, 0);
165 pwQ
.getHeader()->rd
= 1;
167 char responseBuf
[4096];
168 uint16_t responseBufSize
= sizeof(responseBuf
);
170 DNSQuestion
dq(&a
, QType::A
, QClass::IN
, &remote
, &remote
, (struct dnsheader
*) query
.data(), query
.size(), query
.size(), false);
171 bool found
= PC
.get(dq
, a
.wirelength(), 0, responseBuf
, &responseBufSize
, &key
);
177 catch(PDNSException
& e
) {
178 cerr
<<"Had error in threadReader: "<<e
.reason
<<endl
;
184 BOOST_AUTO_TEST_CASE(test_PacketCacheThreaded
) {
187 for(int i
=0; i
< 4; ++i
)
188 pthread_create(&tid
[i
], 0, threadMangler
, (void*)(i
*1000000UL));
190 for(int i
=0; i
< 4 ; ++i
)
191 pthread_join(tid
[i
], &res
);
193 BOOST_CHECK_EQUAL(PC
.getSize() + PC
.getDeferredInserts() + PC
.getInsertCollisions(), 400000);
194 BOOST_CHECK_SMALL(1.0*PC
.getInsertCollisions(), 10000.0);
196 for(int i
=0; i
< 4; ++i
)
197 pthread_create(&tid
[i
], 0, threadReader
, (void*)(i
*1000000UL));
198 for(int i
=0; i
< 4 ; ++i
)
199 pthread_join(tid
[i
], &res
);
201 BOOST_CHECK((PC
.getDeferredInserts() + PC
.getDeferredLookups() + PC
.getInsertCollisions()) >= g_missing
);
203 catch(PDNSException
& e
) {
204 cerr
<<"Had error: "<<e
.reason
<<endl
;
210 BOOST_AUTO_TEST_SUITE_END()