From 6320fd72c311a65547adeb89e37c80c585f1c2b8 Mon Sep 17 00:00:00 2001 From: Christopher Willis-Ford Date: Thu, 8 Jun 2017 11:16:29 -0700 Subject: [PATCH] Add test for clone cleanup This new test verifies that clones and their associated threads are cleaned up properly by the `delete this clone` block. The clones run two stacks each: one which waits and then deletes the clone, and another which includes a `forever` loop: this is to verify that the thread running the `forever` loop is ended when the clone itself is deleted. The project does this with two batches of clones to ensure there are no problems with reusing array indices previously occupied by now-removed threads or clones. --- test/fixtures/clone-cleanup.sb2 | Bin 0 -> 54947 bytes test/integration/clone-cleanup.js | 96 ++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 test/fixtures/clone-cleanup.sb2 create mode 100644 test/integration/clone-cleanup.js diff --git a/test/fixtures/clone-cleanup.sb2 b/test/fixtures/clone-cleanup.sb2 new file mode 100644 index 0000000000000000000000000000000000000000..61baeb7f2def6182f3372a4d89edcee7bf23db88 GIT binary patch literal 54947 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

ZA_ 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

xPuw%4EP#DQjg(Qp1B<;*+zib$#yev7@Iz)0s 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 M4;o(Z)~9d(55ztL+yDRo literal 0 HcmV?d00001 diff --git a/test/integration/clone-cleanup.js b/test/integration/clone-cleanup.js new file mode 100644 index 000000000..bfecd6d77 --- /dev/null +++ b/test/integration/clone-cleanup.js @@ -0,0 +1,96 @@ +const path = require('path'); +const test = require('tap').test; +const attachTestStorage = require('../fixtures/attach-test-storage'); +const extract = require('../fixtures/extract'); +const VirtualMachine = require('../../src/index'); + +const projectUri = path.resolve(__dirname, '../fixtures/clone-cleanup.sb2'); +const project = extract(projectUri); + +test('clone-cleanup', t => { + const vm = new VirtualMachine(); + attachTestStorage(vm); + + /** + * Track which step of the project is currently under test. + * @type {number} + */ + let testStep = -1; + + /** + * We test using setInterval; track the interval ID here so we can cancel it. + * @type {object} + */ + let testInterval = null; + + const verifyCounts = (expectedClones, extraThreads) => { + // stage plus one sprite, plus clones + t.strictEqual(vm.runtime.targets.length, 2 + expectedClones, + `target count at step ${testStep}`); + + // the stage should never have any clones + t.strictEqual(vm.runtime.targets[0].sprite.clones.length, 1, + `stage clone count at step ${testStep}`); + + // check sprite clone count (+1 for original) + t.strictEqual(vm.runtime.targets[1].sprite.clones.length, 1 + expectedClones, + `sprite clone count at step ${testStep}`); + + // thread count isn't directly tied to clone count since threads can end + t.strictEqual(vm.runtime.threads.length, extraThreads + (2 * expectedClones), + `thread count at step ${testStep}`); + }; + + const testNextStep = () => { + ++testStep; + switch (testStep) { + case 0: + // Project has started, main thread running, no clones yet + verifyCounts(0, 1); + break; + + case 1: + // 10 clones have been created, main thread still running + verifyCounts(10, 1); + break; + + case 2: + // The first batch of clones has deleted themselves; main thread still running + verifyCounts(0, 1); + break; + + case 3: + // The second batch of clones has been created and the main thread has ended + verifyCounts(10, 0); + break; + + case 4: + // The second batch of clones has deleted themselves; everything is finished + verifyCounts(0, 0); + + clearInterval(testInterval); + t.end(); + process.nextTick(process.exit); + break; + } + }; + + // Start VM, load project, and run + t.doesNotThrow(() => { + vm.start(); + vm.clear(); + vm.setCompatibilityMode(false); + vm.setTurboMode(false); + vm.loadProject(project).then(() => { + + // Verify initial state: no clones, nothing running ("step -1") + verifyCounts(0, 0); + + vm.greenFlag(); + + // Every second, advance the testing step + testInterval = setInterval(testNextStep, 1000); + }); + }); + +});