// 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 'client_resume_approvals_common.dart';
import 'service_test_common.dart';
import 'test_helper.dart';

void fooBar() {
  int i = 0;
  print(i);
}

WebSocketVM client1;
WebSocketVM client2;
WebSocketVM client3;

final nameChangeTest = <IsolateTest>[
  // Remove required approvals via name change.
  (Isolate isolate) async {
    final resumeFuture = waitForResume(isolate);

    // Create two clients with the same name.
    client1 = await createClient(isolate.owner);
    client2 = await createClient(isolate.owner);
    await setRequireApprovalForResume(
      client1,
      isolate,
      pauseOnStart: true,
      pauseOnExit: true,
    );
    client3 = await createClient(isolate.owner, clientName: otherClientName);

    // Check that client3 can't resume the isolate on its own.
    expect(await isPausedAtStart(isolate), true);
    await resume(client3, isolate);
    expect(await isPausedAtStart(isolate), true);

    // Change the name of client1. Since client2 has the same name that client1
    // originally had, the service still requires approval to resume the
    // isolate.
    await setClientName(client1, 'foobar');
    expect(await isPausedAtStart(isolate), true);
    await setClientName(client2, 'baz');
  },
  hasStoppedAtExit,
];

Future<void> main(args) => runIsolateTests(
      args,
      nameChangeTest,
      testeeConcurrent: fooBar,
      pause_on_start: true,
      pause_on_exit: true,
      enableService: false,
    );
