| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /** |
| * @fileoverview Tests for the context library. |
| */ |
| |
| var test = require('prova'); |
| var context = require('../../src/context'); |
| var verror = require('../../src/gen-vdl/v.io/v23/verror'); |
| |
| var ctx = context.Context(); |
| |
| test('Root Context', function(assert) { |
| assert.equal(ctx.deadline(), null); |
| assert.equal(ctx.done(), false); |
| assert.end(); |
| }); |
| |
| |
| var key1 = new context.ContextKey(); |
| var key2 = new context.ContextKey(); |
| var vctx1 = ctx.withValue(key1, 'value1'); |
| var vctx2 = vctx1.withValue(key2, 'value2'); |
| |
| test('ValueContext (own value)', function(assert) { |
| assert.equal(vctx1.value(key1), 'value1'); |
| assert.equal(vctx2.value(key2), 'value2'); |
| assert.end(); |
| }); |
| |
| test('ValueContext (parent/child values)', function(assert) { |
| assert.equal(vctx2.value(key1), 'value1'); |
| assert.equal(vctx1.value(key2), null); |
| assert.end(); |
| }); |
| |
| // TODO(bprosnitz) WithValue is not immutable. |
| test.skip('WithValue Immutability', function(assert) { |
| var expectedRes = 99; |
| var vctx3 = vctx2.withValue('key3', { |
| x : expectedRes |
| }); |
| var vctx4 = vctx3.withValue('something', 'something2'); |
| vctx4.value('key3').x = 77; |
| assert.equal(vctx3.value('key3').x, expectedRes, |
| 'Expected to not have changed'); |
| }); |
| |
| test('CancelContext.done', function(assert) { |
| var cctx = ctx.withCancel(); |
| assert.plan(3); |
| |
| assert.equal(cctx.done(), false); |
| cctx.waitUntilDone().catch(onerror); |
| cctx.cancel(); |
| assert.equal(cctx.done(), true); |
| |
| function onerror(error) { |
| assert.ok(error instanceof verror.CanceledError); |
| } |
| }); |
| |
| test('CancelContext.finish', function(assert) { |
| var cctx = ctx.withCancel(); |
| assert.plan(3); |
| |
| assert.equal(cctx.done(), false); |
| cctx.waitUntilDone().then(ondone); |
| cctx.finish(); |
| assert.equal(cctx.done(), true); |
| |
| function ondone(arg) { |
| assert.equal(arg, undefined); |
| } |
| }); |
| |
| test('CancelContext (parent cancellation)', function(assert) { |
| var cctx1 = ctx.withCancel(); |
| var cctx2 = cctx1.withCancel(); |
| assert.plan(4); |
| |
| cctx1.waitUntilDone().catch(onerror); |
| cctx2.waitUntilDone().catch(onerror); |
| cctx1.cancel(); |
| assert.equal(cctx1.done(), true); |
| assert.equal(cctx2.done(), true); |
| |
| function onerror(error) { |
| assert.ok(error instanceof verror.CanceledError); |
| } |
| }); |
| |
| test('CancelContext (ancestor cancellation)', function(assert) { |
| var cctx1 = ctx.withCancel(); |
| cctx1.withValue(context.ContextKey(), 'value'); |
| var cctx2 = cctx1.withCancel(); |
| assert.plan(4); |
| |
| cctx1.waitUntilDone().catch(onerror); |
| cctx2.waitUntilDone().catch(onerror); |
| cctx1.cancel(); |
| assert.equal(cctx1.done(), true); |
| assert.equal(cctx2.done(), true); |
| |
| function onerror(error) { |
| assert.ok(error instanceof verror.CanceledError); |
| } |
| }); |
| |
| test('DeadlineContext', function(assert) { |
| var dctx = ctx.withDeadline(Date.now() + 1); |
| assert.plan(2); |
| dctx.waitUntilDone().catch(onerror); |
| |
| function onerror(error) { |
| assert.ok(error instanceof verror.TimeoutError); |
| assert.equal(dctx.done(), true); |
| } |
| }); |
| |
| test('DeadlineContext (parent cancellation)', function(assert) { |
| var cctx = ctx.withCancel(); |
| var dctx = cctx.withDeadline(Date.now() + 1000 * 3600); |
| assert.plan(4); |
| |
| cctx.waitUntilDone().catch(onerror); |
| dctx.waitUntilDone().catch(onerror); |
| cctx.cancel(); |
| assert.equal(cctx.done(), true); |
| assert.equal(dctx.done(), true); |
| |
| function onerror(error) { |
| assert.ok(error instanceof verror.CanceledError); |
| } |
| }); |
| |
| test('DeadlineContext (child cancellation)', function(assert) { |
| var dctx = ctx.withDeadline(Date.now() + 1); |
| var cctx = dctx.withCancel(); |
| |
| assert.plan(2); |
| |
| cctx.waitUntilDone().catch(onerror); |
| dctx.waitUntilDone().catch(onerror); |
| |
| function onerror(error) { |
| assert.ok(error instanceof verror.TimeoutError); |
| } |
| }); |