blob: 3cb9771f6c1f73e5cd7ee3ee39753b5232e73010 [file] [log] [blame]
// 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;
}