// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';

import 'test_helper.dart';

fib(n) {
  if (n < 0) return 0;
  if (n == 0) return 1;
  return fib(n - 1) + fib(n - 2);
}

testeeDo() {
  print("Testee doing something.");
  fib(30);
  print("Testee did something.");
}

var tests = <IsolateTest>[
  (Isolate isolate) async {
    var params = {'tags': 'None'};
    var result =
        await isolate.invokeRpcNoUpgrade('_writeCpuProfileTimeline', params);
    print(result);
    expect(result['type'], equals('Success'));

    result = await isolate.vm.invokeRpcNoUpgrade('_getVMTimeline', {});
    expect(result['type'], equals('_Timeline'));
    expect(result['traceEvents'], new isInstanceOf<List>());

    var events = result['traceEvents'];
    print(events);
    var profilerSampleEvents = result['traceEvents'].where((event) {
      return event['name'] == "Dart CPU sample";
    }).toList();

    var isString = new isInstanceOf<String>();
    var isInt = new isInstanceOf<int>();

    expect(profilerSampleEvents.length, greaterThan(10),
        reason: "Should have many samples");
    for (Map event in profilerSampleEvents) {
      print(event);

      // Sadly this is an "Instant" event because there is no way to add a
      // proper "Sample" event in Fuchsia's tracing.
      expect(event['ph'], equals('i'));

      expect(event['pid'], isInt);
      expect(event['tid'], isInt);
      expect(event['ts'], isInt);
      expect(event['cat'], equals("Profiler"));
      expect(event['args']['backtrace'], isString);
    }
  },
];

var vmArgs = [
  '--profiler=true',
  '--profile-vm=false', // So this also works with DBC and KBC.
  '--timeline_recorder=ring',
  '--timeline_streams=Profiler'
];

main(args) async =>
    runIsolateTests(args, tests, testeeBefore: testeeDo, extraArgs: vmArgs);
