diff options
| author | Martin Geubelle <mge@odoo.com> | 2018-06-22 13:24:13 +0200 |
|---|---|---|
| committer | Christophe Matthieu <chm@odoo.com> | 2018-08-13 17:09:28 +0200 |
| commit | 7f4b4f86bdb8e8b70696a54f22ac64d2c549aeef (patch) | |
| tree | afcdcd2d1d86b8df97f795537ec624b66822d0f0 /addons/web/static/tests/core/concurrency_tests.js | |
| parent | 971629b9fe40911c3a9765c9fb746ea1c55d3560 (diff) | |
[IMP] web: add MutexedDropPrevious in concurrency
This new helper is meant to solve the following use case: serialize a number
of concurrent rpcs while skipping the rpcs that arrive in between the mutex.
Diffstat (limited to 'addons/web/static/tests/core/concurrency_tests.js')
| -rw-r--r-- | addons/web/static/tests/core/concurrency_tests.js | 229 |
1 files changed, 226 insertions, 3 deletions
diff --git a/addons/web/static/tests/core/concurrency_tests.js b/addons/web/static/tests/core/concurrency_tests.js index 62b9f90bcfb..5b1e4c505ac 100644 --- a/addons/web/static/tests/core/concurrency_tests.js +++ b/addons/web/static/tests/core/concurrency_tests.js @@ -165,7 +165,6 @@ QUnit.module('core', {}, function () { // d2 is resolved assert.ok(done2); assert.ok(!fail2); - }); QUnit.test('DropMisordered: resolve all correctly ordered, async', function (assert) { @@ -197,9 +196,9 @@ QUnit.module('core', {}, function () { done1 = false, done2 = false, fail1 = false, fail2 = false; - var d1 = $.Deferred(), + var d1 = $.Deferred(), d2 = $.Deferred(); - + dm.add(d1).done(function () { done1 = true; }) .fail(function () { fail1 = true; }); dm.add(d2).done(function () { done2 = true; }) @@ -251,6 +250,230 @@ QUnit.module('core', {}, function () { }, 30); }); + QUnit.test('MutexedDropPrevious: simple', function (assert) { + assert.expect(3); + + var m = new concurrency.MutexedDropPrevious(); + + var d1 = $.Deferred(); + var p1 = m.exec(function () { return d1; }).then(function (result) { + assert.strictEqual(result, 'd1'); + }); + + assert.strictEqual(p1.state(), "pending"); + + d1.resolve('d1'); + assert.strictEqual(p1.state(), "resolved"); + }); + + QUnit.test('MutexedDropPrevious: 2 arrives after 1 resolution', function (assert) { + assert.expect(6); + + var m = new concurrency.MutexedDropPrevious(); + + var d1 = $.Deferred(); + var p1 = m.exec(function () { return d1; }).then(function (result) { + assert.strictEqual(result, 'd1'); + }); + + assert.strictEqual(p1.state(), "pending"); + + d1.resolve('d1'); + assert.strictEqual(p1.state(), "resolved"); + + var d2 = $.Deferred(); + var p2 = m.exec(function () { return d2; }).then(function (result) { + assert.strictEqual(result, 'd2'); + }); + + assert.strictEqual(p2.state(), "pending"); + + d2.resolve('d2'); + assert.strictEqual(p2.state(), "resolved"); + }); + + QUnit.test('MutexedDropPrevious: 1 does not return a deferred', function (assert) { + assert.expect(5); + + var m = new concurrency.MutexedDropPrevious(); + + var p1 = m.exec(function () { return 42; }).then(function (result) { + assert.strictEqual(result, 42); + }); + + assert.strictEqual(p1.state(), "resolved"); + + var d2 = $.Deferred(); + var p2 = m.exec(function () { return d2; }).then(function (result) { + assert.strictEqual(result, 'd2'); + }); + + assert.strictEqual(p2.state(), "pending"); + + d2.resolve('d2'); + assert.strictEqual(p2.state(), "resolved"); + }); + + QUnit.test('MutexedDropPrevious: 2 arrives before 1 resolution', function (assert) { + assert.expect(13); + + var m = new concurrency.MutexedDropPrevious(); + + var d1 = $.Deferred(); + var d2 = $.Deferred(); + + var p1 = m.exec(function () { + assert.step('p1'); + return d1; + }); + assert.strictEqual(p1.state(), "pending"); + + var p2 = m.exec(function () { + assert.step('p2'); + return d2; + }).then(function (result) { + assert.strictEqual(result, 'd2'); + }); + + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "pending"); + + assert.step('d1 resolved'); + d1.resolve('d1'); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "pending"); + + assert.step('d2 resolved'); + d2.resolve('d2'); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "resolved"); + + assert.verifySteps(['p1', 'd1 resolved', 'p2', 'd2 resolved']); + }); + + QUnit.test('MutexedDropPrevious: 3 arrives before 2 initialization', function (assert) { + assert.expect(13); + + var m = new concurrency.MutexedDropPrevious(); + + var d1 = $.Deferred(); + var d2 = $.Deferred(); + var d3 = $.Deferred(); + + var p1 = m.exec(function () { return d1; }); + assert.strictEqual(p1.state(), "pending"); + + var p2 = m.exec(function () { + assert.ok(false, "should not execute this function"); + return d2; + }); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "pending"); + + var p3 = m.exec(function () { return d3; }).then(function (result) { + assert.strictEqual(result, 'd3'); + }); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "rejected"); + assert.strictEqual(p3.state(), "pending"); + + d1.resolve('d1'); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "rejected"); + assert.strictEqual(p3.state(), "pending"); + + d3.resolve('d3'); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "rejected"); + assert.strictEqual(p3.state(), "resolved"); + }); + + QUnit.test('MutexedDropPrevious: 3 arrives after 2 initialization', function (assert) { + assert.expect(19); + + var m = new concurrency.MutexedDropPrevious(); + + var d1 = $.Deferred(); + var d2 = $.Deferred(); + var d3 = $.Deferred(); + + var p1 = m.exec(function () { + assert.step('p1'); + return d1; + }); + assert.strictEqual(p1.state(), "pending"); + + var p2 = m.exec(function () { + assert.step('p2'); + return d2; + }); + + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "pending"); + + assert.step('d1 resolved'); + d1.resolve('d1'); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "pending"); + + var p3 = m.exec(function () { + assert.step('p3'); + return d3; + }).then(function (result) { + assert.strictEqual(result, 'd3'); + }); + + assert.step('d2 resolved'); + d2.resolve('d2'); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "rejected"); + assert.strictEqual(p3.state(), "pending"); + + assert.step('d3 resolved'); + d3.resolve('d3'); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "rejected"); + assert.strictEqual(p3.state(), "resolved"); + + assert.verifySteps(['p1', 'd1 resolved', 'p2', 'd2 resolved', 'p3', 'd3 resolved']); + }); + + QUnit.test('MutexedDropPrevious: 2 in then of 1 with 3', function (assert) { + assert.expect(6); + + var m = new concurrency.MutexedDropPrevious(); + + var d1 = $.Deferred(); + var d2 = $.Deferred(); + var d3 = $.Deferred(); + var p3; + + var p1 = m.exec(function () { return d1; }) + .always(function () { + p3 = m.exec(function () { + return d3; + }).then(function (result) { + assert.strictEqual(result, 'd3'); + }); + return p3; + }); + + assert.strictEqual(p1.state(), "pending"); + + var p2 = m.exec(function () { + assert.ok(false, "should not execute this function"); + return d2; + }); + assert.strictEqual(p1.state(), "rejected"); + assert.strictEqual(p2.state(), "rejected"); + + d1.resolve('d1'); + assert.strictEqual(p3.state(), "pending"); + + d3.resolve('d3'); + assert.strictEqual(p3.state(), "resolved"); + }); + }); });
\ No newline at end of file |
