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