13ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Copyright 2008 the V8 project authors. All rights reserved.
23ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Redistribution and use in source and binary forms, with or without
33ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// modification, are permitted provided that the following conditions are
43ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// met:
53ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//
63ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//     * Redistributions of source code must retain the above copyright
73ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       notice, this list of conditions and the following disclaimer.
83ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//     * Redistributions in binary form must reproduce the above
93ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       copyright notice, this list of conditions and the following
103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       disclaimer in the documentation and/or other materials provided
113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       with the distribution.
123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//     * Neither the name of Google Inc. nor the names of its
133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       contributors may be used to endorse or promote products derived
143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//       from this software without specific prior written permission.
153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block//
163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Flags: --expose-debug-as debug
293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Get the Debug object exposed from the debug context global object.
303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockDebug = debug.Debug
313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Simple function which stores the last debug event.
333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlocklistenerComplete = false;
343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockexception = false;
353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvar base_backtrace_request = '"seq":0,"type":"request","command":"backtrace"'
373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvar base_suspend_request = '"seq":0,"type":"request","command":"suspend"'
383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockfunction safeEval(code) {
403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  try {
413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return eval('(' + code + ')');
423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } catch (e) {
433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    assertEquals(void 0, e);
443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return undefined;
453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockfunction testArguments(exec_state) {
493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  // Get the debug command processor in running state.
503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  var dcp = exec_state.debugCommandProcessor(true);
513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  assertTrue(dcp.isRunning());
533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  var backtrace_request = '{' + base_backtrace_request + '}'
553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  var backtrace_response = safeEval(dcp.processDebugJSONRequest(backtrace_request));
563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  assertTrue(backtrace_response.success);
583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  assertTrue(backtrace_response.running, backtrace_request + ' -> expected running');
603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  assertTrue(dcp.isRunning());
623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  var suspend_request = '{' + base_suspend_request + '}'
643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  var suspend_response = safeEval(dcp.processDebugJSONRequest(suspend_request));
653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  assertTrue(suspend_response.success);
673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  assertFalse(suspend_response.running, suspend_request + ' -> expected not running');
693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  assertFalse(dcp.isRunning());
713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockfunction listener(event, exec_state, event_data, data) {
743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  try {
753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    if (event == Debug.DebugEvent.Break) {
763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      // Test simple suspend request.
783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      testArguments(exec_state);
793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      // Indicate that all was processed.
813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      listenerComplete = true;
823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    }
833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } catch (e) {
843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    exception = e
853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  };
863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block};
873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Add the debug event listener.
893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockDebug.setListener(listener);
903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Stop debugger and check that suspend command changes running flag.
923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockdebugger;
933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockassertFalse(exception, "exception in listener")
953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Make sure that the debug event listener vas invoked.
963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockassertTrue(listenerComplete, "listener did not run to completion");
97