// Copyright (c) 2020, 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 'dart:async';
import 'dart:developer';

import 'package:observatory/service_io.dart';
import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';

Future testMain() async {
  // Log a total of 30 messages
  for (int i = 1; i <= maxLogHistorySize + 10; ++i) {
    log('All work and no play makes Ben a dull boy ($i)');
  }
  debugger();
}

const maxLogHistorySize = 100000;

Future setLogHistorySize(Isolate isolate, int size) async {
  return await isolate.invokeRpcNoUpgrade('setLogHistorySize', {
    'size': size,
  });
}

Future<int> getLogHistorySize(Isolate isolate) async {
  final result = await isolate.invokeRpcNoUpgrade('getLogHistorySize', {});
  expect(result['type'], 'Size');
  return result['size'] as int;
}

var tests = <IsolateTest>[
  hasPausedAtStart,
  (Isolate isolate) async {
    final initialSize = await getLogHistorySize(isolate);
    try {
      await setLogHistorySize(isolate, maxLogHistorySize + 1);
    } on ServerRpcException catch (e) {
      expect(e.message, "'size' must be less than $maxLogHistorySize");
    }
    expect(await getLogHistorySize(isolate), initialSize);
  },
  (Isolate isolate) async {
    final result = await setLogHistorySize(isolate, maxLogHistorySize);
    expect(result['type'], 'Success');
    expect(await getLogHistorySize(isolate), maxLogHistorySize);
  },
  resumeIsolate,
  hasStoppedAtBreakpoint,
  (Isolate isolate) async {
    print("Starting step 6");
    final completer = Completer<void>();

    await Future.delayed(const Duration(seconds: 1));

    int i = 11;
    await subscribeToStream(isolate.vm, 'Logging', (event) async {
      expect(
        event.logRecord!['message'].valueAsString,
        'All work and no play makes Ben a dull boy ($i)',
      );
      i++;

      if (i == maxLogHistorySize + 10) {
        await cancelStreamSubscription('Logging');
        completer.complete();
      }
    });
    await completer.future;
  },
];

main(args) => runIsolateTests(
      args,
      tests,
      enableService: false, // DDS specific feature
      testeeConcurrent: testMain,
      pause_on_start: true,
      pause_on_exit: true,
    );
