Skip to content

Commit 07fcf24

Browse files
committed
[postgres] Test for deadlocks with transactions
1 parent 1e6dceb commit 07fcf24

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

tests/src/python/test_provider_postgres.py

+29-16
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@
1515
import qgis # NOQA
1616

1717
import os
18-
from qgis.core import NULL
1918

20-
from qgis.core import QgsVectorLayer, QgsFeatureRequest, QgsFeature
19+
from qgis.core import (
20+
QgsVectorLayer,
21+
QgsFeatureRequest,
22+
QgsFeature,
23+
QgsTransactionGroup,
24+
NULL
25+
)
2126
from PyQt.QtCore import QSettings, QDate, QTime, QDateTime, QVariant
2227
from qgis.testing import start_app, unittest
2328
from utilities import unitTestDataPath
@@ -37,10 +42,10 @@ def setUpClass(cls):
3742
cls.dbconn = os.environ['QGIS_PGTEST_DB']
3843
# Create test layers
3944
cls.vl = QgsVectorLayer(cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POINT table="qgis_test"."someData" (geom) sql=', 'test', 'postgres')
40-
assert(cls.vl.isValid())
45+
assert cls.vl.isValid()
4146
cls.provider = cls.vl.dataProvider()
4247
cls.poly_vl = QgsVectorLayer(cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POLYGON table="qgis_test"."some_poly_data" (geom) sql=', 'test', 'postgres')
43-
assert(cls.poly_vl.isValid())
48+
assert cls.poly_vl.isValid()
4449
cls.poly_provider = cls.poly_vl.dataProvider()
4550

4651
@classmethod
@@ -55,13 +60,13 @@ def disableCompiler(self):
5560

5661
# HERE GO THE PROVIDER SPECIFIC TESTS
5762
def testDefaultValue(self):
58-
assert self.provider.defaultValue(0) == u'nextval(\'qgis_test."someData_pk_seq"\'::regclass)'
59-
assert self.provider.defaultValue(1) == NULL
60-
assert self.provider.defaultValue(2) == '\'qgis\'::text'
63+
self.assertEqual(self.provider.defaultValue(0), u'nextval(\'qgis_test."someData_pk_seq"\'::regclass)')
64+
self.assertEqual(self.provider.defaultValue(1), NULL)
65+
self.assertEqual(self.provider.defaultValue(2), '\'qgis\'::text')
6166

6267
def testDateTimeTypes(self):
6368
vl = QgsVectorLayer('%s table="qgis_test"."date_times" sql=' % (self.dbconn), "testdatetimes", "postgres")
64-
assert(vl.isValid())
69+
self.assertTrue(vl.isValid())
6570

6671
fields = vl.dataProvider().fields()
6772
self.assertEqual(fields.at(fields.indexFromName('date_field')).type(), QVariant.Date)
@@ -71,30 +76,28 @@ def testDateTimeTypes(self):
7176
f = vl.getFeatures(QgsFeatureRequest()).next()
7277

7378
date_idx = vl.fieldNameIndex('date_field')
74-
assert isinstance(f.attributes()[date_idx], QDate)
79+
self.assertTrue(isinstance(f.attributes()[date_idx], QDate))
7580
self.assertEqual(f.attributes()[date_idx], QDate(2004, 3, 4))
7681
time_idx = vl.fieldNameIndex('time_field')
77-
assert isinstance(f.attributes()[time_idx], QTime)
82+
self.assertTrue(isinstance(f.attributes()[time_idx], QTime))
7883
self.assertEqual(f.attributes()[time_idx], QTime(13, 41, 52))
7984
datetime_idx = vl.fieldNameIndex('datetime_field')
80-
assert isinstance(f.attributes()[datetime_idx], QDateTime)
85+
self.assertTrue(isinstance(f.attributes()[datetime_idx], QDateTime))
8186
self.assertEqual(f.attributes()[datetime_idx], QDateTime(QDate(2004, 3, 4), QTime(13, 41, 52)))
8287

8388
def testQueryLayers(self):
8489
def test_query(dbconn, query, key):
8590
ql = QgsVectorLayer('%s srid=4326 table="%s" (geom) key=\'%s\' sql=' % (dbconn, query.replace('"', '\\"'), key), "testgeom", "postgres")
86-
print(query, key)
87-
assert(ql.isValid())
91+
self.assertTrue(ql.isValid(), '{} ({})'.format(query, key))
8892

8993
test_query(self.dbconn, '(SELECT NULL::integer "Id1", NULL::integer "Id2", NULL::geometry(Point, 4326) geom LIMIT 0)', '"Id1","Id2"')
9094

9195
def testWkbTypes(self):
9296
def test_table(dbconn, table_name, wkt):
9397
vl = QgsVectorLayer('%s srid=4326 table="qgis_test".%s (geom) sql=' % (dbconn, table_name), "testgeom", "postgres")
94-
assert(vl.isValid())
98+
self.assertTrue(vl.isValid())
9599
for f in vl.getFeatures():
96-
print(f.geometry().exportToWkt(), wkt)
97-
assert f.geometry().exportToWkt() == wkt
100+
self.assertEqual(f.geometry().exportToWkt(), wkt)
98101

99102
test_table(self.dbconn, 'p2d', 'Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))')
100103
test_table(self.dbconn, 'p3d', 'PolygonZ ((0 0 0, 1 0 0, 1 1 0, 0 1 0, 0 0 0))')
@@ -187,5 +190,15 @@ def testPktMapInsert(self):
187190
self.assertNotEqual(f[0]['obj_id'], NULL, f[0].attributes())
188191
vl.deleteFeatures([f[0].id()])
189192

193+
def testNestedInsert(self):
194+
tg = QgsTransactionGroup()
195+
tg.addLayer(self.vl)
196+
self.vl.startEditing()
197+
it = self.vl.getFeatures()
198+
f = next(it)
199+
f['pk'] = NULL
200+
self.vl.addFeature(f) # Should not deadlock during an active iteration
201+
f = next(it)
202+
190203
if __name__ == '__main__':
191204
unittest.main()

0 commit comments

Comments
 (0)