// 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);
