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

import 'test_helper.dart';

Future streamListen(VM vm, String streamId) async =>
    await vm.invokeRpcNoUpgrade(
      'streamListen',
      {
        'streamId': streamId,
      },
    );

Future streamCancel(VM vm, String streamId) async =>
    await vm.invokeRpcNoUpgrade(
      'streamCancel',
      {
        'streamId': streamId,
      },
    );

var tests = <VMTest>[
  // Check double subscription fails.
  (VM vm) async {
    await streamListen(vm, '_Echo');
    try {
      await streamListen(vm, '_Echo');
      fail('Subscribed to stream twice');
    } on ServerRpcException catch (e) {
      expect(e.message, 'Stream already subscribed');
    }
  },
  // Check double cancellation fails.
  (VM vm) async {
    await streamCancel(vm, '_Echo');
    try {
      await streamCancel(vm, '_Echo');
      fail('Double cancellation of stream successful');
    } on ServerRpcException catch (e) {
      expect(e.message, 'Stream not subscribed');
    }
  },
  // Check subscription to invalid stream fails.
  (VM vm) async {
    try {
      await streamListen(vm, 'Foo');
      fail('Subscribed to invalid stream');
    } on ServerRpcException catch (e) {
      expect(e.message, "streamListen: invalid 'streamId' parameter: Foo");
    }
  }
];

main(args) => runVMTests(args, tests);
