2014-07-15 20:51:12 +08:00
|
|
|
from io import BytesIO
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
from twisted.python import log as txlog, failure
|
|
|
|
from twisted.trial import unittest
|
2009-10-31 14:36:38 -02:00
|
|
|
|
|
|
|
from scrapy import log
|
2013-12-28 00:47:32 +06:00
|
|
|
from scrapy.spider import Spider
|
2012-09-11 16:34:58 -03:00
|
|
|
from scrapy.settings import default_settings
|
2014-08-05 21:01:57 -03:00
|
|
|
from scrapy.utils.test import get_crawler
|
2009-10-31 14:36:38 -02:00
|
|
|
|
2010-08-02 08:49:14 -03:00
|
|
|
class LogTest(unittest.TestCase):
|
2009-10-31 14:36:38 -02:00
|
|
|
|
|
|
|
def test_get_log_level(self):
|
2012-09-11 16:34:58 -03:00
|
|
|
default_log_level = getattr(log, default_settings.LOG_LEVEL)
|
2009-10-31 14:36:38 -02:00
|
|
|
self.assertEqual(log._get_log_level('WARNING'), log.WARNING)
|
|
|
|
self.assertEqual(log._get_log_level(log.WARNING), log.WARNING)
|
|
|
|
self.assertRaises(ValueError, log._get_log_level, object())
|
|
|
|
|
2010-08-02 08:49:14 -03:00
|
|
|
class ScrapyFileLogObserverTest(unittest.TestCase):
|
|
|
|
|
|
|
|
level = log.INFO
|
|
|
|
encoding = 'utf-8'
|
|
|
|
|
|
|
|
def setUp(self):
|
2014-07-15 20:51:12 +08:00
|
|
|
self.f = BytesIO()
|
2014-07-02 18:16:26 +06:00
|
|
|
self.log_observer = log.ScrapyFileLogObserver(self.f, self.level, self.encoding)
|
|
|
|
self.log_observer.start()
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
self.flushLoggedErrors()
|
2014-07-02 18:16:26 +06:00
|
|
|
self.log_observer.stop()
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def logged(self):
|
|
|
|
return self.f.getvalue().strip()[25:]
|
|
|
|
|
|
|
|
def first_log_line(self):
|
|
|
|
logged = self.logged()
|
|
|
|
return logged.splitlines()[0] if logged else ''
|
|
|
|
|
|
|
|
def test_msg_basic(self):
|
|
|
|
log.msg("Hello")
|
2010-08-05 20:46:54 -03:00
|
|
|
self.assertEqual(self.logged(), "[scrapy] INFO: Hello")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
2014-08-05 21:01:57 -03:00
|
|
|
def test_msg_ignore_spider(self):
|
2013-12-28 00:47:32 +06:00
|
|
|
spider = Spider("myspider")
|
2010-08-02 08:49:14 -03:00
|
|
|
log.msg("Hello", spider=spider)
|
2014-08-05 21:01:57 -03:00
|
|
|
self.failIf(self.logged())
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_msg_level1(self):
|
|
|
|
log.msg("Hello", level=log.WARNING)
|
2010-08-05 20:46:54 -03:00
|
|
|
self.assertEqual(self.logged(), "[scrapy] WARNING: Hello")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_msg_level2(self):
|
|
|
|
log.msg("Hello", log.WARNING)
|
2010-08-05 20:46:54 -03:00
|
|
|
self.assertEqual(self.logged(), "[scrapy] WARNING: Hello")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_msg_wrong_level(self):
|
|
|
|
log.msg("Hello", level=9999)
|
2010-08-05 20:46:54 -03:00
|
|
|
self.assertEqual(self.logged(), "[scrapy] NOLEVEL: Hello")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_msg_encoding(self):
|
|
|
|
log.msg(u"Price: \xa3100")
|
2010-08-05 20:46:54 -03:00
|
|
|
self.assertEqual(self.logged(), "[scrapy] INFO: Price: \xc2\xa3100")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_msg_ignore_level(self):
|
|
|
|
log.msg("Hello", level=log.DEBUG)
|
|
|
|
log.msg("World", level=log.INFO)
|
2010-08-05 20:46:54 -03:00
|
|
|
self.assertEqual(self.logged(), "[scrapy] INFO: World")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_msg_ignore_system(self):
|
|
|
|
txlog.msg("Hello")
|
|
|
|
self.failIf(self.logged())
|
|
|
|
|
|
|
|
def test_msg_ignore_system_err(self):
|
|
|
|
txlog.msg("Hello")
|
|
|
|
self.failIf(self.logged())
|
|
|
|
|
|
|
|
def test_err_noargs(self):
|
|
|
|
try:
|
|
|
|
a = 1/0
|
|
|
|
except:
|
|
|
|
log.err()
|
2014-08-01 23:44:23 +06:00
|
|
|
self.assertIn('Traceback', self.logged())
|
|
|
|
self.assertIn('ZeroDivisionError', self.logged())
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_err_why(self):
|
|
|
|
log.err(TypeError("bad type"), "Wrong type")
|
2010-08-05 20:46:54 -03:00
|
|
|
self.assertEqual(self.first_log_line(), "[scrapy] ERROR: Wrong type")
|
2014-08-01 23:44:23 +06:00
|
|
|
self.assertIn('TypeError', self.logged())
|
|
|
|
self.assertIn('bad type', self.logged())
|
2010-08-05 20:46:54 -03:00
|
|
|
|
|
|
|
def test_error_outside_scrapy(self):
|
|
|
|
"""Scrapy logger should still print outside errors"""
|
|
|
|
txlog.err(TypeError("bad type"), "Wrong type")
|
2010-08-02 08:49:14 -03:00
|
|
|
self.assertEqual(self.first_log_line(), "[-] ERROR: Wrong type")
|
2014-08-01 23:44:23 +06:00
|
|
|
self.assertIn('TypeError', self.logged())
|
|
|
|
self.assertIn('bad type', self.logged())
|
2010-08-02 08:49:14 -03:00
|
|
|
|
2010-08-05 20:46:54 -03:00
|
|
|
# this test fails in twisted trial observer, not in scrapy observer
|
|
|
|
# def test_err_why_encoding(self):
|
|
|
|
# log.err(TypeError("bad type"), u"\xa3")
|
|
|
|
# self.assertEqual(self.first_log_line(), "[scrapy] ERROR: \xc2\xa3")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_err_exc(self):
|
|
|
|
log.err(TypeError("bad type"))
|
2014-08-01 23:44:23 +06:00
|
|
|
self.assertIn('Unhandled Error', self.logged())
|
|
|
|
self.assertIn('TypeError', self.logged())
|
|
|
|
self.assertIn('bad type', self.logged())
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
def test_err_failure(self):
|
|
|
|
log.err(failure.Failure(TypeError("bad type")))
|
2014-08-01 23:44:23 +06:00
|
|
|
self.assertIn('Unhandled Error', self.logged())
|
|
|
|
self.assertIn('TypeError', self.logged())
|
|
|
|
self.assertIn('bad type', self.logged())
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
|
|
|
|
class Latin1ScrapyFileLogObserverTest(ScrapyFileLogObserverTest):
|
|
|
|
|
|
|
|
encoding = 'latin-1'
|
|
|
|
|
|
|
|
def test_msg_encoding(self):
|
|
|
|
log.msg(u"Price: \xa3100")
|
|
|
|
logged = self.f.getvalue().strip()[25:]
|
2010-08-05 20:46:54 -03:00
|
|
|
self.assertEqual(self.logged(), "[scrapy] INFO: Price: \xa3100")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
2010-08-05 20:46:54 -03:00
|
|
|
# this test fails in twisted trial observer, not in scrapy observer
|
|
|
|
# def test_err_why_encoding(self):
|
|
|
|
# log.err(TypeError("bad type"), u"\xa3")
|
|
|
|
# self.assertEqual(self.first_log_line(), "[scrapy] ERROR: \xa3")
|
2010-08-02 08:49:14 -03:00
|
|
|
|
|
|
|
|
2014-08-05 21:01:57 -03:00
|
|
|
class CrawlerScrapyFileLogObserverTest(unittest.TestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
self.f = BytesIO()
|
|
|
|
self.crawler = get_crawler(Spider)
|
|
|
|
self.spider = self.crawler.spider = self.crawler._create_spider('test')
|
|
|
|
self.log_observer = log.ScrapyFileLogObserver(self.f, log.INFO,
|
|
|
|
'utf-8', self.crawler)
|
|
|
|
self.log_observer.start()
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
self.flushLoggedErrors()
|
|
|
|
self.log_observer.stop()
|
|
|
|
|
|
|
|
def logged(self):
|
|
|
|
return self.f.getvalue().strip()[25:]
|
|
|
|
|
|
|
|
def test_msg_basic(self):
|
|
|
|
log.msg("Hello", spider=self.spider)
|
|
|
|
self.assertEqual(self.logged(), "[test] INFO: Hello")
|
|
|
|
|
|
|
|
def test_msg_ignore_scrapy_channel(self):
|
|
|
|
log.msg("Hello")
|
|
|
|
self.failIf(self.logged())
|
|
|
|
|
|
|
|
def test_msg_ignore_another_crawler(self):
|
|
|
|
crawler = get_crawler(Spider)
|
|
|
|
log.msg("Hello", spider=crawler._create_spider('test'))
|
|
|
|
self.failIf(self.logged())
|
|
|
|
|
|
|
|
def test_msg_stats_log(self):
|
|
|
|
assert self.crawler.stats.get_value('log_count/INFO', 0) == 0
|
|
|
|
log.msg("Hello", spider=self.spider)
|
|
|
|
self.assertEqual(self.crawler.stats.get_value('log_count/INFO'), 1)
|
|
|
|
|
|
|
|
|
2009-10-31 14:36:38 -02:00
|
|
|
if __name__ == "__main__":
|
|
|
|
unittest.main()
|