// 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 'dart:async';
import 'package:observatory_2/service_io.dart';
import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';

const String kSetHttpEnableTimelineLogging =
    'ext.dart.io.setHttpEnableTimelineLogging';
const String kGetHttpEnableTimelineLogging =
    'ext.dart.io.getHttpEnableTimelineLogging';
Future<void> setup() async {}

var tests = <IsolateTest>[
  (Isolate isolate) async {
    await isolate.load();
    // Ensure all HTTP service extensions are registered.
    expect(isolate.extensionRPCs.length, greaterThanOrEqualTo(2));
    expect(
        isolate.extensionRPCs.contains(kGetHttpEnableTimelineLogging), isTrue);
    expect(
        isolate.extensionRPCs.contains(kSetHttpEnableTimelineLogging), isTrue);
  },
  (Isolate isolate) async {
    await isolate.load();
    var response =
        await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
    expect(response['type'], 'HttpTimelineLoggingState');
    expect(response['enabled'], false);

    response = await isolate
        .invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {'enable': true});
    expect(response['type'], 'Success');

    response =
        await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
    expect(response['type'], 'HttpTimelineLoggingState');
    expect(response['enabled'], true);

    response = await isolate
        .invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {'enable': false});
    expect(response['type'], 'Success');

    response =
        await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
    expect(response['type'], 'HttpTimelineLoggingState');
    expect(response['enabled'], false);
  },
  (Isolate isolate) async {
    // Bad argument.
    try {
      await isolate
          .invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {'enable': 'foo'});
    } catch (e) {/* expected */}
    // Missing argument.
    try {
      await isolate.invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {});
    } catch (e) {/* expected */}
  },
];

main(args) async => runIsolateTests(args, tests, testeeBefore: setup);
