// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.8

import '../base/file_system.dart';
import '../globals.dart' as globals;

/// The name of the test configuration file that will be discovered by the
/// test harness if it exists in the project directory hierarchy.
const String _kTestConfigFileName = 'flutter_test_config.dart';

/// The name of the file that signals the root of the project and that will
/// cause the test harness to stop scanning for configuration files.
const String _kProjectRootSentinel = 'pubspec.yaml';

/// Find the `flutter_test_config.dart` file for a specific test file.
File findTestConfigFile(File testFile) {
  File testConfigFile;
  Directory directory = testFile.parent;
  while (directory.path != directory.parent.path) {
    final File configFile = directory.childFile(_kTestConfigFileName);
    if (configFile.existsSync()) {
      globals.printTrace('Discovered $_kTestConfigFileName in ${directory.path}');
      testConfigFile = configFile;
      break;
    }
    if (directory.childFile(_kProjectRootSentinel).existsSync()) {
      globals.printTrace('Stopping scan for $_kTestConfigFileName; '
          'found project root at ${directory.path}');
      break;
    }
    directory = directory.parent;
  }
  return testConfigFile;
}
