changeset 640:34776258924e

0.6dev: Fixing proper removal of log+levels files in `BuildLog.delete()`. Added test to verify. Closes #424.
author osimons
date Wed, 19 Aug 2009 21:39:59 +0000
parents 5e78705333c3
children df849161d683
files bitten/model.py bitten/tests/model.py
diffstat 2 files changed, 36 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/bitten/model.py
+++ b/bitten/model.py
@@ -742,23 +742,25 @@
         else:
             handle_ta = False
 
-        cursor = db.cursor()
-        cursor.execute("SELECT filename FROM bitten_log WHERE id=%s", (self.id,))
-        log_files = cursor.fetchall() or []
-        cursor.execute("DELETE FROM bitten_log WHERE id=%s", (self.id,))
-        for log_file in log_files:
-            log_file = self.get_log_file(log_file[0])
+        if self.filename:
+            log_file = self.get_log_file(self.filename)
             if os.path.exists(log_file):
                 try:
+                    self.env.log.debug("Deleting log file: %s" % log_file)
                     os.remove(log_file)
                 except Exception, e:
                     self.env.log.warning("Error removing log file %s: %s" % (log_file, e))
-            level_file = self.get_log_file(log_file[1])
-            if os.path.exists(log_file):
+            level_file = log_file + '.levels'
+            if os.path.exists(level_file):
                 try:
+                    self.env.log.debug("Deleting level file: %s" % level_file)
                     os.remove(level_file)
                 except Exception, e:
-                    self.env.log.warning("Error removing log file %s: %s" % (log_file, e))
+                    self.env.log.warning("Error removing level file %s: %s" \
+                                                % (level_file, e))
+
+        cursor = db.cursor()
+        cursor.execute("DELETE FROM bitten_log WHERE id=%s", (self.id,))
 
         if handle_ta:
             db.commit()
--- a/bitten/tests/model.py
+++ b/bitten/tests/model.py
@@ -15,6 +15,7 @@
 from bitten.model import BuildConfig, TargetPlatform, Build, BuildStep, \
                          BuildLog, Report, schema
 import os
+import shutil
 import tempfile
 
 
@@ -43,7 +44,7 @@
         db.commit()
 
     def tearDown(self):
-        pass
+        shutil.rmtree(self.env.path)
 
 class BuildConfigTestCase(BaseModelTestCase):
 
@@ -498,6 +499,29 @@
         log = BuildLog(self.env, build=1, step='test', generator='foo')
         self.assertRaises(AssertionError, log.delete)
 
+    def test_insert_and_delete_files(self):
+        # create - files should be created automatically
+        build_log = BuildLog(self.env, build=1, step='test', generator='make')
+        build_log.messages = [(BuildLog.INFO, 'running')]
+        build_log.insert()
+
+        # fetch it fresh - check object and files
+        build_log = BuildLog.fetch(self.env, id=build_log.id)
+        self.assertEquals(build_log.filename, "%s.log" % build_log.id)
+        log_file = build_log.get_log_file(build_log.filename)
+        levels_file = log_file+'.levels'
+        self.failUnless(os.path.exists(log_file), 'log_file does not exist')
+        self.failUnless(os.path.exists(levels_file),
+                                                'levels_file does not exist')
+        self.assertEquals(build_log.messages, [(BuildLog.INFO, 'running')])
+
+        # delete - object and file should be gone
+        build_log.delete()
+        self.assertEquals(None, BuildLog.fetch(self.env, id=build_log.id))
+        self.failIf(os.path.exists(log_file), 'log_file exists after delete()')
+        self.failIf(os.path.exists(levels_file),
+                                        'levels_file exists after delete()')
+
     def test_fetch(self):
         db = self.env.get_db_cnx()
         cursor = db.cursor()
Copyright (C) 2012-2017 Edgewall Software