blob: c055e59133382cb14de171e72bcbdca60fb72f79 [file] [log] [blame]
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. 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:pub/src/entrypoint.dart';
import 'package:pub/src/validator.dart';
import 'package:pub/src/validator/leak_detection.dart';
import 'package:test/test.dart';
import '../descriptor.dart' as d;
import '../test_pub.dart';
import 'utils.dart';
Validator leakDetection(Entrypoint entrypoint) =>
LeakDetectionValidator(entrypoint);
void main() {
group('should consider a package valid if it', () {
setUp(d.validPackage.create);
test('contains a source file without secrets', () async {
await d.dir(appPath, [
d.libPubspec('test_pkg', '1.0.0'),
d.dir('lib', [
d.file('test_pkg.dart', '''
void main() => print('nothing secret here');
'''),
])
]).create();
await expectValidation(leakDetection);
});
test('contains a source file listed in false_secrets', () async {
await d.dir(appPath, [
d.pubspec({
'name': 'test_pkg',
'version': '1.0.0',
'false_secrets': [
'/lib/test_pkg.dart',
],
}),
d.dir('lib', [
d.file('test_pkg.dart', '''
void main() => print('Revoked AWS key: AKIAVBOGPFGGW6HQOSMY');
'''),
])
]).create();
await expectValidation(leakDetection, errors: isEmpty);
});
});
group('should consider a package invalid if it', () {
test('contains a source file with secrets', () async {
await d.dir(appPath, [
d.libPubspec('test_pkg', '1.0.0'),
d.dir('lib', [
d.file('test_pkg.dart', '''
void main() => print('Revoked AWS key: AKIAVBOGPFGGW6HQOSMY');
'''),
])
]).create();
await expectValidation(leakDetection, errors: isNotEmpty);
});
});
group('should print', () {
test('at-most 3 warnings', () async {
await d.dir(appPath, [
d.libPubspec('test_pkg', '1.0.0'),
d.dir('lib', [
d.file('test_pkg.dart', '''
final apiKeys = [
'AIzaSyDG0yD6347wy0i1U4ThqQoEZ0y37ZvFKPM',
'AIzaSyCBSJpVO1A2yHOKP627dSmarIrdgvBygjw',
'AIzaSyCB1pW0i5c5Wr42jykePxjrYOXwM4V4Kxk',
'AIzaSyBg0xThpU0mAbbVgzm-BZ_4r3ByKwq8HQU',
'AIzaSyDWpBgA7US5vfQnooBk1WsKa9U0ogKzuaI',
'AIzaSyD95YyR7Xv1F7hdp503G6Tr2vi3CGDC27U',
'AIzaSyCIKRF0KxSDxMkTAM7npQKQcASzRMItakw',
'AIzaSyAH6KPIIZ5eXLrOX3l90su4YwYpaQ8X7cs',
'AIzaSyCS78MPRLsd-Qkhc-t31OiaglmwstaU-nI',
'AIzaSyAazCCPl4tWkSuDt9XBWRTpHxroViYhSxg',
];
'''),
])
]).create();
await expectValidation(leakDetection,
errors: allOf(
hasLength(lessThanOrEqualTo(3)),
contains(contains('10 potential leaks detected in 1 file:')),
));
});
test('at-most 3 warnings when multiple files', () async {
await d.dir(appPath, [
d.libPubspec('test_pkg', '1.0.0'),
d.dir('lib', [
d.file('test_pkg.dart', '''
final apiKeys = [
'AIzaSyDG0yD6347wy0i1U4ThqQoEZ0y37ZvFKPM',
'AIzaSyCBSJpVO1A2yHOKP627dSmarIrdgvBygjw',
'AIzaSyCB1pW0i5c5Wr42jykePxjrYOXwM4V4Kxk',
'AIzaSyBg0xThpU0mAbbVgzm-BZ_4r3ByKwq8HQU',
'AIzaSyDWpBgA7US5vfQnooBk1WsKa9U0ogKzuaI',
'AIzaSyD95YyR7Xv1F7hdp503G6Tr2vi3CGDC27U',
'AIzaSyCIKRF0KxSDxMkTAM7npQKQcASzRMItakw',
];
'''),
d.file('helper.dart', '''
final betterApiKeys = [
'AIzaSyD95YyR7Xv1F7hdp503G6Tr2vi3CGDC27U',
'AIzaSyCIKRF0KxSDxMkTAM7npQKQcASzRMItakw',
'AIzaSyAH6KPIIZ5eXLrOX3l90su4YwYpaQ8X7cs',
'AIzaSyCS78MPRLsd-Qkhc-t31OiaglmwstaU-nI',
'AIzaSyAazCCPl4tWkSuDt9XBWRTpHxroViYhSxg',
];
'''),
])
]).create();
await expectValidation(leakDetection,
errors: allOf(
hasLength(lessThanOrEqualTo(3)),
contains(contains('12 potential leaks detected in 2 files:')),
));
});
});
group('LeakPattern', () {
for (final pattern in leakPatterns) {
group('for "${pattern.kind}"', () {
for (var i = 0; i < pattern.testsWithLeaks.length; i++) {
test('finds leak in testWithLeaks[$i]', () {
final leaks = pattern
.findPossibleLeaks('source.dart', pattern.testsWithLeaks[i])
.toList(growable: false);
expect(leaks, hasLength(equals(1)));
});
}
for (var i = 0; i < pattern.testsWithNoLeaks.length; i++) {
test('finds no leak in testsWithNoLeaks[$i]', () {
final leaks = pattern
.findPossibleLeaks('source.dart', pattern.testsWithNoLeaks[i])
.toList(growable: false);
expect(leaks, isEmpty);
});
}
});
}
});
}