test_onGarbageCollection-02.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Test multiple debuggers, GCs, and zones interacting with each other.
  2. //
  3. // Note: when observing both globals, but GC'ing in only one, we don't test that
  4. // we *didn't* GC in the other zone because GCs are finicky and unreliable. That
  5. // used to work when this was a jit-test, but in the process of migrating to
  6. // xpcshell, we lost some amount of reliability and determinism.
  7. const root1 = newGlobal();
  8. const dbg1 = new Debugger();
  9. dbg1.addDebuggee(root1)
  10. const root2 = newGlobal();
  11. const dbg2 = new Debugger();
  12. dbg2.addDebuggee(root2)
  13. let fired1 = false;
  14. let fired2 = false;
  15. dbg1.memory.onGarbageCollection = _ => fired1 = true;
  16. dbg2.memory.onGarbageCollection = _ => fired2 = true;
  17. function reset() {
  18. fired1 = false;
  19. fired2 = false;
  20. }
  21. function run_test() {
  22. do_test_pending();
  23. gc();
  24. executeSoon(() => {
  25. reset();
  26. // GC 1 only
  27. root1.eval(`gc(this)`);
  28. executeSoon(() => {
  29. equal(fired1, true);
  30. // GC 2 only
  31. reset();
  32. root2.eval(`gc(this)`);
  33. executeSoon(() => {
  34. equal(fired2, true);
  35. // Full GC
  36. reset();
  37. gc();
  38. executeSoon(() => {
  39. equal(fired1, true);
  40. equal(fired2, true);
  41. // Full GC with no debuggees
  42. reset();
  43. dbg1.removeAllDebuggees();
  44. dbg2.removeAllDebuggees();
  45. gc();
  46. executeSoon(() => {
  47. equal(fired1, false);
  48. equal(fired2, false);
  49. // One debugger with multiple debuggees in different zones.
  50. dbg1.addDebuggee(root1);
  51. dbg1.addDebuggee(root2);
  52. // Just debuggee 1
  53. reset();
  54. root1.eval(`gc(this)`);
  55. executeSoon(() => {
  56. equal(fired1, true);
  57. equal(fired2, false);
  58. // Just debuggee 2
  59. reset();
  60. root2.eval(`gc(this)`);
  61. executeSoon(() => {
  62. equal(fired1, true);
  63. equal(fired2, false);
  64. // All debuggees
  65. reset();
  66. gc();
  67. executeSoon(() => {
  68. equal(fired1, true);
  69. equal(fired2, false);
  70. do_test_finished();
  71. });
  72. });
  73. });
  74. });
  75. });
  76. });
  77. });
  78. });
  79. }