// Copyright 2020 The Flutter team. 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:io';

import 'package:path/path.dart' as path;
import 'package:test/test.dart';

// Benchmark size in kB.
const int bundleSizeBenchmark = 5000;
const int gzipBundleSizeBenchmark = 1200;

void main() {
  group('Web Compile', () {
    test('bundle size', () async {
      final js = path.join(
        Directory.current.path,
        'build',
        'web',
        'main.dart.js',
      );
      await _runProcess('flutter', [
        'build',
        'web',
      ]);
      await _runProcess('gzip', ['-k', js]);
      final bundleSize = await _measureSize(js);
      final gzipBundleSize = await _measureSize(js + '.gz');

      if (bundleSize > bundleSizeBenchmark) {
        fail(
            'The size the compiled web build "$js" was $bundleSize kB. This is '
            'larger than the benchmark that was set at $bundleSizeBenchmark kB.'
            '\n\n'
            'The build size should be as minimal as possible to reduce the web '
            'app’s initial startup time. If this change is intentional, and'
            ' expected, please increase the constant "bundleSizeBenchmark".');
      } else if (gzipBundleSize > gzipBundleSizeBenchmark) {
        fail('The size the compiled and gzipped web build "$js" was'
            ' $gzipBundleSize kB. This is larger than the benchmark that was '
            'set at $gzipBundleSizeBenchmark kB.\n\n'
            'The build size should be as minimal as possible to reduce the '
            'web app’s initial startup time. If this change is intentional, and'
            ' expected, please increase the constant "gzipBundleSizeBenchmark".');
      }
    }, timeout: const Timeout(Duration(minutes: 5)));
  });
}

Future<int> _measureSize(String file) async {
  final result = await _runProcess('du', ['-k', file]);
  return int.parse(
      (result.stdout as String).split(RegExp(r'\s+')).first.trim());
}

Future<ProcessResult> _runProcess(
    String executable, List<String> arguments) async {
  final result = await Process.run(executable, arguments);
  stdout.write(result.stdout);
  stderr.write(result.stderr);
  return result;
}
