// Copyright 2018 The Chromium 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 'dart:convert';
import 'dart:io';

import 'common.dart';

import 'fake_process_manager.dart';

void main() {
  group('ArchivePublisher', () {
    FakeProcessManager processManager;
    final List<String> stdinCaptured = <String>[];

    void _captureStdin(String item) {
      stdinCaptured.add(item);
    }

    setUp(() async {
      processManager = FakeProcessManager(stdinResults: _captureStdin);
    });

    tearDown(() async {});

    test('start works', () async {
      final Map<String, List<ProcessResult>> calls = <String, List<ProcessResult>>{
        'gsutil acl get gs://flutter_infra/releases/releases.json': <ProcessResult>[
          ProcessResult(0, 0, 'output1', '')
        ],
        'gsutil cat gs://flutter_infra/releases/releases.json': <ProcessResult>[
          ProcessResult(0, 0, 'output2', '')
        ],
      };
      processManager.fakeResults = calls;
      for (String key in calls.keys) {
        final Process process = await processManager.start(key.split(' '));
        String output = '';
        process.stdout.listen((List<int> item) {
          output += utf8.decode(item);
        });
        await process.exitCode;
        expect(output, equals(calls[key][0].stdout));
      }
      processManager.verifyCalls(calls.keys.toList());
    });

    test('run works', () async {
      final Map<String, List<ProcessResult>> calls = <String, List<ProcessResult>>{
        'gsutil acl get gs://flutter_infra/releases/releases.json': <ProcessResult>[
          ProcessResult(0, 0, 'output1', '')
        ],
        'gsutil cat gs://flutter_infra/releases/releases.json': <ProcessResult>[
          ProcessResult(0, 0, 'output2', '')
        ],
      };
      processManager.fakeResults = calls;
      for (String key in calls.keys) {
        final ProcessResult result = await processManager.run(key.split(' '));
        expect(result.stdout, equals(calls[key][0].stdout));
      }
      processManager.verifyCalls(calls.keys.toList());
    });

    test('runSync works', () async {
      final Map<String, List<ProcessResult>> calls = <String, List<ProcessResult>>{
        'gsutil acl get gs://flutter_infra/releases/releases.json': <ProcessResult>[
          ProcessResult(0, 0, 'output1', '')
        ],
        'gsutil cat gs://flutter_infra/releases/releases.json': <ProcessResult>[
          ProcessResult(0, 0, 'output2', '')
        ],
      };
      processManager.fakeResults = calls;
      for (String key in calls.keys) {
        final ProcessResult result = processManager.runSync(key.split(' '));
        expect(result.stdout, equals(calls[key][0].stdout));
      }
      processManager.verifyCalls(calls.keys.toList());
    });

    test('captures stdin', () async {
      final Map<String, List<ProcessResult>> calls = <String, List<ProcessResult>>{
        'gsutil acl get gs://flutter_infra/releases/releases.json': <ProcessResult>[
          ProcessResult(0, 0, 'output1', '')
        ],
        'gsutil cat gs://flutter_infra/releases/releases.json': <ProcessResult>[
          ProcessResult(0, 0, 'output2', '')
        ],
      };
      processManager.fakeResults = calls;
      for (String key in calls.keys) {
        final Process process = await processManager.start(key.split(' '));
        String output = '';
        process.stdout.listen((List<int> item) {
          output += utf8.decode(item);
        });
        final String testInput = '${calls[key][0].stdout} input';
        process.stdin.add(testInput.codeUnits);
        await process.exitCode;
        expect(output, equals(calls[key][0].stdout));
        expect(stdinCaptured.last, equals(testInput));
      }
      processManager.verifyCalls(calls.keys.toList());
    });
  });
}
