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

import 'test_helper.dart';

void fooBar() {}

Future<String> getClientName(Isolate isolate) async {
  final result = await isolate.vm.invokeRpcNoUpgrade('getClientName', {});
  return result['name'];
}

Future<void> setClientName(Isolate isolate, String name) async =>
    await isolate.vm.invokeRpcNoUpgrade('setClientName', {
      'name': name,
    });

final test = <IsolateTest>[
  (Isolate isolate) async {
    // Each client has a default name based on the order of connection to the
    // service.
    expect(await getClientName(isolate), 'client1');

    // Set a custom client name and check it was set properly.
    await setClientName(isolate, 'foobar');
    expect(await getClientName(isolate), 'foobar');

    // Clear the client name and check that we're using the default again.
    await setClientName(isolate, '');
    expect(await getClientName(isolate), 'client1');
  },
];

Future<void> main(args) => runIsolateTests(
      args,
      test,
      testeeBefore: fooBar,
      enableService: false,
    );
