| Index: runtime/observatory/lib/src/mocks/repositories/target.dart
 | 
| diff --git a/runtime/observatory/lib/src/mocks/repositories/target.dart b/runtime/observatory/lib/src/mocks/repositories/target.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..8321f8612e7333a2ca177378c2bea58ae94190f0
 | 
| --- /dev/null
 | 
| +++ b/runtime/observatory/lib/src/mocks/repositories/target.dart
 | 
| @@ -0,0 +1,72 @@
 | 
| +// Copyright (c) 2016, 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
 | 
| +
 | 
| +part of mocks;
 | 
| +
 | 
| +class TargetChangeEventMock implements M.TargetChangeEvent {
 | 
| +  final TargetRepositoryMock repository;
 | 
| +  const TargetChangeEventMock({this.repository});
 | 
| +}
 | 
| +
 | 
| +typedef void TargetRepositoryMockStringCallback(String notification);
 | 
| +typedef void TargetRepositoryMockTargetCallback(M.Target notification);
 | 
| +
 | 
| +class TargetRepositoryMock implements M.TargetRepository {
 | 
| +  final StreamController<M.TargetChangeEvent> _onChange =
 | 
| +      new StreamController<M.TargetChangeEvent>.broadcast();
 | 
| +  Stream<M.TargetChangeEvent> get onChange => _onChange.stream;
 | 
| +
 | 
| +  bool get hasListeners => _onChange.hasListener;
 | 
| +
 | 
| +  final M.Target _current;
 | 
| +  final Iterable<M.Target> _list;
 | 
| +  final TargetRepositoryMockStringCallback _add;
 | 
| +  final TargetRepositoryMockTargetCallback _setCurrent;
 | 
| +  final TargetRepositoryMockTargetCallback _delete;
 | 
| +
 | 
| +  bool currentInvoked = false;
 | 
| +  bool addInvoked = false;
 | 
| +  bool listInvoked = false;
 | 
| +  bool setCurrentInvoked = false;
 | 
| +  bool deleteInvoked = false;
 | 
| +
 | 
| +  M.Target get current {
 | 
| +    currentInvoked = true;
 | 
| +    return _current;
 | 
| +  }
 | 
| +
 | 
| +  void add(String val) {
 | 
| +    addInvoked = true;
 | 
| +    if (_add != null) _add(val);
 | 
| +  }
 | 
| +
 | 
| +  Iterable<M.Target> list() {
 | 
| +    listInvoked = true;
 | 
| +    return _list;
 | 
| +  }
 | 
| +
 | 
| +  void setCurrent(M.Target target) {
 | 
| +    setCurrentInvoked = true;
 | 
| +    if (_setCurrent != null) _setCurrent(target);
 | 
| +  }
 | 
| +
 | 
| +  void delete(M.Target target) {
 | 
| +    deleteInvoked = true;
 | 
| +    if (_delete != null) _delete(target);
 | 
| +  }
 | 
| +
 | 
| +  void triggerChangeEvent() {
 | 
| +    _onChange.add(new TargetChangeEventMock(repository: this));
 | 
| +  }
 | 
| +
 | 
| +  TargetRepositoryMock({M.Target current, Iterable<M.Target> list : const [],
 | 
| +      TargetRepositoryMockStringCallback add,
 | 
| +      TargetRepositoryMockTargetCallback setCurrent,
 | 
| +      TargetRepositoryMockTargetCallback delete})
 | 
| +    : _current = current,
 | 
| +      _list = list,
 | 
| +      _add = add,
 | 
| +      _setCurrent = setCurrent,
 | 
| +      _delete = delete;
 | 
| +}
 | 
| 
 |