diff options
Diffstat (limited to 'toolkit/components/ctypes/tests/unit/test_finalizer.js')
-rw-r--r-- | toolkit/components/ctypes/tests/unit/test_finalizer.js | 452 |
1 files changed, 0 insertions, 452 deletions
diff --git a/toolkit/components/ctypes/tests/unit/test_finalizer.js b/toolkit/components/ctypes/tests/unit/test_finalizer.js deleted file mode 100644 index adfb4c4b4..000000000 --- a/toolkit/components/ctypes/tests/unit/test_finalizer.js +++ /dev/null @@ -1,452 +0,0 @@ -var TEST_SIZE = 100; - -function run_test() -{ - let library = open_ctypes_test_lib(); - - let start = library.declare("test_finalizer_start", ctypes.default_abi, - ctypes.void_t, - ctypes.size_t); - let stop = library.declare("test_finalizer_stop", ctypes.default_abi, - ctypes.void_t); - let status = library.declare("test_finalizer_resource_is_acquired", - ctypes.default_abi, - ctypes.bool, - ctypes.size_t); - let released = function released(value, witness) { - return witness == undefined; - }; - - let samples = []; - samples.push( - { - name: "size_t", - acquire: library.declare("test_finalizer_acq_size_t", - ctypes.default_abi, - ctypes.size_t, - ctypes.size_t), - release: library.declare("test_finalizer_rel_size_t", - ctypes.default_abi, - ctypes.void_t, - ctypes.size_t), - compare: library.declare("test_finalizer_cmp_size_t", - ctypes.default_abi, - ctypes.bool, - ctypes.size_t, - ctypes.size_t), - status: status, - released: released - }); - samples.push( - { - name: "size_t", - acquire: library.declare("test_finalizer_acq_size_t", - ctypes.default_abi, - ctypes.size_t, - ctypes.size_t), - release: library.declare("test_finalizer_rel_size_t_set_errno", - ctypes.default_abi, - ctypes.void_t, - ctypes.size_t), - compare: library.declare("test_finalizer_cmp_size_t", - ctypes.default_abi, - ctypes.bool, - ctypes.size_t, - ctypes.size_t), - status: status, - released: released - }); - samples.push( - { - name: "int32_t", - acquire: library.declare("test_finalizer_acq_int32_t", - ctypes.default_abi, - ctypes.int32_t, - ctypes.size_t), - release: library.declare("test_finalizer_rel_int32_t", - ctypes.default_abi, - ctypes.void_t, - ctypes.int32_t), - compare: library.declare("test_finalizer_cmp_int32_t", - ctypes.default_abi, - ctypes.bool, - ctypes.int32_t, - ctypes.int32_t), - status: status, - released: released - } - ); - samples.push( - { - name: "int64_t", - acquire: library.declare("test_finalizer_acq_int64_t", - ctypes.default_abi, - ctypes.int64_t, - ctypes.size_t), - release: library.declare("test_finalizer_rel_int64_t", - ctypes.default_abi, - ctypes.void_t, - ctypes.int64_t), - compare: library.declare("test_finalizer_cmp_int64_t", - ctypes.default_abi, - ctypes.bool, - ctypes.int64_t, - ctypes.int64_t), - status: status, - released: released - } - ); - samples.push( - { - name: "ptr", - acquire: library.declare("test_finalizer_acq_ptr_t", - ctypes.default_abi, - ctypes.PointerType(ctypes.void_t), - ctypes.size_t), - release: library.declare("test_finalizer_rel_ptr_t", - ctypes.default_abi, - ctypes.void_t, - ctypes.PointerType(ctypes.void_t)), - compare: library.declare("test_finalizer_cmp_ptr_t", - ctypes.default_abi, - ctypes.bool, - ctypes.void_t.ptr, - ctypes.void_t.ptr), - status: status, - released: released - } - ); - samples.push( - { - name: "string", - acquire: library.declare("test_finalizer_acq_string_t", - ctypes.default_abi, - ctypes.char.ptr, - ctypes.int), - release: library.declare("test_finalizer_rel_string_t", - ctypes.default_abi, - ctypes.void_t, - ctypes.char.ptr), - compare: library.declare("test_finalizer_cmp_string_t", - ctypes.default_abi, - ctypes.bool, - ctypes.char.ptr, - ctypes.char.ptr), - status: status, - released: released - } - ); - const rect_t = new ctypes.StructType("myRECT", - [{ top : ctypes.int32_t }, - { left : ctypes.int32_t }, - { bottom: ctypes.int32_t }, - { right : ctypes.int32_t }]); - samples.push( - { - name: "struct", - acquire: library.declare("test_finalizer_acq_struct_t", - ctypes.default_abi, - rect_t, - ctypes.int), - release: library.declare("test_finalizer_rel_struct_t", - ctypes.default_abi, - ctypes.void_t, - rect_t), - compare: library.declare("test_finalizer_cmp_struct_t", - ctypes.default_abi, - ctypes.bool, - rect_t, - rect_t), - status: status, - released: released - } - ); - samples.push( - { - name: "size_t, release returns size_t", - acquire: library.declare("test_finalizer_acq_size_t", - ctypes.default_abi, - ctypes.size_t, - ctypes.size_t), - release: library.declare("test_finalizer_rel_size_t_return_size_t", - ctypes.default_abi, - ctypes.size_t, - ctypes.size_t), - compare: library.declare("test_finalizer_cmp_size_t", - ctypes.default_abi, - ctypes.bool, - ctypes.size_t, - ctypes.size_t), - status: status, - released: function released_eq(i, witness) { - return i == witness; - } - } - ); - samples.push( - { - name: "size_t, release returns myRECT", - acquire: library.declare("test_finalizer_acq_size_t", - ctypes.default_abi, - ctypes.size_t, - ctypes.size_t), - release: library.declare("test_finalizer_rel_size_t_return_struct_t", - ctypes.default_abi, - rect_t, - ctypes.size_t), - compare: library.declare("test_finalizer_cmp_size_t", - ctypes.default_abi, - ctypes.bool, - ctypes.size_t, - ctypes.size_t), - status: status, - released: function released_rect_eq(i, witness) { - return witness.top == i - && witness.bottom == i - && witness.left == i - && witness.right == i; - } - } - ); - samples.push( - { - name: "using null", - acquire: library.declare("test_finalizer_acq_null_t", - ctypes.default_abi, - ctypes.PointerType(ctypes.void_t), - ctypes.size_t), - release: library.declare("test_finalizer_rel_null_t", - ctypes.default_abi, - ctypes.void_t, - ctypes.PointerType(ctypes.void_t)), - status: library.declare("test_finalizer_null_resource_is_acquired", - ctypes.default_abi, - ctypes.bool, - ctypes.size_t), - compare: library.declare("test_finalizer_cmp_null_t", - ctypes.default_abi, - ctypes.bool, - ctypes.void_t.ptr, - ctypes.void_t.ptr), - released: released - } - ); - - let tester = new ResourceTester(start, stop); - samples.forEach( - function run_sample(sample) { - dump("Executing finalization test for data " + sample.name + "\n"); - tester.launch(TEST_SIZE, test_executing_finalizers, sample); - tester.launch(TEST_SIZE, test_do_not_execute_finalizers_on_referenced_stuff, sample); - tester.launch(TEST_SIZE, test_executing_dispose, sample); - tester.launch(TEST_SIZE, test_executing_forget, sample); - tester.launch(TEST_SIZE, test_result_dispose, sample); - dump("Successfully completed finalization test for data " + sample.name + "\n"); - } - ); - - /* - * Following test deactivated: Cycle collection never takes place - * (see bug 727371) - tester.launch(TEST_SIZE, test_cycles, samples[0]); - */ - dump("Successfully completed all finalization tests\n"); - library.close(); -} - -// If only I could have Promises to test this :) -// There is only so much we can do at this stage, -// if we want to avoid tests overlapping. -function test_cycles(size, tc) { - // Now, restart this with unreferenced cycles - for (i = 0; i < size/2; ++i) { - let a = { - a: ctypes.CDataFinalizer(tc.acquire(i*2), tc.release), - b: { - b: ctypes.CDataFinalizer(tc.acquire(i*2+1), tc.release) - } - }; - a.b.a = a; - } - do_test_pending(); - - Components.utils.schedulePreciseGC( - function after_gc() { - // Check that _something_ has been finalized - do_check_true(count_finalized(size, tc) > 0); - do_test_finished(); - } - ); - - do_timeout(10000, do_throw); -} - - -function count_finalized(size, tc) { - let finalizedItems = 0; - for (let i = 0; i < size; ++i) { - if (!tc.status(i)) { - ++finalizedItems; - } - } - return finalizedItems; -} - -/** - * Test: - * - that (some) finalizers are executed; - * - that no finalizer is executed twice (this is done on the C side). - */ -function test_executing_finalizers(size, tc, cleanup) -{ - dump("test_executing_finalizers " + tc.name + "\n"); - // Allocate |size| items without references - for (let i = 0; i < size; ++i) { - cleanup.add(ctypes.CDataFinalizer(tc.acquire(i), tc.release)); - } - trigger_gc(); // This should trigger some finalizations, hopefully all - - // Check that _something_ has been finalized - do_check_true(count_finalized(size, tc) > 0); -} - -/** - * Check that - * - |dispose| returns the proper result - */ -function test_result_dispose(size, tc, cleanup) { - dump("test_result_dispose " + tc.name + "\n"); - let ref = []; - // Allocate |size| items with references - for (let i = 0; i < size; ++i) { - let value = ctypes.CDataFinalizer(tc.acquire(i), tc.release); - cleanup.add(value); - ref.push(value); - } - do_check_eq(count_finalized(size, tc), 0); - - for (i = 0; i < size; ++i) { - let witness = ref[i].dispose(); - ref[i] = null; - if (!tc.released(i, witness)) { - do_print("test_result_dispose failure at index "+i); - do_check_true(false); - } - } - - do_check_eq(count_finalized(size, tc), size); -} - - -/** - * Check that - * - |dispose| is executed properly - * - finalizers are not executed after |dispose| - */ -function test_executing_dispose(size, tc, cleanup) -{ - dump("test_executing_dispose " + tc.name + "\n"); - let ref = []; - // Allocate |size| items with references - for (let i = 0; i < size; ++i) { - let value = ctypes.CDataFinalizer(tc.acquire(i), tc.release); - cleanup.add(value); - ref.push(value); - } - do_check_eq(count_finalized(size, tc), 0); - - // Dispose of everything and make sure that everything has been cleaned up - ref.forEach( - function dispose(v) { - v.dispose(); - } - ); - do_check_eq(count_finalized(size, tc), size); - - // Remove references - ref = []; - - // Re-acquire data and make sure that everything has been reinialized - for (i = 0; i < size; ++i) { - tc.acquire(i); - } - - do_check_eq(count_finalized(size, tc), 0); - - - // Attempt to trigger finalizations, ensure that they do not take place - trigger_gc(); - - do_check_eq(count_finalized(size, tc), 0); -} - - -/** - * Check that - * - |forget| does not dispose - * - |forget| has the right content - * - finalizers are not executed after |forget| - */ -function test_executing_forget(size, tc, cleanup) -{ - dump("test_executing_forget " + tc.name + "\n"); - let ref = []; - // Allocate |size| items with references - for (let i = 0; i < size; ++i) { - let original = tc.acquire(i); - let finalizer = ctypes.CDataFinalizer(original, tc.release); - ref.push( - { - original: original, - finalizer: finalizer - } - ); - cleanup.add(finalizer); - do_check_true(tc.compare(original, finalizer)); - } - do_check_eq(count_finalized(size, tc), 0); - - // Forget everything, making sure that we recover the original info - ref.forEach( - function compare_original_to_recovered(v) { - let original = v.original; - let recovered = v.finalizer.forget(); - // Note: Cannot use do_check_eq on Uint64 et al. - do_check_true(tc.compare(original, recovered)); - do_check_eq(original.constructor, recovered.constructor); - } - ); - - // Also make sure that we have not performed any clean up - do_check_eq(count_finalized(size, tc), 0); - - // Remove references - ref = []; - - // Attempt to trigger finalizations, ensure that they have no effect - trigger_gc(); - - do_check_eq(count_finalized(size, tc), 0); -} - - -/** - * Check that finalizers are not executed - */ -function test_do_not_execute_finalizers_on_referenced_stuff(size, tc, cleanup) -{ - dump("test_do_not_execute_finalizers_on_referenced_stuff " + tc.name + "\n"); - - let ref = []; - // Allocate |size| items without references - for (let i = 0; i < size; ++i) { - let value = ctypes.CDataFinalizer(tc.acquire(i), tc.release); - cleanup.add(value); - ref.push(value); - } - trigger_gc(); // This might trigger some finalizations, but it should not - - // Check that _nothing_ has been finalized - do_check_eq(count_finalized(size, tc), 0); -} - |