Home | History | Annotate | Download | only in debug-promises
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Flags: --expose-debug-as debug --allow-natives-syntax --promise-extra
      6 
      7 // Test debug events when a Promise is rejected, which is caught by a custom
      8 // promise, which has a number for reject closure.  We expect an Exception debug
      9 // events trying to call the invalid reject closure.
     10 
     11 Debug = debug.Debug;
     12 
     13 var expected_events = 1;
     14 var log = [];
     15 
     16 var p = new Promise(function(resolve, reject) {
     17   log.push("resolve");
     18   resolve();
     19 });
     20 
     21 function MyPromise(resolver) {
     22   var reject = 1;
     23   var resolve = function() { };
     24   log.push("construct");
     25   resolver(resolve, reject);
     26 };
     27 
     28 MyPromise.prototype = new Promise(function() {});
     29 p.constructor = MyPromise;
     30 
     31 var q = p.chain(
     32   function() {
     33     log.push("reject caught");
     34     return Promise.reject(new Error("caught"));
     35   });
     36 
     37 function listener(event, exec_state, event_data, data) {
     38   try {
     39     if (event == Debug.DebugEvent.Exception) {
     40       expected_events--;
     41       assertTrue(expected_events >= 0);
     42       assertEquals("number is not a function", event_data.exception().message);
     43       // All of the frames on the stack are from native Javascript.
     44       assertEquals(0, exec_state.frameCount());
     45     }
     46   } catch (e) {
     47     %AbortJS(e + "\n" + e.stack);
     48   }
     49 }
     50 
     51 Debug.setBreakOnUncaughtException();
     52 Debug.setListener(listener);
     53 
     54 function testDone(iteration) {
     55   function checkResult() {
     56     try {
     57       assertTrue(iteration < 10);
     58       if (expected_events === 0) {
     59         assertEquals(["resolve", "construct", "end main", "reject caught"],
     60                      log);
     61       } else {
     62         testDone(iteration + 1);
     63       }
     64     } catch (e) {
     65       %AbortJS(e + "\n" + e.stack);
     66     }
     67   }
     68 
     69   %EnqueueMicrotask(checkResult);
     70 }
     71 
     72 testDone(0);
     73 
     74 log.push("end main");
     75