| OLD | NEW |
| 1 # This file is part of Buildbot. Buildbot is free software: you can | 1 # This file is part of Buildbot. Buildbot is free software: you can |
| 2 # redistribute it and/or modify it under the terms of the GNU General Public | 2 # redistribute it and/or modify it under the terms of the GNU General Public |
| 3 # License as published by the Free Software Foundation, version 2. | 3 # License as published by the Free Software Foundation, version 2. |
| 4 # | 4 # |
| 5 # This program is distributed in the hope that it will be useful, but WITHOUT | 5 # This program is distributed in the hope that it will be useful, but WITHOUT |
| 6 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | 6 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| 7 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | 7 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| 8 # details. | 8 # details. |
| 9 # | 9 # |
| 10 # You should have received a copy of the GNU General Public License along with | 10 # You should have received a copy of the GNU General Public License along with |
| 11 # this program; if not, write to the Free Software Foundation, Inc., 51 | 11 # this program; if not, write to the Free Software Foundation, Inc., 51 |
| 12 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 12 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| 13 # | 13 # |
| 14 # Copyright Buildbot Team Members | 14 # Copyright Buildbot Team Members |
| 15 | 15 |
| 16 import os |
| 17 import time |
| 16 import sqlalchemy as sa | 18 import sqlalchemy as sa |
| 17 from twisted.trial import unittest | 19 from twisted.trial import unittest |
| 18 from twisted.internet import defer | 20 from twisted.internet import defer, reactor |
| 19 from buildbot.db import pool | 21 from buildbot.db import pool |
| 20 from buildbot.test.util import db | 22 from buildbot.test.util import db |
| 21 | 23 |
| 22 class Basic(unittest.TestCase): | 24 class Basic(unittest.TestCase): |
| 23 | 25 |
| 24 # basic tests, just using an in-memory SQL db and one thread | 26 # basic tests, just using an in-memory SQL db and one thread |
| 25 | 27 |
| 26 def setUp(self): | 28 def setUp(self): |
| 27 self.engine = sa.create_engine('sqlite://') | 29 self.engine = sa.create_engine('sqlite://') |
| 28 self.engine.optimal_thread_pool_size = 1 | 30 self.engine.optimal_thread_pool_size = 1 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 # setUp. | 98 # setUp. |
| 97 d = defer.succeed(None) | 99 d = defer.succeed(None) |
| 98 def create_table(engine): | 100 def create_table(engine): |
| 99 engine.execute("CREATE TABLE tmp ( a integer )") | 101 engine.execute("CREATE TABLE tmp ( a integer )") |
| 100 d.addCallback( lambda r : self.pool.do_with_engine(create_table)) | 102 d.addCallback( lambda r : self.pool.do_with_engine(create_table)) |
| 101 def insert_into_table(engine): | 103 def insert_into_table(engine): |
| 102 engine.execute("INSERT INTO tmp values ( 1 )") | 104 engine.execute("INSERT INTO tmp values ( 1 )") |
| 103 d.addCallback( lambda r : self.pool.do_with_engine(insert_into_table)) | 105 d.addCallback( lambda r : self.pool.do_with_engine(insert_into_table)) |
| 104 return d | 106 return d |
| 105 | 107 |
| 108 |
| 109 class Stress(unittest.TestCase): |
| 110 |
| 111 def setUp(self): |
| 112 setup_engine = sa.create_engine('sqlite:///test.sqlite') |
| 113 setup_engine.execute("pragma journal_mode = wal") |
| 114 setup_engine.execute("CREATE TABLE test (a integer, b integer)") |
| 115 |
| 116 self.engine = sa.create_engine('sqlite:///test.sqlite') |
| 117 self.engine.optimal_thread_pool_size = 2 |
| 118 self.pool = pool.DBThreadPool(self.engine) |
| 119 |
| 120 def tearDown(self): |
| 121 self.pool.shutdown() |
| 122 os.unlink("test.sqlite") |
| 123 |
| 124 @defer.deferredGenerator |
| 125 def test_inserts(self): |
| 126 def write(conn): |
| 127 trans = conn.begin() |
| 128 conn.execute("INSERT INTO test VALUES (1, 1)") |
| 129 time.sleep(31) |
| 130 trans.commit() |
| 131 d1 = self.pool.do(write) |
| 132 |
| 133 def write2(conn): |
| 134 trans = conn.begin() |
| 135 conn.execute("INSERT INTO test VALUES (1, 1)") |
| 136 trans.commit() |
| 137 d2 = defer.Deferred() |
| 138 d2.addCallback(lambda _ : |
| 139 self.pool.do(write2)) |
| 140 reactor.callLater(0.1, d2.callback, None) |
| 141 |
| 142 wfd = defer.waitForDeferred( |
| 143 defer.DeferredList([ d1, d2 ])) |
| 144 yield wfd |
| 145 wfd.getResult() |
| 146 |
| 147 # don't run this test, since it takes 30s |
| 148 del test_inserts |
| 149 |
| 150 |
| 106 class Native(unittest.TestCase, db.RealDatabaseMixin): | 151 class Native(unittest.TestCase, db.RealDatabaseMixin): |
| 107 | 152 |
| 108 # similar tests, but using the BUILDBOT_TEST_DB_URL | 153 # similar tests, but using the BUILDBOT_TEST_DB_URL |
| 109 | 154 |
| 110 def setUp(self): | 155 def setUp(self): |
| 111 d = self.setUpRealDatabase(want_pool=False) | 156 d = self.setUpRealDatabase(want_pool=False) |
| 112 def make_pool(_): | 157 def make_pool(_): |
| 113 self.pool = pool.DBThreadPool(self.db_engine) | 158 self.pool = pool.DBThreadPool(self.db_engine) |
| 114 d.addCallback(make_pool) | 159 d.addCallback(make_pool) |
| 115 return d | 160 return d |
| (...skipping 21 matching lines...) Expand all Loading... |
| 137 t = conn.begin() | 182 t = conn.begin() |
| 138 native_tests.create(bind=conn) | 183 native_tests.create(bind=conn) |
| 139 t.commit() | 184 t.commit() |
| 140 d = self.pool.do(ddl) | 185 d = self.pool.do(ddl) |
| 141 def access(conn): | 186 def access(conn): |
| 142 native_tests.insert(bind=conn).execute([ {'name':'foo'} ]) | 187 native_tests.insert(bind=conn).execute([ {'name':'foo'} ]) |
| 143 d.addCallback(lambda _ : | 188 d.addCallback(lambda _ : |
| 144 self.pool.do(access)) | 189 self.pool.do(access)) |
| 145 return d | 190 return d |
| 146 | 191 |
| OLD | NEW |