// Copyright 2019 The Fuchsia Authors. 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:test/test.dart';
import 'package:sl4f/sl4f.dart' as sl4f;

const _timeout = Duration(seconds: 60);

void main() {
  sl4f.Sl4f sl4fDriver;

  setUp(() async {
    sl4fDriver = sl4f.Sl4f.fromEnvironment();
    await sl4fDriver.startServer();
  });

  tearDown(() async {
    await sl4fDriver.stopServer();
    sl4fDriver.close();
  });

  group(sl4f.Sl4f, () {
    test('Component search component not running', () async {
      final result = await sl4f.Component(sl4fDriver).search('fake.cmx');
      expect(result, false);
    });

    test('Component search a running component', () async {
      final result = await sl4f.Component(sl4fDriver).search('sl4f.cmx');
      expect(result, true);
    });

    test('Component List running components', () async {
      final result = await sl4f.Component(sl4fDriver).list();
      expect(result.isNotEmpty, true);
    });

    test('tests launcher allows clean for graceful component shutdown',
        () async {
      await sl4fDriver.ssh.run('killall "system_monitor_harvester.cmx"');
      await sl4f.Component(sl4fDriver)
          .launch('system_monitor_harvester', ['--version']);
    });

    test('tests launcher with error', () async {
      final result = await sl4f.Component(sl4fDriver).launch('fake');
      expect(result['Fail'], -1);
    });
  }, timeout: Timeout(_timeout));
}
