def test_ignore(self): ignored = [ RegexConversion('^bad start'), RegexConversion('(.*)Some String'), RegexConversion('(.*)http:(.*)\/view') ] self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), ignore=ignored) logger = self.getLogger() logger.addHandler(self.handler) # paranoid check self.assertEqual(len(DummySMTP.sent), 0) # Now test a few variations logger.critical('This Line Contains Some String.') self.assertEqual(len(DummySMTP.sent), 0) logger.critical('bad starts and terrible endings') self.assertEqual(len(DummySMTP.sent), 0) logger.critical('NotFoundError: http://my.site.com/some/path/view') self.assertEqual(len(DummySMTP.sent), 0) # Interpolations are also ignored logger.critical('NotFoundError: %s', 'http://my.site.com/some/path/view') self.assertEqual(len(DummySMTP.sent), 0) # Non-matching stuff still gets through logger.critical('message1') self.assertEqual(len(DummySMTP.sent), 1)
def test_send_failure(self): handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), template='x') logger = self.getLogger() logger.addHandler(handler) with OutputCapture() as output: logger.critical(u"message") assert 'TypeError: not all arguments converted' in output.captured
def create_loghandler(self): return MailingLogger(self.section.fromaddr, self.section.toaddrs, self.mailhost(), self.section.subject, self.section.send_empty_entries, self.section.flood_level, self.section.username, self.section.password, self.section.ignore, self.headers(), self.section.template, self.section.charset, self.section.content_type)
def test_non_string_error_messages_dont_break_logging(self): self.handler = MailingLogger( '*****@*****.**', ('*****@*****.**', ), ) logger = self.getLogger() logger.addHandler(self.handler) logger.critical(object()) self.assertEqual(len(DummySMTP.sent), 1)
def test_specified_content_type(self): self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), content_type='foo/bar') logger = self.getLogger() logger.addHandler(self.handler) logger.critical(u"message") m = DummySMTP.sent[0][3] # NB: we drop the 'foo' self.failUnless('Content-Type: text/bar' in m, m)
def test_template(self): self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), template="<before>%s<after>") logger = self.getLogger() logger.addHandler(self.handler) logger.critical('message') m = DummySMTP.sent[0][3] self.failUnless('Subject: message' in m, m) self.failUnless('<before>message<after>' in m, m)
def test_template(self): self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), template="<before>%s<after>") logger = self.getLogger() logger.addHandler(self.handler) logger.critical('message') m = DummySMTP.sent[0].msg self.assertTrue('Subject: message' in m, m) _check_sent_message('<before>message<after>', m)
def test_subject_contains_date(self): # set up logger self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), subject="%(asctime)s") logger = self.getLogger() logger.addHandler(self.handler) logger.critical('message') self.assertEqual(len(DummySMTP.sent), 1) m = DummySMTP.sent[0][3] self.failUnless('Subject: 2007-01-01 10:00:00,000' in m, m)
def test_default_flood_limit(self): # set up logger self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', )) logger = self.getLogger() logger.addHandler(self.handler) # log 11 entries for i in range(12): logger.critical('message') # only 1st 10 should get sent # +1 for the final warning self.assertEqual(len(DummySMTP.sent), 11)
def test_default_charset(self): self.handler = MailingLogger( '*****@*****.**', ('*****@*****.**', ), ) logger = self.getLogger() logger.addHandler(self.handler) logger.critical(u"accentu\u00E9") m = DummySMTP.sent[0][3] # lovely, utf-8 encoded goodness self.failUnless('Subject: =?utf-8?b?YWNjZW50dcOp?=' in m, m) self.failUnless('Content-Type: text/plain; charset="utf-8"' in m, m) self.failUnless('\nYWNjZW50dcOp' in m, m)
def test_specified_charset(self): self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), charset='iso-8859-1') logger = self.getLogger() logger.addHandler(self.handler) logger.critical(u"accentu\u00E9") m = DummySMTP.sent[0][3] # lovely, latin-1 encoded goodness self.failUnless('\naccentu=E9' in m, m) self.failUnless('Content-Type: text/plain; charset="iso-8859-1"' in m, m) # no idea why MIMEText doesn't use iso-8859-1 here, best not to # argue... self.failUnless('Subject: =?utf-8?b?YWNjZW50dcOp?=' in m, m)
def test_headers_supplied_get_added_to_those_generated(self): # set up logger self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), headers={ 'From': 'someidiot', 'to': 'someidiot' }) logger = self.getLogger() logger.addHandler(self.handler) logger.critical('message') self.assertEqual(len(DummySMTP.sent), 1) m = DummySMTP.sent[0][3] # the headers specified in the `headers` parameter get added # to those generated by mailinglogger - be careful! self.failUnless('From: [email protected]' in m) self.failUnless('From: someidiot' in m) # however, if you try hard you *can* break things :-S self.failUnless('To: [email protected]' in m) self.failUnless('to: someidiot' in m)
def __init__( self, fromaddr, toaddrs, mailhost='localhost', subject='Summary of Log Messages (%(levelname)s)', send_empty_entries=True, atexit=True, username=None, password=None, ignore=(), headers=None, send_level=None, template=None, charset='utf-8', content_type='text/plain', flood_level=100, ): # create the "real" mailinglogger self.mailer = MailingLogger(fromaddr, toaddrs, mailhost, subject, send_empty_entries, username=username, password=password, headers=headers, template=template, charset=charset, content_type=content_type) # set the mailing logger's log format self.mailer.setFormatter(Formatter('%(message)s')) self.ignore = process_ignore(ignore) self.send_level = send_level self.charset = charset self.flood_level = flood_level self.open() # register our close method if atexit: register(self.close)
def test_flood_protection_bug(self): # set up logger self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ), flood_level=1) logger = self.getLogger() logger.addHandler(self.handler) # make it 11pm self.datetime.set(2007, 3, 15, 23) # paranoid check self.assertEqual(len(DummySMTP.sent), 0) # log until flood protection kicked in logger.critical('message1') logger.critical('message2') # check - 1 logged, 1 final warning self.assertEqual(len(DummySMTP.sent), 2) # check nothing emitted logger.critical('message3') self.assertEqual(len(DummySMTP.sent), 2) # advance time past midnight self.datetime.set(2007, 3, 15) # log again logger.critical('message4') # check we are emitted now! self.assertEqual(len(DummySMTP.sent), 3)