Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
transaction
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
transaction
Commits
f1ac2d88
Commit
f1ac2d88
authored
Dec 18, 2012
by
Tres Seaver
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Coverage for Transaction.abort.
parent
cddc4148
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
351 additions
and
172 deletions
+351
-172
transaction/tests/test__transaction.py
transaction/tests/test__transaction.py
+351
-172
No files found.
transaction/tests/test__transaction.py
View file @
f1ac2d88
...
@@ -55,57 +55,57 @@ class TransactionTests(unittest.TestCase):
...
@@ -55,57 +55,57 @@ class TransactionTests(unittest.TestCase):
from
transaction
import
_transaction
from
transaction
import
_transaction
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
self
.
assertTrue
(
isinstance
(
t
.
_synchronizers
,
WeakSet
))
self
.
assertTrue
(
isinstance
(
t
xn
.
_synchronizers
,
WeakSet
))
self
.
assertEqual
(
len
(
t
.
_synchronizers
),
0
)
self
.
assertEqual
(
len
(
t
xn
.
_synchronizers
),
0
)
self
.
assertTrue
(
t
.
_manager
is
None
)
self
.
assertTrue
(
t
xn
.
_manager
is
None
)
self
.
assertTrue
(
t
.
_savepoint2index
is
None
)
self
.
assertTrue
(
t
xn
.
_savepoint2index
is
None
)
self
.
assertEqual
(
t
.
_savepoint_index
,
0
)
self
.
assertEqual
(
t
xn
.
_savepoint_index
,
0
)
self
.
assertEqual
(
t
.
_resources
,
[])
self
.
assertEqual
(
t
xn
.
_resources
,
[])
self
.
assertEqual
(
t
.
_adapters
,
{})
self
.
assertEqual
(
t
xn
.
_adapters
,
{})
self
.
assertEqual
(
t
.
_voted
,
{})
self
.
assertEqual
(
t
xn
.
_voted
,
{})
self
.
assertEqual
(
t
.
_extension
,
{})
self
.
assertEqual
(
t
xn
.
_extension
,
{})
self
.
assertTrue
(
t
.
log
is
logger
)
self
.
assertTrue
(
t
xn
.
log
is
logger
)
self
.
assertEqual
(
len
(
logger
.
_log
),
1
)
self
.
assertEqual
(
len
(
logger
.
_log
),
1
)
self
.
assertEqual
(
logger
.
_log
[
0
][
0
],
'debug'
)
self
.
assertEqual
(
logger
.
_log
[
0
][
0
],
'debug'
)
self
.
assertEqual
(
logger
.
_log
[
0
][
1
],
'new transaction'
)
self
.
assertEqual
(
logger
.
_log
[
0
][
1
],
'new transaction'
)
self
.
assertTrue
(
t
.
_failure_traceback
is
None
)
self
.
assertTrue
(
t
xn
.
_failure_traceback
is
None
)
self
.
assertEqual
(
t
.
_before_commit
,
[])
self
.
assertEqual
(
t
xn
.
_before_commit
,
[])
self
.
assertEqual
(
t
.
_after_commit
,
[])
self
.
assertEqual
(
t
xn
.
_after_commit
,
[])
def
test_ctor_w_syncs
(
self
):
def
test_ctor_w_syncs
(
self
):
from
transaction.weakset
import
WeakSet
from
transaction.weakset
import
WeakSet
synchs
=
WeakSet
()
synchs
=
WeakSet
()
t
=
self
.
_makeOne
(
synchronizers
=
synchs
)
t
xn
=
self
.
_makeOne
(
synchronizers
=
synchs
)
self
.
assertTrue
(
t
.
_synchronizers
is
synchs
)
self
.
assertTrue
(
t
xn
.
_synchronizers
is
synchs
)
def
test_isDoomed
(
self
):
def
test_isDoomed
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
self
.
assertFalse
(
t
.
isDoomed
())
self
.
assertFalse
(
t
xn
.
isDoomed
())
t
.
status
=
Status
.
DOOMED
t
xn
.
status
=
Status
.
DOOMED
self
.
assertTrue
(
t
.
isDoomed
())
self
.
assertTrue
(
t
xn
.
isDoomed
())
def
test_doom_active
(
self
):
def
test_doom_active
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
doom
()
t
xn
.
doom
()
self
.
assertTrue
(
t
.
isDoomed
())
self
.
assertTrue
(
t
xn
.
isDoomed
())
self
.
assertEqual
(
t
.
status
,
Status
.
DOOMED
)
self
.
assertEqual
(
t
xn
.
status
,
Status
.
DOOMED
)
def
test_doom_invalid
(
self
):
def
test_doom_invalid
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
for
status
in
Status
.
COMMITTING
,
Status
.
COMMITTED
,
Status
.
COMMITFAILED
:
for
status
in
Status
.
COMMITTING
,
Status
.
COMMITTED
,
Status
.
COMMITFAILED
:
t
.
status
=
status
t
xn
.
status
=
status
self
.
assertRaises
(
ValueError
,
t
.
doom
)
self
.
assertRaises
(
ValueError
,
t
xn
.
doom
)
def
test_doom_already_doomed
(
self
):
def
test_doom_already_doomed
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
status
=
Status
.
DOOMED
t
xn
.
status
=
Status
.
DOOMED
self
.
assertTrue
(
t
.
isDoomed
())
self
.
assertTrue
(
t
xn
.
isDoomed
())
self
.
assertEqual
(
t
.
status
,
Status
.
DOOMED
)
self
.
assertEqual
(
t
xn
.
status
,
Status
.
DOOMED
)
def
test__prior_operation_failed
(
self
):
def
test__prior_operation_failed
(
self
):
from
transaction.interfaces
import
TransactionFailedError
from
transaction.interfaces
import
TransactionFailedError
...
@@ -113,9 +113,10 @@ class TransactionTests(unittest.TestCase):
...
@@ -113,9 +113,10 @@ class TransactionTests(unittest.TestCase):
class
_Traceback
(
object
):
class
_Traceback
(
object
):
def
getvalue
(
self
):
def
getvalue
(
self
):
return
'TRACEBACK'
return
'TRACEBACK'
t
=
self
.
_makeOne
()
txn
=
self
.
_makeOne
()
t
.
_failure_traceback
=
_Traceback
()
txn
.
_failure_traceback
=
_Traceback
()
err
=
assertRaisesEx
(
TransactionFailedError
,
t
.
_prior_operation_failed
)
err
=
assertRaisesEx
(
TransactionFailedError
,
txn
.
_prior_operation_failed
)
self
.
assertTrue
(
str
(
err
).
startswith
(
'An operation previously failed'
))
self
.
assertTrue
(
str
(
err
).
startswith
(
'An operation previously failed'
))
self
.
assertTrue
(
str
(
err
).
endswith
(
"with traceback:
\
n
\
n
TRACEBACK"
))
self
.
assertTrue
(
str
(
err
).
endswith
(
"with traceback:
\
n
\
n
TRACEBACK"
))
...
@@ -125,30 +126,30 @@ class TransactionTests(unittest.TestCase):
...
@@ -125,30 +126,30 @@ class TransactionTests(unittest.TestCase):
class
_Traceback
(
object
):
class
_Traceback
(
object
):
def
getvalue
(
self
):
def
getvalue
(
self
):
return
'TRACEBACK'
return
'TRACEBACK'
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
status
=
Status
.
COMMITFAILED
t
xn
.
status
=
Status
.
COMMITFAILED
t
.
_failure_traceback
=
_Traceback
()
t
xn
.
_failure_traceback
=
_Traceback
()
self
.
assertRaises
(
TransactionFailedError
,
t
.
join
,
object
())
self
.
assertRaises
(
TransactionFailedError
,
t
xn
.
join
,
object
())
def
test_join_COMMITTING
(
self
):
def
test_join_COMMITTING
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
status
=
Status
.
COMMITTING
t
xn
.
status
=
Status
.
COMMITTING
self
.
assertRaises
(
ValueError
,
t
.
join
,
object
())
self
.
assertRaises
(
ValueError
,
t
xn
.
join
,
object
())
def
test_join_COMMITTED
(
self
):
def
test_join_COMMITTED
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
status
=
Status
.
COMMITTED
t
xn
.
status
=
Status
.
COMMITTED
self
.
assertRaises
(
ValueError
,
t
.
join
,
object
())
self
.
assertRaises
(
ValueError
,
t
xn
.
join
,
object
())
def
test_join_DOOMED_non_preparing_wo_sp2index
(
self
):
def
test_join_DOOMED_non_preparing_wo_sp2index
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
status
=
Status
.
DOOMED
t
xn
.
status
=
Status
.
DOOMED
resource
=
object
()
resource
=
object
()
t
.
join
(
resource
)
t
xn
.
join
(
resource
)
self
.
assertEqual
(
t
.
_resources
,
[
resource
])
self
.
assertEqual
(
t
xn
.
_resources
,
[
resource
])
def
test_join_ACTIVE_w_preparing_w_sp2index
(
self
):
def
test_join_ACTIVE_w_preparing_w_sp2index
(
self
):
from
transaction._transaction
import
AbortSavepoint
from
transaction._transaction
import
AbortSavepoint
...
@@ -159,30 +160,30 @@ class TransactionTests(unittest.TestCase):
...
@@ -159,30 +160,30 @@ class TransactionTests(unittest.TestCase):
class
_DM
(
object
):
class
_DM
(
object
):
def
prepare
(
self
):
def
prepare
(
self
):
pass
pass
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
tsp
=
_TSP
()
tsp
=
_TSP
()
t
.
_savepoint2index
=
{
tsp
:
object
()}
t
xn
.
_savepoint2index
=
{
tsp
:
object
()}
dm
=
_DM
dm
=
_DM
t
.
join
(
dm
)
t
xn
.
join
(
dm
)
self
.
assertEqual
(
len
(
t
.
_resources
),
1
)
self
.
assertEqual
(
len
(
t
xn
.
_resources
),
1
)
dma
=
t
.
_resources
[
0
]
dma
=
t
xn
.
_resources
[
0
]
self
.
assertTrue
(
isinstance
(
dma
,
DataManagerAdapter
))
self
.
assertTrue
(
isinstance
(
dma
,
DataManagerAdapter
))
self
.
assertTrue
(
t
.
_resources
[
0
].
_datamanager
is
dm
)
self
.
assertTrue
(
t
xn
.
_resources
[
0
].
_datamanager
is
dm
)
self
.
assertEqual
(
len
(
tsp
.
_savepoints
),
1
)
self
.
assertEqual
(
len
(
tsp
.
_savepoints
),
1
)
self
.
assertTrue
(
isinstance
(
tsp
.
_savepoints
[
0
],
AbortSavepoint
))
self
.
assertTrue
(
isinstance
(
tsp
.
_savepoints
[
0
],
AbortSavepoint
))
self
.
assertTrue
(
tsp
.
_savepoints
[
0
].
datamanager
is
dma
)
self
.
assertTrue
(
tsp
.
_savepoints
[
0
].
datamanager
is
dma
)
self
.
assertTrue
(
tsp
.
_savepoints
[
0
].
transaction
is
t
)
self
.
assertTrue
(
tsp
.
_savepoints
[
0
].
transaction
is
t
xn
)
def
test__unjoin_miss
(
self
):
def
test__unjoin_miss
(
self
):
txn
=
self
.
_makeOne
()
txn
=
self
.
_makeOne
()
txn
.
_unjoin
(
object
())
#no raise
txn
.
_unjoin
(
object
())
#no raise
def
test__unjoin_hit
(
self
):
def
test__unjoin_hit
(
self
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
resource
=
object
()
resource
=
object
()
t
.
_resources
.
append
(
resource
)
t
xn
.
_resources
.
append
(
resource
)
t
.
_unjoin
(
resource
)
t
xn
.
_unjoin
(
resource
)
self
.
assertEqual
(
t
.
_resources
,
[])
self
.
assertEqual
(
t
xn
.
_resources
,
[])
def
test_savepoint_COMMITFAILED
(
self
):
def
test_savepoint_COMMITFAILED
(
self
):
from
transaction.interfaces
import
TransactionFailedError
from
transaction.interfaces
import
TransactionFailedError
...
@@ -190,10 +191,10 @@ class TransactionTests(unittest.TestCase):
...
@@ -190,10 +191,10 @@ class TransactionTests(unittest.TestCase):
class
_Traceback
(
object
):
class
_Traceback
(
object
):
def
getvalue
(
self
):
def
getvalue
(
self
):
return
'TRACEBACK'
return
'TRACEBACK'
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
status
=
Status
.
COMMITFAILED
t
xn
.
status
=
Status
.
COMMITFAILED
t
.
_failure_traceback
=
_Traceback
()
t
xn
.
_failure_traceback
=
_Traceback
()
self
.
assertRaises
(
TransactionFailedError
,
t
.
savepoint
)
self
.
assertRaises
(
TransactionFailedError
,
t
xn
.
savepoint
)
def
test_savepoint_empty
(
self
):
def
test_savepoint_empty
(
self
):
from
weakref
import
WeakKeyDictionary
from
weakref
import
WeakKeyDictionary
...
@@ -203,14 +204,14 @@ class TransactionTests(unittest.TestCase):
...
@@ -203,14 +204,14 @@ class TransactionTests(unittest.TestCase):
from
transaction.tests.common
import
Monkey
from
transaction.tests.common
import
Monkey
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
sp
=
t
.
savepoint
()
sp
=
t
xn
.
savepoint
()
self
.
assertTrue
(
isinstance
(
sp
,
Savepoint
))
self
.
assertTrue
(
isinstance
(
sp
,
Savepoint
))
self
.
assertTrue
(
sp
.
transaction
is
t
)
self
.
assertTrue
(
sp
.
transaction
is
t
xn
)
self
.
assertEqual
(
sp
.
_savepoints
,
[])
self
.
assertEqual
(
sp
.
_savepoints
,
[])
self
.
assertEqual
(
t
.
_savepoint_index
,
1
)
self
.
assertEqual
(
t
xn
.
_savepoint_index
,
1
)
self
.
assertTrue
(
isinstance
(
t
.
_savepoint2index
,
WeakKeyDictionary
))
self
.
assertTrue
(
isinstance
(
t
xn
.
_savepoint2index
,
WeakKeyDictionary
))
self
.
assertEqual
(
t
.
_savepoint2index
[
sp
],
1
)
self
.
assertEqual
(
t
xn
.
_savepoint2index
[
sp
],
1
)
def
test_savepoint_non_optimistc_resource_wo_support
(
self
):
def
test_savepoint_non_optimistc_resource_wo_support
(
self
):
from
transaction
import
_transaction
from
transaction
import
_transaction
...
@@ -220,14 +221,14 @@ class TransactionTests(unittest.TestCase):
...
@@ -220,14 +221,14 @@ class TransactionTests(unittest.TestCase):
from
transaction.tests.common
import
Monkey
from
transaction.tests.common
import
Monkey
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
logger
.
_clear
()
logger
.
_clear
()
resource
=
object
()
resource
=
object
()
t
.
_resources
.
append
(
resource
)
t
xn
.
_resources
.
append
(
resource
)
self
.
assertRaises
(
TypeError
,
t
.
savepoint
)
self
.
assertRaises
(
TypeError
,
t
xn
.
savepoint
)
self
.
assertEqual
(
t
.
status
,
Status
.
COMMITFAILED
)
self
.
assertEqual
(
t
xn
.
status
,
Status
.
COMMITFAILED
)
self
.
assertTrue
(
isinstance
(
t
.
_failure_traceback
,
StringIO
))
self
.
assertTrue
(
isinstance
(
t
xn
.
_failure_traceback
,
StringIO
))
self
.
assertTrue
(
'TypeError'
in
t
.
_failure_traceback
.
getvalue
())
self
.
assertTrue
(
'TypeError'
in
t
xn
.
_failure_traceback
.
getvalue
())
self
.
assertEqual
(
len
(
logger
.
_log
),
2
)
self
.
assertEqual
(
len
(
logger
.
_log
),
2
)
self
.
assertEqual
(
logger
.
_log
[
0
][
0
],
'error'
)
self
.
assertEqual
(
logger
.
_log
[
0
][
0
],
'error'
)
self
.
assertTrue
(
logger
.
_log
[
0
][
1
].
startswith
(
'Error in abort'
))
self
.
assertTrue
(
logger
.
_log
[
0
][
1
].
startswith
(
'Error in abort'
))
...
@@ -236,27 +237,27 @@ class TransactionTests(unittest.TestCase):
...
@@ -236,27 +237,27 @@ class TransactionTests(unittest.TestCase):
def
test__remove_and_invalidate_after_miss
(
self
):
def
test__remove_and_invalidate_after_miss
(
self
):
from
weakref
import
WeakKeyDictionary
from
weakref
import
WeakKeyDictionary
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
_savepoint2index
=
WeakKeyDictionary
()
t
xn
.
_savepoint2index
=
WeakKeyDictionary
()
class
_SP
(
object
):
class
_SP
(
object
):
def
__init__
(
self
,
t
):
def
__init__
(
self
,
t
xn
):
self
.
transaction
=
t
self
.
transaction
=
t
xn
holdme
=
[]
holdme
=
[]
for
i
in
range
(
10
):
for
i
in
range
(
10
):
sp
=
_SP
(
t
)
sp
=
_SP
(
t
xn
)
holdme
.
append
(
sp
)
#prevent gc
holdme
.
append
(
sp
)
#prevent gc
t
.
_savepoint2index
[
sp
]
=
i
t
xn
.
_savepoint2index
[
sp
]
=
i
self
.
assertEqual
(
len
(
t
.
_savepoint2index
),
10
)
self
.
assertEqual
(
len
(
t
xn
.
_savepoint2index
),
10
)
self
.
assertRaises
(
KeyError
,
t
.
_remove_and_invalidate_after
,
_SP
(
t
))
self
.
assertRaises
(
KeyError
,
t
xn
.
_remove_and_invalidate_after
,
_SP
(
txn
))
self
.
assertEqual
(
len
(
t
.
_savepoint2index
),
10
)
self
.
assertEqual
(
len
(
t
xn
.
_savepoint2index
),
10
)
def
test__remove_and_invalidate_after_hit
(
self
):
def
test__remove_and_invalidate_after_hit
(
self
):
from
weakref
import
WeakKeyDictionary
from
weakref
import
WeakKeyDictionary
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
_savepoint2index
=
WeakKeyDictionary
()
t
xn
.
_savepoint2index
=
WeakKeyDictionary
()
class
_SP
(
object
):
class
_SP
(
object
):
def
__init__
(
self
,
t
,
index
):
def
__init__
(
self
,
t
xn
,
index
):
self
.
transaction
=
t
self
.
transaction
=
t
xn
self
.
_index
=
index
self
.
_index
=
index
def
__lt__
(
self
,
other
):
def
__lt__
(
self
,
other
):
return
self
.
_index
<
other
.
_index
return
self
.
_index
<
other
.
_index
...
@@ -264,37 +265,37 @@ class TransactionTests(unittest.TestCase):
...
@@ -264,37 +265,37 @@ class TransactionTests(unittest.TestCase):
return
'_SP: %d'
%
self
.
_index
return
'_SP: %d'
%
self
.
_index
holdme
=
[]
holdme
=
[]
for
i
in
range
(
10
):
for
i
in
range
(
10
):
sp
=
_SP
(
t
,
i
)
sp
=
_SP
(
t
xn
,
i
)
holdme
.
append
(
sp
)
#prevent gc
holdme
.
append
(
sp
)
#prevent gc
t
.
_savepoint2index
[
sp
]
=
i
t
xn
.
_savepoint2index
[
sp
]
=
i
self
.
assertEqual
(
len
(
t
.
_savepoint2index
),
10
)
self
.
assertEqual
(
len
(
t
xn
.
_savepoint2index
),
10
)
t
.
_remove_and_invalidate_after
(
holdme
[
1
])
t
xn
.
_remove_and_invalidate_after
(
holdme
[
1
])
self
.
assertEqual
(
sorted
(
t
.
_savepoint2index
),
sorted
(
holdme
[:
2
]))
self
.
assertEqual
(
sorted
(
t
xn
.
_savepoint2index
),
sorted
(
holdme
[:
2
]))
def
test__invalidate_all_savepoints
(
self
):
def
test__invalidate_all_savepoints
(
self
):
from
weakref
import
WeakKeyDictionary
from
weakref
import
WeakKeyDictionary
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
_savepoint2index
=
WeakKeyDictionary
()
t
xn
.
_savepoint2index
=
WeakKeyDictionary
()
class
_SP
(
object
):
class
_SP
(
object
):
def
__init__
(
self
,
t
,
index
):
def
__init__
(
self
,
t
xn
,
index
):
self
.
transaction
=
t
self
.
transaction
=
t
xn
self
.
_index
=
index
self
.
_index
=
index
def
__repr__
(
self
):
def
__repr__
(
self
):
return
'_SP: %d'
%
self
.
_index
return
'_SP: %d'
%
self
.
_index
holdme
=
[]
holdme
=
[]
for
i
in
range
(
10
):
for
i
in
range
(
10
):
sp
=
_SP
(
t
,
i
)
sp
=
_SP
(
t
xn
,
i
)
holdme
.
append
(
sp
)
#prevent gc
holdme
.
append
(
sp
)
#prevent gc
t
.
_savepoint2index
[
sp
]
=
i
t
xn
.
_savepoint2index
[
sp
]
=
i
self
.
assertEqual
(
len
(
t
.
_savepoint2index
),
10
)
self
.
assertEqual
(
len
(
t
xn
.
_savepoint2index
),
10
)
t
.
_invalidate_all_savepoints
()
t
xn
.
_invalidate_all_savepoints
()
self
.
assertEqual
(
list
(
t
.
_savepoint2index
),
[])
self
.
assertEqual
(
list
(
t
xn
.
_savepoint2index
),
[])
def
test_register_wo_jar
(
self
):
def
test_register_wo_jar
(
self
):
class
_Dummy
(
object
):
class
_Dummy
(
object
):
_p_jar
=
None
_p_jar
=
None
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
self
.
assertRaises
(
ValueError
,
t
.
register
,
_Dummy
())
self
.
assertRaises
(
ValueError
,
t
xn
.
register
,
_Dummy
())
def
test_register_w_jar
(
self
):
def
test_register_w_jar
(
self
):
class
_Manager
(
object
):
class
_Manager
(
object
):
...
@@ -302,15 +303,15 @@ class TransactionTests(unittest.TestCase):
...
@@ -302,15 +303,15 @@ class TransactionTests(unittest.TestCase):
mgr
=
_Manager
()
mgr
=
_Manager
()
class
_Dummy
(
object
):
class
_Dummy
(
object
):
_p_jar
=
mgr
_p_jar
=
mgr
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
dummy
=
_Dummy
()
dummy
=
_Dummy
()
t
.
register
(
dummy
)
t
xn
.
register
(
dummy
)
resources
=
list
(
t
.
_resources
)
resources
=
list
(
t
xn
.
_resources
)
self
.
assertEqual
(
len
(
resources
),
1
)
self
.
assertEqual
(
len
(
resources
),
1
)
adapter
=
resources
[
0
]
adapter
=
resources
[
0
]
self
.
assertTrue
(
adapter
.
manager
is
mgr
)
self
.
assertTrue
(
adapter
.
manager
is
mgr
)
self
.
assertTrue
(
dummy
in
adapter
.
objects
)
self
.
assertTrue
(
dummy
in
adapter
.
objects
)
items
=
list
(
t
.
_adapters
.
items
())
items
=
list
(
t
xn
.
_adapters
.
items
())
self
.
assertEqual
(
len
(
items
),
1
)
self
.
assertEqual
(
len
(
items
),
1
)
self
.
assertTrue
(
items
[
0
][
0
]
is
mgr
)
self
.
assertTrue
(
items
[
0
][
0
]
is
mgr
)
self
.
assertTrue
(
items
[
0
][
1
]
is
adapter
)
self
.
assertTrue
(
items
[
0
][
1
]
is
adapter
)
...
@@ -324,18 +325,18 @@ class TransactionTests(unittest.TestCase):
...
@@ -324,18 +325,18 @@ class TransactionTests(unittest.TestCase):
mgr
=
_Manager
()
mgr
=
_Manager
()
class
_Dummy
(
object
):
class
_Dummy
(
object
):
_p_jar
=
mgr
_p_jar
=
mgr
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
_adapters
[
mgr
]
=
adapter
=
_Adapter
()
t
xn
.
_adapters
[
mgr
]
=
adapter
=
_Adapter
()
dummy
=
_Dummy
()
dummy
=
_Dummy
()
t
.
register
(
dummy
)
t
xn
.
register
(
dummy
)
self
.
assertTrue
(
dummy
in
adapter
.
objects
)
self
.
assertTrue
(
dummy
in
adapter
.
objects
)
def
test_commit_DOOMED
(
self
):
def
test_commit_DOOMED
(
self
):
from
transaction.interfaces
import
DoomedTransaction
from
transaction.interfaces
import
DoomedTransaction
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
status
=
Status
.
DOOMED
t
xn
.
status
=
Status
.
DOOMED
self
.
assertRaises
(
DoomedTransaction
,
t
.
commit
)
self
.
assertRaises
(
DoomedTransaction
,
t
xn
.
commit
)
def
test_commit_COMMITFAILED
(
self
):
def
test_commit_COMMITFAILED
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
...
@@ -343,10 +344,10 @@ class TransactionTests(unittest.TestCase):
...
@@ -343,10 +344,10 @@ class TransactionTests(unittest.TestCase):
class
_Traceback
(
object
):
class
_Traceback
(
object
):
def
getvalue
(
self
):
def
getvalue
(
self
):
return
'TRACEBACK'
return
'TRACEBACK'
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
status
=
Status
.
COMMITFAILED
t
xn
.
status
=
Status
.
COMMITFAILED
t
.
_failure_traceback
=
_Traceback
()
t
xn
.
_failure_traceback
=
_Traceback
()
self
.
assertRaises
(
TransactionFailedError
,
t
.
commit
)
self
.
assertRaises
(
TransactionFailedError
,
t
xn
.
commit
)
def
test_commit_wo_savepoints_wo_hooks_wo_synchronizers
(
self
):
def
test_commit_wo_savepoints_wo_hooks_wo_synchronizers
(
self
):
from
transaction._transaction
import
Status
from
transaction._transaction
import
Status
...
@@ -361,11 +362,11 @@ class TransactionTests(unittest.TestCase):
...
@@ -361,11 +362,11 @@ class TransactionTests(unittest.TestCase):
self
.
_txn
=
None
self
.
_txn
=
None
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
logger
.
_clear
()
logger
.
_clear
()
mgr
=
t
.
_manager
=
_Mgr
(
t
)
mgr
=
t
xn
.
_manager
=
_Mgr
(
txn
)
t
.
commit
()
t
xn
.
commit
()
self
.
assertEqual
(
t
.
status
,
Status
.
COMMITTED
)
self
.
assertEqual
(
t
xn
.
status
,
Status
.
COMMITTED
)
self
.
assertTrue
(
mgr
.
_txn
is
None
)
self
.
assertTrue
(
mgr
.
_txn
is
None
)
self
.
assertEqual
(
logger
.
_log
[
0
][
0
],
'debug'
)
self
.
assertEqual
(
logger
.
_log
[
0
][
0
],
'debug'
)
self
.
assertEqual
(
logger
.
_log
[
0
][
1
],
'commit'
)
self
.
assertEqual
(
logger
.
_log
[
0
][
1
],
'commit'
)
...
@@ -376,23 +377,23 @@ class TransactionTests(unittest.TestCase):
...
@@ -376,23 +377,23 @@ class TransactionTests(unittest.TestCase):
from
transaction.tests.common
import
Monkey
from
transaction.tests.common
import
Monkey
from
transaction
import
_transaction
from
transaction
import
_transaction
class
_SP
(
object
):
class
_SP
(
object
):
def
__init__
(
self
,
t
,
index
):
def
__init__
(
self
,
t
xn
,
index
):
self
.
transaction
=
t
self
.
transaction
=
t
xn
self
.
_index
=
index
self
.
_index
=
index
def
__repr__
(
self
):
def
__repr__
(
self
):
return
'_SP: %d'
%
self
.
_index
return
'_SP: %d'
%
self
.
_index
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
_savepoint2index
=
WeakKeyDictionary
()
t
xn
.
_savepoint2index
=
WeakKeyDictionary
()
holdme
=
[]
holdme
=
[]
for
i
in
range
(
10
):
for
i
in
range
(
10
):
sp
=
_SP
(
t
,
i
)
sp
=
_SP
(
t
xn
,
i
)
holdme
.
append
(
sp
)
#prevent gc
holdme
.
append
(
sp
)
#prevent gc
t
.
_savepoint2index
[
sp
]
=
i
t
xn
.
_savepoint2index
[
sp
]
=
i
logger
.
_clear
()
logger
.
_clear
()
t
.
commit
()
t
xn
.
commit
()
self
.
assertEqual
(
list
(
t
.
_savepoint2index
),
[])
self
.
assertEqual
(
list
(
t
xn
.
_savepoint2index
),
[])
def
test_commit_w_beforeCommitHooks
(
self
):
def
test_commit_w_beforeCommitHooks
(
self
):
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
DummyLogger
...
@@ -405,14 +406,14 @@ class TransactionTests(unittest.TestCase):
...
@@ -405,14 +406,14 @@ class TransactionTests(unittest.TestCase):
_hooked2
.
append
((
args
,
kw
))
_hooked2
.
append
((
args
,
kw
))
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
_before_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
t
xn
.
_before_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
t
.
_before_commit
.
append
((
_hook2
,
(),
{}))
t
xn
.
_before_commit
.
append
((
_hook2
,
(),
{}))
logger
.
_clear
()
logger
.
_clear
()
t
.
commit
()
t
xn
.
commit
()
self
.
assertEqual
(
_hooked1
,
[((
'one'
,),
{
'uno'
:
1
})])
self
.
assertEqual
(
_hooked1
,
[((
'one'
,),
{
'uno'
:
1
})])
self
.
assertEqual
(
_hooked2
,
[((),
{})])
self
.
assertEqual
(
_hooked2
,
[((),
{})])
self
.
assertEqual
(
t
.
_before_commit
,
[])
self
.
assertEqual
(
t
xn
.
_before_commit
,
[])
def
test_commit_w_synchronizers
(
self
):
def
test_commit_w_synchronizers
(
self
):
from
transaction.weakset
import
WeakSet
from
transaction.weakset
import
WeakSet
...
@@ -431,12 +432,12 @@ class TransactionTests(unittest.TestCase):
...
@@ -431,12 +432,12 @@ class TransactionTests(unittest.TestCase):
ws
.
add
(
synch
)
ws
.
add
(
synch
)
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
(
synchronizers
=
ws
)
t
xn
=
self
.
_makeOne
(
synchronizers
=
ws
)
logger
.
_clear
()
logger
.
_clear
()
t
.
commit
()
t
xn
.
commit
()
for
synch
in
synchs
:
for
synch
in
synchs
:
self
.
assertTrue
(
synch
.
_before
is
t
)
self
.
assertTrue
(
synch
.
_before
is
t
xn
)
self
.
assertTrue
(
synch
.
_after
is
t
)
self
.
assertTrue
(
synch
.
_after
is
t
xn
)
def
test_commit_w_afterCommitHooks
(
self
):
def
test_commit_w_afterCommitHooks
(
self
):
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
DummyLogger
...
@@ -449,14 +450,14 @@ class TransactionTests(unittest.TestCase):
...
@@ -449,14 +450,14 @@ class TransactionTests(unittest.TestCase):
_hooked2
.
append
((
args
,
kw
))
_hooked2
.
append
((
args
,
kw
))
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
_after_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
t
xn
.
_after_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
t
.
_after_commit
.
append
((
_hook2
,
(),
{}))
t
xn
.
_after_commit
.
append
((
_hook2
,
(),
{}))
logger
.
_clear
()
logger
.
_clear
()
t
.
commit
()
t
xn
.
commit
()
self
.
assertEqual
(
_hooked1
,
[((
True
,
'one'
,),
{
'uno'
:
1
})])
self
.
assertEqual
(
_hooked1
,
[((
True
,
'one'
,),
{
'uno'
:
1
})])
self
.
assertEqual
(
_hooked2
,
[((
True
,),
{})])
self
.
assertEqual
(
_hooked2
,
[((
True
,),
{})])
self
.
assertEqual
(
t
.
_after_commit
,
[])
self
.
assertEqual
(
t
xn
.
_after_commit
,
[])
def
test_commit_error_w_afterCompleteHooks
(
self
):
def
test_commit_error_w_afterCompleteHooks
(
self
):
from
transaction
import
_transaction
from
transaction
import
_transaction
...
@@ -476,16 +477,16 @@ class TransactionTests(unittest.TestCase):
...
@@ -476,16 +477,16 @@ class TransactionTests(unittest.TestCase):
_hooked2
.
append
((
args
,
kw
))
_hooked2
.
append
((
args
,
kw
))
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
t
.
_after_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
t
xn
.
_after_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
t
.
_after_commit
.
append
((
_hook2
,
(),
{}))
t
xn
.
_after_commit
.
append
((
_hook2
,
(),
{}))
t
.
_resources
.
append
(
broken
)
t
xn
.
_resources
.
append
(
broken
)
t
.
_resources
.
append
(
resource
)
t
xn
.
_resources
.
append
(
resource
)
logger
.
_clear
()
logger
.
_clear
()
self
.
assertRaises
(
ValueError
,
t
.
commit
)
self
.
assertRaises
(
ValueError
,
t
xn
.
commit
)
self
.
assertEqual
(
_hooked1
,
[((
False
,
'one'
,),
{
'uno'
:
1
})])
self
.
assertEqual
(
_hooked1
,
[((
False
,
'one'
,),
{
'uno'
:
1
})])
self
.
assertEqual
(
_hooked2
,
[((
False
,),
{})])
self
.
assertEqual
(
_hooked2
,
[((
False
,),
{})])
self
.
assertEqual
(
t
.
_after_commit
,
[])
self
.
assertEqual
(
t
xn
.
_after_commit
,
[])
self
.
assertTrue
(
resource
.
_b
)
self
.
assertTrue
(
resource
.
_b
)
self
.
assertFalse
(
resource
.
_c
)
self
.
assertFalse
(
resource
.
_c
)
self
.
assertFalse
(
resource
.
_v
)
self
.
assertFalse
(
resource
.
_v
)
...
@@ -516,13 +517,13 @@ class TransactionTests(unittest.TestCase):
...
@@ -516,13 +517,13 @@ class TransactionTests(unittest.TestCase):
broken
=
BrokenResource
()
broken
=
BrokenResource
()
logger
=
DummyLogger
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
(
synchronizers
=
ws
)
t
xn
=
self
.
_makeOne
(
synchronizers
=
ws
)
logger
.
_clear
()
logger
.
_clear
()
t
.
_resources
.
append
(
broken
)
t
xn
.
_resources
.
append
(
broken
)
self
.
assertRaises
(
ValueError
,
t
.
commit
)
self
.
assertRaises
(
ValueError
,
t
xn
.
commit
)
for
synch
in
synchs
:
for
synch
in
synchs
:
self
.
assertTrue
(
synch
.
_before
is
t
)
self
.
assertTrue
(
synch
.
_before
is
t
xn
)
self
.
assertTrue
(
synch
.
_after
is
t
)
#called in _cleanup
self
.
assertTrue
(
synch
.
_after
is
t
xn
)
#called in _cleanup
def
test_getBeforeCommitHooks_empty
(
self
):
def
test_getBeforeCommitHooks_empty
(
self
):
txn
=
self
.
_makeOne
()
txn
=
self
.
_makeOne
()
...
@@ -731,15 +732,193 @@ class TransactionTests(unittest.TestCase):
...
@@ -731,15 +732,193 @@ class TransactionTests(unittest.TestCase):
self
.
assertTrue
(
logger
.
_log
[
2
][
1
].
startswith
(
self
.
assertTrue
(
logger
.
_log
[
2
][
1
].
startswith
(
'A storage error occurred'
))
'A storage error occurred'
))
def
test_abort_wo_savepoints_wo_hooks_wo_synchronizers
(
self
):
from
transaction._transaction
import
Status
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
Monkey
from
transaction
import
_transaction
class
_Mgr
(
object
):
def
__init__
(
self
,
txn
):
self
.
_txn
=
txn
def
free
(
self
,
txn
):
assert
txn
is
self
.
_txn
self
.
_txn
=
None
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
txn
=
self
.
_makeOne
()
logger
.
_clear
()
mgr
=
txn
.
_manager
=
_Mgr
(
txn
)
txn
.
abort
()
self
.
assertEqual
(
txn
.
status
,
Status
.
ACTIVE
)
self
.
assertTrue
(
mgr
.
_txn
is
None
)
self
.
assertEqual
(
logger
.
_log
[
0
][
0
],
'debug'
)
self
.
assertEqual
(
logger
.
_log
[
0
][
1
],
'abort'
)
def
test_abort_w_savepoints
(
self
):
from
weakref
import
WeakKeyDictionary
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
Monkey
from
transaction
import
_transaction
class
_SP
(
object
):
def
__init__
(
self
,
txn
,
index
):
self
.
transaction
=
txn
self
.
_index
=
index
def
__repr__
(
self
):
return
'_SP: %d'
%
self
.
_index
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
txn
=
self
.
_makeOne
()
txn
.
_savepoint2index
=
WeakKeyDictionary
()
holdme
=
[]
for
i
in
range
(
10
):
sp
=
_SP
(
txn
,
i
)
holdme
.
append
(
sp
)
#prevent gc
txn
.
_savepoint2index
[
sp
]
=
i
logger
.
_clear
()
txn
.
abort
()
self
.
assertEqual
(
list
(
txn
.
_savepoint2index
),
[])
def
test_abort_w_beforeCommitHooks
(
self
):
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
Monkey
from
transaction
import
_transaction
_hooked1
,
_hooked2
=
[],
[]
def
_hook1
(
*
args
,
**
kw
):
_hooked1
.
append
((
args
,
kw
))
def
_hook2
(
*
args
,
**
kw
):
_hooked2
.
append
((
args
,
kw
))
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
txn
=
self
.
_makeOne
()
txn
.
_before_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
txn
.
_before_commit
.
append
((
_hook2
,
(),
{}))
logger
.
_clear
()
txn
.
abort
()
self
.
assertEqual
(
_hooked1
,
[])
self
.
assertEqual
(
_hooked2
,
[])
# Hooks are neither called nor cleared on abort
self
.
assertEqual
(
list
(
txn
.
getBeforeCommitHooks
()),
[(
_hook1
,
(
'one'
,),
{
'uno'
:
1
}),
(
_hook2
,
(),
{})])
def
test_abort_w_synchronizers
(
self
):
from
transaction.weakset
import
WeakSet
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
Monkey
from
transaction
import
_transaction
class
_Synch
(
object
):
_before
=
_after
=
False
def
beforeCompletion
(
self
,
txn
):
self
.
_before
=
txn
def
afterCompletion
(
self
,
txn
):
self
.
_after
=
txn
synchs
=
[
_Synch
(),
_Synch
(),
_Synch
()]
ws
=
WeakSet
()
for
synch
in
synchs
:
ws
.
add
(
synch
)
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
txn
=
self
.
_makeOne
(
synchronizers
=
ws
)
logger
.
_clear
()
txn
.
abort
()
for
synch
in
synchs
:
self
.
assertTrue
(
synch
.
_before
is
txn
)
self
.
assertTrue
(
synch
.
_after
is
txn
)
def
test_abort_w_afterCommitHooks
(
self
):
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
Monkey
from
transaction
import
_transaction
_hooked1
,
_hooked2
=
[],
[]
def
_hook1
(
*
args
,
**
kw
):
_hooked1
.
append
((
args
,
kw
))
def
_hook2
(
*
args
,
**
kw
):
_hooked2
.
append
((
args
,
kw
))
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
txn
=
self
.
_makeOne
()
txn
.
_after_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
txn
.
_after_commit
.
append
((
_hook2
,
(),
{}))
logger
.
_clear
()
txn
.
abort
()
# Hooks are neither called nor cleared on abort
self
.
assertEqual
(
_hooked1
,
[])
self
.
assertEqual
(
_hooked2
,
[])
self
.
assertEqual
(
list
(
txn
.
getAfterCommitHooks
()),
[(
_hook1
,
(
'one'
,),
{
'uno'
:
1
}),
(
_hook2
,
(),
{})])
def
test_abort_error_w_afterCompleteHooks
(
self
):
from
transaction
import
_transaction
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
Monkey
class
BrokenResource
(
object
):
def
sortKey
(
self
):
return
'zzz'
def
abort
(
self
,
txn
):
raise
ValueError
(
'test'
)
broken
=
BrokenResource
()
resource
=
Resource
(
'aaa'
)
_hooked1
,
_hooked2
=
[],
[]
def
_hook1
(
*
args
,
**
kw
):
_hooked1
.
append
((
args
,
kw
))
def
_hook2
(
*
args
,
**
kw
):
_hooked2
.
append
((
args
,
kw
))
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
txn
=
self
.
_makeOne
()
txn
.
_after_commit
.
append
((
_hook1
,
(
'one'
,),
{
'uno'
:
1
}))
txn
.
_after_commit
.
append
((
_hook2
,
(),
{}))
txn
.
_resources
.
append
(
broken
)
txn
.
_resources
.
append
(
resource
)
logger
.
_clear
()
self
.
assertRaises
(
ValueError
,
txn
.
abort
)
# Hooks are neither called nor cleared on abort
self
.
assertEqual
(
_hooked1
,
[])
self
.
assertEqual
(
_hooked2
,
[])
self
.
assertEqual
(
list
(
txn
.
getAfterCommitHooks
()),
[(
_hook1
,
(
'one'
,),
{
'uno'
:
1
}),
(
_hook2
,
(),
{})])
self
.
assertTrue
(
resource
.
_a
)
self
.
assertFalse
(
resource
.
_x
)
def
test_abort_error_w_synchronizers
(
self
):
from
transaction.weakset
import
WeakSet
from
transaction.tests.common
import
DummyLogger
from
transaction.tests.common
import
Monkey
from
transaction
import
_transaction
class
_Synch
(
object
):
_before
=
_after
=
False
def
beforeCompletion
(
self
,
txn
):
self
.
_before
=
txn
def
afterCompletion
(
self
,
txn
):
self
.
_after
=
txn
synchs
=
[
_Synch
(),
_Synch
(),
_Synch
()]
ws
=
WeakSet
()
for
synch
in
synchs
:
ws
.
add
(
synch
)
class
BrokenResource
(
object
):
def
sortKey
(
self
):
return
'zzz'
def
abort
(
self
,
txn
):
raise
ValueError
(
'test'
)
broken
=
BrokenResource
()
logger
=
DummyLogger
()
with
Monkey
(
_transaction
,
_LOGGER
=
logger
):
t
=
self
.
_makeOne
(
synchronizers
=
ws
)
logger
.
_clear
()
t
.
_resources
.
append
(
broken
)
self
.
assertRaises
(
ValueError
,
t
.
abort
)
for
synch
in
synchs
:
self
.
assertTrue
(
synch
.
_before
is
t
)
self
.
assertTrue
(
synch
.
_after
is
t
)
#called in _cleanup
def
test_note
(
self
):
def
test_note
(
self
):
t
=
self
.
_makeOne
()
t
xn
=
self
.
_makeOne
()
try
:
try
:
t
.
note
(
'This is a note.'
)
t
xn
.
note
(
'This is a note.'
)
self
.
assertEqual
(
t
.
description
,
'This is a note.'
)
self
.
assertEqual
(
t
xn
.
description
,
'This is a note.'
)
t
.
note
(
'Another.'
)
t
xn
.
note
(
'Another.'
)
self
.
assertEqual
(
t
.
description
,
'This is a note.
\
n
Another.'
)
self
.
assertEqual
(
t
xn
.
description
,
'This is a note.
\
n
Another.'
)
finally
:
finally
:
t
.
abort
()
t
xn
.
abort
()
class
Test_oid_repr
(
unittest
.
TestCase
):
class
Test_oid_repr
(
unittest
.
TestCase
):
...
@@ -773,13 +952,13 @@ class MiscellaneousTests(unittest.TestCase):
...
@@ -773,13 +952,13 @@ class MiscellaneousTests(unittest.TestCase):
from
transaction._transaction
import
DataManagerAdapter
from
transaction._transaction
import
DataManagerAdapter
# The argument to join must be a zodb4 data manager,
# The argument to join must be a zodb4 data manager,
# transaction.interfaces.IDataManager.
# transaction.interfaces.IDataManager.
t
=
Transaction
()
t
xn
=
Transaction
()
dm
=
DataManager
()
dm
=
DataManager
()
t
.
join
(
dm
)
t
xn
.
join
(
dm
)
# The end result is that a data manager adapter is one of the
# The end result is that a data manager adapter is one of the
# transaction's objects:
# transaction's objects:
self
.
assertTrue
(
isinstance
(
t
.
_resources
[
0
],
DataManagerAdapter
))
self
.
assertTrue
(
isinstance
(
t
xn
.
_resources
[
0
],
DataManagerAdapter
))
self
.
assertTrue
(
t
.
_resources
[
0
].
_datamanager
is
dm
)
self
.
assertTrue
(
t
xn
.
_resources
[
0
].
_datamanager
is
dm
)
def
test_bug239086
(
self
):
def
test_bug239086
(
self
):
# The original implementation of thread transaction manager made
# The original implementation of thread transaction manager made
...
@@ -794,17 +973,17 @@ class MiscellaneousTests(unittest.TestCase):
...
@@ -794,17 +973,17 @@ class MiscellaneousTests(unittest.TestCase):
def
__init__
(
self
,
label
):
def
__init__
(
self
,
label
):
self
.
label
=
label
self
.
label
=
label
self
.
log
=
[]
self
.
log
=
[]
def
beforeCompletion
(
self
,
t
):
def
beforeCompletion
(
self
,
t
xn
):
self
.
log
.
append
(
'%s %s'
%
(
self
.
label
,
'before'
))
self
.
log
.
append
(
'%s %s'
%
(
self
.
label
,
'before'
))
def
afterCompletion
(
self
,
t
):
def
afterCompletion
(
self
,
t
xn
):
self
.
log
.
append
(
'%s %s'
%
(
self
.
label
,
'after'
))
self
.
log
.
append
(
'%s %s'
%
(
self
.
label
,
'after'
))
def
newTransaction
(
self
,
t
):
def
newTransaction
(
self
,
t
xn
):
self
.
log
.
append
(
'%s %s'
%
(
self
.
label
,
'new'
))
self
.
log
.
append
(
'%s %s'
%
(
self
.
label
,
'new'
))
def
run_in_thread
(
f
):
def
run_in_thread
(
f
):
t
=
threading
.
Thread
(
target
=
f
)
t
xn
=
threading
.
Thread
(
target
=
f
)
t
.
start
()
t
xn
.
start
()
t
.
join
()
t
xn
.
join
()
sync
=
Sync
(
1
)
sync
=
Sync
(
1
)
@
run_in_thread
@
run_in_thread
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment