# Twisted, the Framework of Your Internet
# Copyright (C) 2001 Matthew W. Lefkowitz
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from twisted.trial import unittest
# system imports
import os, tempfile, shutil
# twisted imports
from twisted.python import logfile
class LogFileTestCase(unittest.TestCase):
"""Test the rotating log file."""
def setUp(self):
self.dir = tempfile.mktemp()
os.makedirs(self.dir)
self.name = "test.log"
self.path = os.path.join(self.dir, self.name)
def tearDown(self):
#shutil.rmtree(self.dir)
pass
def testWriting(self):
log = logfile.LogFile(self.name, self.dir)
log.write("123")
log.write("456")
log.flush()
log.write("7890")
log.close()
f = open(self.path, "r")
self.assertEquals(f.read(), "1234567890")
f.close()
def testRotation(self):
# this logfile should rotate every 10 bytes
log = logfile.LogFile(self.name, self.dir, rotateLength=10)
# test automatic rotation
log.write("123")
log.write("4567890")
self.assert_(os.path.exists("%s.1" % self.path))
self.assert_(not os.path.exists("%s.2" % self.path))
log.write("1" * 11)
self.assert_(os.path.exists("%s.1" % self.path))
self.assert_(os.path.exists("%s.2" % self.path))
self.assert_(not os.path.exists("%s.3" % self.path))
log.write("3")
self.assert_(not os.path.exists("%s.3" % self.path))
# test manual rotation
log.rotate()
self.assert_(os.path.exists("%s.3" % self.path))
self.assert_(not os.path.exists("%s.4" % self.path))
log.close()
self.assertEquals(log.listLogs(), [1, 2, 3])
def testAppend(self):
log = logfile.LogFile(self.name, self.dir)
log.write("0123456789")
log.close()
log = logfile.LogFile(self.name, self.dir)
self.assertEquals(log.size, 10)
self.assertEquals(log._file.tell(), log.size)
log.write("abc")
self.assertEquals(log.size, 13)
self.assertEquals(log._file.tell(), log.size)
f = log._file
f.seek(0, 0)
self.assertEquals(f.read(), "0123456789abc")
log.close()
def testLogReader(self):
log = logfile.LogFile(self.name, self.dir)
log.write("abc\n")
log.write("def\n")
log.rotate()
log.write("ghi\n")
log.flush()
# check reading logs
self.assertEquals(log.listLogs(), [1])
reader = log.getCurrentLog()
reader._file.seek(0)
self.assertEquals(reader.readLines(), ["ghi\n"])
self.assertEquals(reader.readLines(), [])
reader.close()
reader = log.getLog(1)
self.assertEquals(reader.readLines(), ["abc\n", "def\n"])
self.assertEquals(reader.readLines(), [])
reader.close()
# check getting illegal log readers
self.assertRaises(ValueError, log.getLog, 2)
self.assertRaises(TypeError, log.getLog, "1")
# check that log numbers are higher for older logs
log.rotate()
self.assertEquals(log.listLogs(), [1, 2])
reader = log.getLog(1)
reader._file.seek(0)
self.assertEquals(reader.readLines(), ["ghi\n"])
self.assertEquals(reader.readLines(), [])
reader.close()
reader = log.getLog(2)
self.assertEquals(reader.readLines(), ["abc\n", "def\n"])
self.assertEquals(reader.readLines(), [])
reader.close()
def testModePreservation(self):
"logfile: check rotated files have same permissions as original."
if not hasattr(os, "chmod"): return
f = open(self.path, "w").close()
os.chmod(self.path, 0707)
mode = os.stat(self.path)[0]
log = logfile.LogFile(self.name, self.dir)
log.write("abc")
log.rotate()
self.assertEquals(mode, os.stat(self.path)[0])
def testNoPermission(self):
"logfile: check it keeps working when permission on dir changes."
log = logfile.LogFile(self.name, self.dir)
log.write("abc")
# change permissions so rotation would fail
os.chmod(self.dir, 444)
log.rotate() # this should not fail
log.write("def")
log.flush()
f = log._file
self.assertEquals(f.tell(), 6)
f.seek(0, 0)
self.assertEquals(f.read(), "abcdef")
log.close()
# reset permission so tearDown won't fail
os.chmod(self.dir, 777)
|