blob: 1d515ef82ee1d80c3e102abf3707581f1791a9f3 [file] [log] [blame]
// Copyright (c) 2018, 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:path/path.dart' as p;
import 'package:test/test.dart';
import 'descriptor.dart' as d;
import 'test_pub.dart';
void main() {
group('creates a snapshot', () {
test('for an immediate dependency', () async {
final server = await servePackages();
server.serve(
'foo',
'1.2.3',
contents: [
d.dir('bin', [
d.file('hello.dart', "void main() => print('hello!');"),
d.file('goodbye.dart', "void main() => print('goodbye!');"),
d.file('shell.sh', 'echo shell'),
d.dir(
'subdir',
[d.file('sub.dart', "void main() => print('sub!');")],
),
]),
],
);
await d.appDir(dependencies: {'foo': '1.2.3'}).create();
await pubGet(
args: ['--precompile'],
output: allOf(
[contains('Built foo:hello.'), contains('Built foo:goodbye.')],
),
);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin'), [
d.dir('foo', [
d.file('hello.dart-$versionSuffix.snapshot', contains('hello!')),
d.file('goodbye.dart-$versionSuffix.snapshot', contains('goodbye!')),
d.nothing('shell.sh-$versionSuffix.snapshot'),
d.nothing('subdir'),
]),
]).validate();
var process = await pubRun(args: ['foo:hello']);
expect(process.stdout, emits('hello!'));
await process.shouldExit();
process = await pubRun(args: ['foo:goodbye']);
expect(process.stdout, emits('goodbye!'));
await process.shouldExit();
});
test("for an immediate dependency that's also transitive", () async {
await servePackages()
..serve(
'foo',
'1.2.3',
contents: [
d.dir('bin', [
d.file('hello.dart', "void main() => print('hello!');"),
d.file('goodbye.dart', "void main() => print('goodbye!');"),
d.file('shell.sh', 'echo shell'),
d.dir(
'subdir',
[d.file('sub.dart', "void main() => print('sub!');")],
),
]),
],
)
..serve('bar', '1.2.3', deps: {'foo': '1.2.3'});
await d.appDir(dependencies: {'foo': '1.2.3'}).create();
await pubGet(
args: ['--precompile'],
output: allOf(
[contains('Built foo:hello.'), contains('Built foo:goodbye.')],
),
);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin'), [
d.dir('foo', [
d.file('hello.dart-$versionSuffix.snapshot', contains('hello!')),
d.file('goodbye.dart-$versionSuffix.snapshot', contains('goodbye!')),
d.nothing('shell.sh-$versionSuffix.snapshot'),
d.nothing('subdir'),
]),
]).validate();
var process = await pubRun(args: ['foo:hello']);
expect(process.stdout, emits('hello!'));
await process.shouldExit();
process = await pubRun(args: ['foo:goodbye']);
expect(process.stdout, emits('goodbye!'));
await process.shouldExit();
});
group('again if', () {
test('its package is updated', () async {
final server = await servePackages();
server.serve(
'foo',
'1.2.3',
contents: [
d.dir(
'bin',
[d.file('hello.dart', "void main() => print('hello!');")],
),
],
);
await d.appDir(dependencies: {'foo': 'any'}).create();
await pubGet(
args: ['--precompile'],
output: contains('Built foo:hello.'),
);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin', 'foo'), [
d.file('hello.dart-$versionSuffix.snapshot', contains('hello!')),
]).validate();
server.serve(
'foo',
'1.2.4',
contents: [
d.dir(
'bin',
[d.file('hello.dart', "void main() => print('hello 2!');")],
),
],
);
await pubUpgrade(
args: ['--precompile'],
output: contains('Built foo:hello.'),
);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin', 'foo'), [
d.file('hello.dart-$versionSuffix.snapshot', contains('hello 2!')),
]).validate();
var process = await pubRun(args: ['foo:hello']);
expect(process.stdout, emits('hello 2!'));
await process.shouldExit();
});
test('a dependency of its package is updated', () async {
final server = await servePackages();
server.serve(
'foo',
'1.2.3',
pubspec: {
'dependencies': {'bar': 'any'},
},
contents: [
d.dir('bin', [
d.file('hello.dart', """
import 'package:bar/bar.dart';
void main() => print(message);
"""),
]),
],
);
server.serve(
'bar',
'1.2.3',
contents: [
d.dir('lib', [d.file('bar.dart', "final message = 'hello!';")]),
],
);
await d.appDir(dependencies: {'foo': 'any'}).create();
await pubGet(
args: ['--precompile'],
output: contains('Built foo:hello.'),
);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin', 'foo'), [
d.file('hello.dart-$versionSuffix.snapshot', contains('hello!')),
]).validate();
server.serve(
'bar',
'1.2.4',
contents: [
d.dir('lib', [d.file('bar.dart', "final message = 'hello 2!';")]),
],
);
await pubUpgrade(
args: ['--precompile'],
output: contains('Built foo:hello.'),
);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin', 'foo'), [
d.file('hello.dart-$versionSuffix.snapshot', contains('hello 2!')),
]).validate();
var process = await pubRun(args: ['foo:hello']);
expect(process.stdout, emits('hello 2!'));
await process.shouldExit();
});
test('a git dependency of its package is updated', () async {
ensureGit();
await d.git('foo.git', [
d.pubspec({'name': 'foo', 'version': '0.0.1'}),
d.dir(
'bin',
[d.file('hello.dart', "void main() => print('Hello!');")],
),
]).create();
await d.appDir(
dependencies: {
'foo': {'git': '../foo.git'},
},
).create();
await pubGet(
args: ['--precompile'],
output: contains('Built foo:hello.'),
);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin', 'foo'), [
d.file('hello.dart-$versionSuffix.snapshot', contains('Hello!')),
]).validate();
await d.git('foo.git', [
d.dir(
'bin',
[d.file('hello.dart', "void main() => print('Goodbye!');")],
),
]).commit();
await pubUpgrade(
args: ['--precompile'],
output: contains('Built foo:hello.'),
);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin', 'foo'), [
d.file('hello.dart-$versionSuffix.snapshot', contains('Goodbye!')),
]).validate();
var process = await pubRun(args: ['foo:hello']);
expect(process.stdout, emits('Goodbye!'));
await process.shouldExit();
});
test('the SDK is out of date', () async {
final server = await servePackages();
server.serve(
'foo',
'5.6.7',
contents: [
d.dir(
'bin',
[d.file('hello.dart', "void main() => print('hello!');")],
),
],
);
await d.appDir(dependencies: {'foo': '5.6.7'}).create();
await pubGet(args: ['--no-precompile']);
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin'), [
d.dir(
'foo',
[d.outOfDateSnapshot('hello.dart-$versionSuffix.snapshot')],
),
]).create();
var process = await pubRun(args: ['foo:hello']);
// In the real world this would just print "hello!", but since we collect
// all output we see the precompilation messages as well.
expect(process.stdout, emits('Building package executable...'));
expect(process.stdout, emitsThrough('hello!'));
await process.shouldExit();
await d.dir(p.join(appPath, '.dart_tool', 'pub', 'bin'), [
d.dir('foo', [
d.file('hello.dart-$versionSuffix.snapshot', contains('hello!')),
]),
]).validate();
});
});
});
}