text: // Copyright 2017 the V8 project authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  // Flags: --type-profile
  
  const source1 =
    `
  function g(a, b, c) {
    return 'first';
  };
  g({}, [], null);
  `;
  
  const source2 =
    `
  function f(a) {
    return 'second';
  };
  f(null);
  `;
  
  let {session, contextGroup, Protocol} = InspectorTest.start("Turn " +
    "Profiler.startTypeProfile on and off.");
  
  InspectorTest.runAsyncTestSuite([
    async function testTypeProfile() {
      Protocol.Runtime.enable();
      let {result: {scriptId}} = await Protocol.Runtime.compileScript({
        expression: source1,
        sourceURL: arguments.callee.name, persistScript: true
      });
      await Protocol.Profiler.enable();
  
      // Start, run, take.
      await Protocol.Profiler.startTypeProfile();
      Protocol.Runtime.runScript({scriptId});
  
      let typeProfiles = await Protocol.Profiler.takeTypeProfile();
      await session.logTypeProfile(typeProfiles.result.result[0],
        source1);
  
      Protocol.Profiler.stopTypeProfile();
      Protocol.Profiler.disable();
      await Protocol.Runtime.disable();
    },
    async function testTypeProfileFromDifferentSource() {
      Protocol.Runtime.enable();
      let {result: {scriptId}} = await Protocol.Runtime.compileScript({
        expression: source2,
        sourceURL: arguments.callee.name, persistScript: true
      });
      await Protocol.Profiler.enable();
  
      // Start, run different script, take.
      await Protocol.Profiler.startTypeProfile();
      Protocol.Runtime.runScript({scriptId});
  
      let typeProfiles = await Protocol.Profiler.takeTypeProfile();
      await session.logTypeProfile(typeProfiles.result.result[0],
        source2);
  
      Protocol.Profiler.stopTypeProfile();
      Protocol.Profiler.disable();
      await Protocol.Runtime.disable();
    },
    async function testStopTypeProfileDeletesFeedback() {
      Protocol.Runtime.enable();
      let {result: {scriptId}} = await Protocol.Runtime.compileScript({
        expression: source1,
        sourceURL: arguments.callee.name, persistScript: true
      });
      await Protocol.Profiler.enable();
  
      // Start, run, stop.
      await Protocol.Profiler.startTypeProfile();
      Protocol.Runtime.runScript({scriptId});
      await Protocol.Profiler.stopTypeProfile();
  
      // Start, take. Should be empty, because no code was run.
      await Protocol.Profiler.startTypeProfile();
      let typeProfiles = await Protocol.Profiler.takeTypeProfile();
      InspectorTest.logMessage(typeProfiles.result.result);
      await Protocol.Profiler.stopTypeProfile();
  
      Protocol.Profiler.disable();
      await Protocol.Runtime.disable();
    },
    async function testTypeProfileWithoutStartingItFirst() {
      Protocol.Runtime.enable();
      let {result: {scriptId}} = await Protocol.Runtime.compileScript({ expression: source1,
        sourceURL: arguments.callee.name, persistScript: true });
      Protocol.Runtime.runScript({ scriptId });
      await Protocol.Profiler.enable();
  
      // This should return an error because type profile was never started.
      let typeProfiles = await Protocol.Profiler.takeTypeProfile();
      InspectorTest.logObject(typeProfiles.error.message);
  
      Protocol.Profiler.disable();
      await Protocol.Runtime.disable();
    },
    async function testTypeProfileAfterStoppingIt() {
      Protocol.Runtime.enable();
      let {result: {scriptId}} = await Protocol.Runtime.compileScript({ expression: source1,
        sourceURL: arguments.callee.name, persistScript: true });
      Protocol.Runtime.runScript({ scriptId });
      await Protocol.Profiler.enable();
      await Protocol.Profiler.startTypeProfile();
  
      // Make sure that this turns off type profile.
      await Protocol.Profiler.stopTypeProfile();
  
      // This should return an error because type profile was stopped.
      let typeProfiles = await Protocol.Profiler.takeTypeProfile();
      InspectorTest.logObject(typeProfiles.error.message);
  
      Protocol.Profiler.disable();
      await Protocol.Runtime.disable();
    },
    async function testStartTypeProfileAfterRunning() {
      Protocol.Runtime.enable();
      let {result: {scriptId}} = await Protocol.Runtime.compileScript({
        expression: source1,
        sourceURL: arguments.callee.name, persistScript: true
      });
      Protocol.Runtime.runScript({scriptId});
  
      await Protocol.Profiler.enable();
      await Protocol.Profiler.startTypeProfile();
  
      let typeProfiles = await Protocol.Profiler.takeTypeProfile();
  
      // This should be empty because type profile was started after compilation.
      // Only the outer script is annotated with return value "string" because
      // that does not depend on runScript().
      InspectorTest.logMessage(typeProfiles);
  
      Protocol.Profiler.stopTypeProfile();
      Protocol.Profiler.disable();
      await Protocol.Runtime.disable();
    },
    async function testTypeProfileForTwoSources() {
      Protocol.Runtime.enable();
      let {result: {scriptId: scriptId1}} = await Protocol.Runtime.compileScript({
        expression: source1,
        sourceURL: arguments.callee.name, persistScript: true
      });
      let {result: {scriptId: scriptId2}} = await Protocol.Runtime.compileScript({
        expression: source2,
        sourceURL: arguments.callee.name, persistScript: true
      });
      await Protocol.Profiler.enable();
  
      // Start, run different script, take.
      await Protocol.Profiler.startTypeProfile();
      Protocol.Runtime.runScript({scriptId: scriptId1});
      Protocol.Runtime.runScript({scriptId: scriptId2});
  
      let typeProfiles = await Protocol.Profiler.takeTypeProfile();
      await session.logTypeProfile(typeProfiles.result.result[0],
        source1);
      await session.logTypeProfile(typeProfiles.result.result[1],
        source2);
  
      Protocol.Profiler.stopTypeProfile();
      Protocol.Profiler.disable();
      await Protocol.Runtime.disable();
    },
    async function testStopTwice() {
      Protocol.Runtime.enable();
      await Protocol.Profiler.enable();
      await Protocol.Profiler.stopTypeProfile();
      await Protocol.Profiler.stopTypeProfile();
      Protocol.Profiler.disable();
      await Protocol.Runtime.disable();
    },
  ]);
  