// Copyright (c) 2015, 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.
// VMOptions=--error_on_bad_type --error_on_bad_override

import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';

import 'dart:developer';

void script() {
  var counter = new Counter('a.b.c', 'description');
  Metrics.register(counter);
  counter.value = 1234.5;
}

var tests = [

  (Isolate isolate) async {
    Map metrics = await isolate.refreshNativeMetrics();
    expect(metrics.length, greaterThan(1));
    expect(metrics.length, greaterThan(1));
    var foundOldHeapCapacity = metrics.values.any(
        (m) => m.name == 'heap.old.capacity');
    expect(foundOldHeapCapacity, equals(true));
  },

  (Isolate isolate) async {
    var params = { 'metricId': 'metrics/native/heap.old.used' };
    ServiceMetric counter =
      await isolate.invokeRpc('_getIsolateMetric', params);
    expect(counter.type, equals('Counter'));
    expect(counter.name, equals('heap.old.used'));
  },

  (Isolate isolate) async {
    bool caughtException;
    try {
      await isolate.invokeRpc('_getIsolateMetric',
                              { 'metricId': 'metrics/native/doesnotexist' });
      expect(false, isTrue, reason:'Unreachable');
    } on ServerRpcException catch (e) {
      caughtException = true;
      expect(e.code, equals(ServerRpcException.kInvalidParams));
      expect(e.message,
             "_getIsolateMetric: invalid 'metricId' "
             "parameter: metrics/native/doesnotexist");
    }
    expect(caughtException, isTrue);
  },

];

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