// Copyright (c) 2013, 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.

// @dart = 2.9

// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
// VMOptions=--no-enable-isolate-groups

library illegal_msg_mirror_test;

import "dart:isolate";
import "dart:mirrors";

import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";

class Class {
  method() {}
}

echo(sendPort) {
  final port = new ReceivePort();
  sendPort.send(port.sendPort);
  port.listen((msg) {
    sendPort.send("echoing ${msg(1)}}");
  });
}

void main([args, port]) {
  asyncStart();

  final ReceivePort port = new ReceivePort();

  // Ignore returned Future.
  Isolate.spawn(echo, port.sendPort);

  port.first.then((_snd) {
    SendPort snd = _snd;
    final methodMirror = reflectClass(Class).declarations[#method];
    try {
      snd.send(methodMirror);
    } catch (e) {
      // Expected behavior.
      port.close();
      asyncEnd();
      return;
    }
    Expect.fail("Should not be reached. Message sending didn't throw.");
  });
}
