// 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.

import 'package:flutter_devicelab/framework/devices.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/task_result.dart';
import 'package:flutter_devicelab/framework/utils.dart';

Future<String> _runWithMode(String mode, String deviceId) async {
  final StringBuffer stderr = StringBuffer();
  await evalFlutter('drive', stderr: stderr, options: <String>[
    mode,
    '-t',
    'test_driver/scroll_perf.dart',
    '-d',
    deviceId,
  ]);
  return stderr.toString();
}

Future<TaskResult> run() async {
  cd('${flutterDirectory.path}/dev/integration_tests/flutter_gallery');
  final Device device = await devices.workingDevice;
  await device.unlock();
  final String deviceId = device.deviceId;
  await flutter('packages', options: <String>['get']);

  const String warningPiece = 'THIS BENCHMARK IS BEING RUN IN DEBUG MODE';

  final String debugOutput = await _runWithMode('--debug', deviceId);
  if (!debugOutput.contains(warningPiece)) {
    return TaskResult.failure(
        'Could not find the following warning message piece: $warningPiece'
    );
  }

  final String profileOutput = await _runWithMode('--profile', deviceId);
  if (profileOutput.contains(warningPiece)) {
    return TaskResult.failure(
      'Unexpected warning message piece in profile mode: $warningPiece'
    );
  }

  return TaskResult.success(null);
}

Future<void> main() async {
  deviceOperatingSystem = DeviceOperatingSystem.android;
  await task(run);
}
