From c00bd3c770f83b5e61bf4be7623e90aa7d840ec8 Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Wed, 27 Nov 2024 10:43:59 +0100 Subject: [PATCH] rec: cleanup dnstap regression test a bit and try to avoid LeakSanitizer internal issue The issue is that if the test ends *too* quick LeakSanatizer did not init all thread local data structures yet, and it reports this and exits with a non-zero exit code: Tracer caught signal 11: addr=0x7fc0f2bc0000 pc=0x55bc6eccaeda sp=0x7fc0f29e1d40 ==10208==LeakSanitizer has encountered a fatal error. ==10208==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1 ==10208==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc) --- .../test_RecDnstap.py | 63 +++++++------------ 1 file changed, 22 insertions(+), 41 deletions(-) diff --git a/regression-tests.recursor-dnssec/test_RecDnstap.py b/regression-tests.recursor-dnssec/test_RecDnstap.py index 6e50f9ff88..025b32c17a 100644 --- a/regression-tests.recursor-dnssec/test_RecDnstap.py +++ b/regression-tests.recursor-dnssec/test_RecDnstap.py @@ -276,6 +276,16 @@ cname 3600 IN CNAME a.example. for listerner in DNSTapListeners: listerner.close() + def getFirstDnstap(self): + try: + data = DNSTapServerParameters.queue.get(True, timeout=2.0) + except: + data = False + self.assertTrue(data) + dnstap = dnstap_pb2.Dnstap() + dnstap.ParseFromString(data) + return dnstap + class DNSTapDefaultTest(TestRecursorDNSTap): """ This test makes sure that we correctly export outgoing queries over DNSTap. @@ -290,16 +300,6 @@ auth-zones=example=configs/%s/example.zone""" % _confdir dnstapFrameStreamServer({"%s"}) """ % DNSTapServerParameters.path - def getFirstDnstap(self): - try: - data = DNSTapServerParameters.queue.get(True, timeout=2.0) - except: - data = False - self.assertTrue(data) - dnstap = dnstap_pb2.Dnstap() - dnstap.ParseFromString(data) - return dnstap - def testA(self): name = 'www.example.org.' query = dns.message.make_query(name, 'A', want_dnssec=True) @@ -313,6 +313,8 @@ dnstapFrameStreamServer({"%s"}) checkDnstapQuery(self, dnstap, dnstap_pb2.UDP, '127.0.0.1', '127.0.0.8') # We don't expect a response checkDnstapNoExtra(self, dnstap) + # We don't expect anything more, but we'll sleep anyway to avoid a LeakSanitizer race + time.sleep(1) class DNSTapLogNoQueriesTest(TestRecursorDNSTap): @@ -330,7 +332,7 @@ dnstapFrameStreamServer({"%s"}, {logQueries=false}) res = self.sendUDPQuery(query) self.assertNotEqual(res, None) - # We don't expect anything + # We don't expect anything more time.sleep(1) self.assertTrue(DNSTapServerParameters.queue.empty()) @@ -359,16 +361,6 @@ dnstapNODFrameStreamServer({"%s"}) cls.createConfigDir(path) super(DNSTapLogNODTest, cls).generateRecursorConfig(confdir) - def getFirstDnstap(self): - try: - data = DNSTapServerParameters.queue.get(True, timeout=2.0) - except: - data = False - self.assertTrue(data) - dnstap = dnstap_pb2.Dnstap() - dnstap.ParseFromString(data) - return dnstap - def testA(self): name = 'types.example.' query = dns.message.make_query(name, 'A', want_dnssec=True) @@ -382,6 +374,9 @@ dnstapNODFrameStreamServer({"%s"}) checkDnstapNOD(self, dnstap, dnstap_pb2.UDP, '127.0.0.1', '127.0.0.1', 5300, name) # We don't expect a response checkDnstapNoExtra(self, dnstap) + # We don't expect anything more + time.sleep(1) + self.assertTrue(DNSTapServerParameters.queue.empty()) class DNSTapLogUDRTest(TestRecursorDNSTap): @@ -403,16 +398,6 @@ dnstapNODFrameStreamServer({"%s"}, {logNODs=false, logUDRs=true}) cls.createConfigDir(path) super(DNSTapLogUDRTest, cls).generateRecursorConfig(confdir) - def getFirstDnstap(self): - try: - data = DNSTapServerParameters.queue.get(True, timeout=2.0) - except: - data = False - self.assertTrue(data) - dnstap = dnstap_pb2.Dnstap() - dnstap.ParseFromString(data) - return dnstap - def testA(self): name = 'types.example.' query = dns.message.make_query(name, 'A', want_dnssec=True) @@ -426,6 +411,9 @@ dnstapNODFrameStreamServer({"%s"}, {logNODs=false, logUDRs=true}) checkDnstapUDR(self, dnstap, dnstap_pb2.UDP, '127.0.0.1', '127.0.0.1', 5300, name) # We don't expect a rpasesponse checkDnstapNoExtra(self, dnstap) + # We don't expect anything more + time.sleep(1) + self.assertTrue(DNSTapServerParameters.queue.empty()) class DNSTapLogNODUDRTest(TestRecursorDNSTap): @@ -447,16 +435,6 @@ dnstapNODFrameStreamServer({"%s"}, {logNODs=true, logUDRs=true}) cls.createConfigDir(path) super(DNSTapLogNODUDRTest, cls).generateRecursorConfig(confdir) - def getFirstDnstap(self): - try: - data = DNSTapServerParameters.queue.get(True, timeout=2.0) - except: - data = False - self.assertTrue(data) - dnstap = dnstap_pb2.Dnstap() - dnstap.ParseFromString(data) - return dnstap - def testA(self): name = 'types.example.' query = dns.message.make_query(name, 'A', want_dnssec=True) @@ -471,3 +449,6 @@ dnstapNODFrameStreamServer({"%s"}, {logNODs=true, logUDRs=true}) checkDnstapNOD(self, dnstap, dnstap_pb2.UDP, '127.0.0.1', '127.0.0.1', 5300, name) checkDnstapNoExtra(self, dnstap) + # We don't expect anything more + time.sleep(1) + self.assertTrue(DNSTapServerParameters.queue.empty()) -- 2.47.2