// Copyright 2019 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 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/build_system/targets/linux.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:mockito/mockito.dart';

import '../../../src/common.dart';
import '../../../src/testbed.dart';

void main() {
  Testbed testbed;
  const BuildSystem buildSystem = BuildSystem();
  Environment environment;
  MockPlatform mockPlatform;

  setUpAll(() {
    Cache.disableLocking();
    Cache.flutterRoot = '';
  });

  setUp(() {
    mockPlatform = MockPlatform();
    when(mockPlatform.isWindows).thenReturn(false);
    when(mockPlatform.isMacOS).thenReturn(false);
    when(mockPlatform.isLinux).thenReturn(true);
    testbed = Testbed(setup: () {
      Cache.flutterRoot = '';
      environment = Environment(
        projectDir: fs.currentDirectory,
      );
      fs.file('bin/cache/artifacts/engine/linux-x64/libflutter_linux_glfw.so').createSync(recursive: true);
      fs.file('bin/cache/artifacts/engine/linux-x64/flutter_export.h').createSync();
      fs.file('bin/cache/artifacts/engine/linux-x64/flutter_messenger.h').createSync();
      fs.file('bin/cache/artifacts/engine/linux-x64/flutter_plugin_registrar.h').createSync();
      fs.file('bin/cache/artifacts/engine/linux-x64/flutter_glfw.h').createSync();
      fs.file('bin/cache/artifacts/engine/linux-x64/icudtl.dat').createSync();
      fs.file('bin/cache/artifacts/engine/linux-x64/cpp_client_wrapper_glfw/foo').createSync(recursive: true);
      fs.file('packages/flutter_tools/lib/src/build_system/targets/linux.dart').createSync(recursive: true);
      fs.directory('linux').createSync();
    }, overrides: <Type, Generator>{
      Platform: () => mockPlatform,
    });
  });

  test('Copies files to correct cache directory', () => testbed.run(() async {
    final BuildResult result = await buildSystem.build(const UnpackLinux(), environment);

    expect(result.hasException, false);
    expect(fs.file('linux/flutter/libflutter_linux_glfw.so').existsSync(), true);
    expect(fs.file('linux/flutter/flutter_export.h').existsSync(), true);
    expect(fs.file('linux/flutter/flutter_messenger.h').existsSync(), true);
    expect(fs.file('linux/flutter/flutter_plugin_registrar.h').existsSync(), true);
    expect(fs.file('linux/flutter/flutter_glfw.h').existsSync(), true);
    expect(fs.file('linux/flutter/icudtl.dat').existsSync(), true);
    expect(fs.file('linux/flutter/cpp_client_wrapper_glfw/foo').existsSync(), true);
  }));

  test('Does not re-copy files unecessarily', () => testbed.run(() async {
    await buildSystem.build(const UnpackLinux(), environment);
    // Set a date in the far distant past to deal with the limited resolution
    // of the windows filesystem.
    final DateTime theDistantPast = DateTime(1991, 8, 23);
    fs.file('linux/flutter/libflutter_linux_glfw.so').setLastModifiedSync(theDistantPast);
    await buildSystem.build(const UnpackLinux(), environment);

    expect(fs.file('linux/flutter/libflutter_linux_glfw.so').statSync().modified, equals(theDistantPast));
  }));

  test('Detects changes in input cache files', () => testbed.run(() async {
    await buildSystem.build(const UnpackLinux(), environment);
    fs.file('bin/cache/artifacts/engine/linux-x64/libflutter_linux_glfw.so').writeAsStringSync('asd'); // modify cache.

    await buildSystem.build(const UnpackLinux(), environment);

    expect(fs.file('linux/flutter/libflutter_linux_glfw.so').readAsStringSync(), 'asd');
  }));
}

class MockPlatform extends Mock implements Platform {}
