Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(test_optimizer): order files on pregen to guarantee consistency #681

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions bricks/test_optimizer/hooks/lib/pre_gen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,28 @@ Future<void> run(HookContext context) async {

final identifierGenerator = DartIdentifierGenerator();
final testIdentifierTable = <Map<String, String>>[];
for (final entity
in testDir.listSync(recursive: true).where((entity) => entity.isTest)) {

final tests = testDir
.listSync(recursive: true)
.where((entity) => entity.isTest)
.toList()
..sort((a, b) {
alestiago marked this conversation as resolved.
Show resolved Hide resolved
// Linux and macOS have different sorting behaviors regarding the order
// that the list of folders/files are returned. To ensure consistency across
// platforms, we apply a uniform sorting logic.
final aSplit = path.split(a.path);
final bSplit = path.split(b.path);
final aLevel = aSplit.length;
final bLevel = bSplit.length;

if (aLevel == bLevel) {
return aSplit.last.compareTo(bSplit.last);
} else {
return aLevel.compareTo(bLevel);
}
});

for (final entity in tests) {
final relativePath =
path.relative(entity.path, from: testDir.path).replaceAll(r'\', '/');
testIdentifierTable.add({
Expand Down
8 changes: 6 additions & 2 deletions bricks/test_optimizer/hooks/test/pre_gen_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ void main() {
..createSync();
File(path.join(testDir.path, 'test1_test.dart')).createSync();
File(path.join(testDir.path, 'test2_test.dart')).createSync();
final subTestDir = Directory(path.join(testDir.path, 'sub_test'))
..createSync();
File(path.join(subTestDir.path, 'test1_test.dart')).createSync();
File(path.join(testDir.path, 'no_test_here.dart')).createSync();

context.vars['package-root'] = packageRoot.absolute.path;
Expand All @@ -47,8 +50,9 @@ void main() {
expect(
tests,
equals([
{'path': 'test2_test.dart', 'identifier': '_a'},
{'path': 'test1_test.dart', 'identifier': '_b'},
{'path': 'test1_test.dart', 'identifier': '_a'},
{'path': 'test2_test.dart', 'identifier': '_b'},
{'path': 'sub_test/test1_test.dart', 'identifier': '_c'},
]),
);
expect(context.vars['isFlutter'], false);
Expand Down
4 changes: 2 additions & 2 deletions lib/src/commands/test/templates/test_optimizer_bundle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ final testOptimizerBundle = MasonBundle.fromJson(<String, dynamic>{
{
"path": "lib/pre_gen.dart",
"data":
"Ly8gaWdub3JlX2Zvcl9maWxlOiBwdWJsaWNfbWVtYmVyX2FwaV9kb2NzCgppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmhvb2tzL2RhcnRfaWRlbnRpZmllcl9nZW5lcmF0b3IuZGFydCc7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRoOwoKdHlwZWRlZiBFeGl0Rm4gPSBOZXZlciBGdW5jdGlvbihpbnQgY29kZSk7CgpFeGl0Rm4gZXhpdEZuID0gZXhpdDsKCkZ1dHVyZTx2b2lkPiBydW4oSG9va0NvbnRleHQgY29udGV4dCkgYXN5bmMgewogIGZpbmFsIHBhY2thZ2VSb290ID0gY29udGV4dC52YXJzWydwYWNrYWdlLXJvb3QnXSBhcyBTdHJpbmc7CiAgZmluYWwgdGVzdERpciA9IERpcmVjdG9yeShwYXRoLmpvaW4ocGFja2FnZVJvb3QsICd0ZXN0JykpOwoKICBpZiAoIXRlc3REaXIuZXhpc3RzU3luYygpKSB7CiAgICBjb250ZXh0LmxvZ2dlci5lcnIoJ0NvdWxkIG5vdCBmaW5kIGRpcmVjdG9yeSAke3Rlc3REaXIucGF0aH0nKTsKICAgIGV4aXRGbigxKTsKICB9CgogIGZpbmFsIHB1YnNwZWMgPSBGaWxlKHBhdGguam9pbihwYWNrYWdlUm9vdCwgJ3B1YnNwZWMueWFtbCcpKTsKICBpZiAoIXB1YnNwZWMuZXhpc3RzU3luYygpKSB7CiAgICBjb250ZXh0LmxvZ2dlci5lcnIoJ0NvdWxkIG5vdCBmaW5kIHB1YnNwZWMueWFtbCBhdCAke3Rlc3REaXIucGF0aH0nKTsKICAgIGV4aXRGbigxKTsKICB9CgogIGZpbmFsIHB1YnNwZWNDb250ZW50cyA9IGF3YWl0IHB1YnNwZWMucmVhZEFzU3RyaW5nKCk7CiAgZmluYWwgZmx1dHRlclNka1JlZ0V4cCA9IFJlZ0V4cChyJ3NkazpccypmbHV0dGVyJCcsIG11bHRpTGluZTogdHJ1ZSk7CiAgZmluYWwgaXNGbHV0dGVyID0gZmx1dHRlclNka1JlZ0V4cC5oYXNNYXRjaChwdWJzcGVjQ29udGVudHMpOwoKICBmaW5hbCBpZGVudGlmaWVyR2VuZXJhdG9yID0gRGFydElkZW50aWZpZXJHZW5lcmF0b3IoKTsKICBmaW5hbCB0ZXN0SWRlbnRpZmllclRhYmxlID0gPE1hcDxTdHJpbmcsIFN0cmluZz4+W107CiAgZm9yIChmaW5hbCBlbnRpdHkKICAgICAgaW4gdGVzdERpci5saXN0U3luYyhyZWN1cnNpdmU6IHRydWUpLndoZXJlKChlbnRpdHkpID0+IGVudGl0eS5pc1Rlc3QpKSB7CiAgICBmaW5hbCByZWxhdGl2ZVBhdGggPQogICAgICAgIHBhdGgucmVsYXRpdmUoZW50aXR5LnBhdGgsIGZyb206IHRlc3REaXIucGF0aCkucmVwbGFjZUFsbChyJ1wnLCAnLycpOwogICAgdGVzdElkZW50aWZpZXJUYWJsZS5hZGQoewogICAgICAncGF0aCc6IHJlbGF0aXZlUGF0aCwKICAgICAgJ2lkZW50aWZpZXInOiBpZGVudGlmaWVyR2VuZXJhdG9yLm5leHQoKSwKICAgIH0pOwogIH0KCiAgY29udGV4dC52YXJzID0geyd0ZXN0cyc6IHRlc3RJZGVudGlmaWVyVGFibGUsICdpc0ZsdXR0ZXInOiBpc0ZsdXR0ZXJ9Owp9CgpleHRlbnNpb24gb24gRmlsZVN5c3RlbUVudGl0eSB7CiAgYm9vbCBnZXQgaXNUZXN0IHsKICAgIHJldHVybiB0aGlzIGlzIEZpbGUgJiYgcGF0aC5iYXNlbmFtZSh0aGlzLnBhdGgpLmVuZHNXaXRoKCdfdGVzdC5kYXJ0Jyk7CiAgfQp9Cg==",
"Ly8gaWdub3JlX2Zvcl9maWxlOiBwdWJsaWNfbWVtYmVyX2FwaV9kb2NzCgppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmhvb2tzL2RhcnRfaWRlbnRpZmllcl9nZW5lcmF0b3IuZGFydCc7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRoOwoKdHlwZWRlZiBFeGl0Rm4gPSBOZXZlciBGdW5jdGlvbihpbnQgY29kZSk7CgpFeGl0Rm4gZXhpdEZuID0gZXhpdDsKCkZ1dHVyZTx2b2lkPiBydW4oSG9va0NvbnRleHQgY29udGV4dCkgYXN5bmMgewogIGZpbmFsIHBhY2thZ2VSb290ID0gY29udGV4dC52YXJzWydwYWNrYWdlLXJvb3QnXSBhcyBTdHJpbmc7CiAgZmluYWwgdGVzdERpciA9IERpcmVjdG9yeShwYXRoLmpvaW4ocGFja2FnZVJvb3QsICd0ZXN0JykpOwoKICBpZiAoIXRlc3REaXIuZXhpc3RzU3luYygpKSB7CiAgICBjb250ZXh0LmxvZ2dlci5lcnIoJ0NvdWxkIG5vdCBmaW5kIGRpcmVjdG9yeSAke3Rlc3REaXIucGF0aH0nKTsKICAgIGV4aXRGbigxKTsKICB9CgogIGZpbmFsIHB1YnNwZWMgPSBGaWxlKHBhdGguam9pbihwYWNrYWdlUm9vdCwgJ3B1YnNwZWMueWFtbCcpKTsKICBpZiAoIXB1YnNwZWMuZXhpc3RzU3luYygpKSB7CiAgICBjb250ZXh0LmxvZ2dlci5lcnIoJ0NvdWxkIG5vdCBmaW5kIHB1YnNwZWMueWFtbCBhdCAke3Rlc3REaXIucGF0aH0nKTsKICAgIGV4aXRGbigxKTsKICB9CgogIGZpbmFsIHB1YnNwZWNDb250ZW50cyA9IGF3YWl0IHB1YnNwZWMucmVhZEFzU3RyaW5nKCk7CiAgZmluYWwgZmx1dHRlclNka1JlZ0V4cCA9IFJlZ0V4cChyJ3NkazpccypmbHV0dGVyJCcsIG11bHRpTGluZTogdHJ1ZSk7CiAgZmluYWwgaXNGbHV0dGVyID0gZmx1dHRlclNka1JlZ0V4cC5oYXNNYXRjaChwdWJzcGVjQ29udGVudHMpOwoKICBmaW5hbCBpZGVudGlmaWVyR2VuZXJhdG9yID0gRGFydElkZW50aWZpZXJHZW5lcmF0b3IoKTsKICBmaW5hbCB0ZXN0SWRlbnRpZmllclRhYmxlID0gPE1hcDxTdHJpbmcsIFN0cmluZz4+W107CgogIGZpbmFsIHRlc3RzID0gdGVzdERpcgogICAgICAubGlzdFN5bmMocmVjdXJzaXZlOiB0cnVlKQogICAgICAud2hlcmUoKGVudGl0eSkgPT4gZW50aXR5LmlzVGVzdCkKICAgICAgLnRvTGlzdCgpCiAgICAuLnNvcnQoKGEsIGIpIHsKICAgICAgLy8vIExpbnV4IGFuZCBtYWNPUyBoYXZlIGRpZmZlcmVudCBzb3J0aW5nIGJlaGF2aW9ycwogICAgICAvLy8gcmVnYXJkaW5nIHRoZSBvcmRlciB0aGF0IHRoZSBsaXN0IG9mIGZvbGRlcnMvZmlsZXMgYXJlIHJldHVybmVkLgogICAgICAvLy8gVG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyBwbGF0Zm9ybXMsIHdlIGFwcGx5IGEKICAgICAgLy8vIHVuaWZvcm0gc29ydGluZyBsb2dpYy4KICAgICAgZmluYWwgYVNwbGl0ID0gcGF0aC5zcGxpdChhLnBhdGgpOwogICAgICBmaW5hbCBiU3BsaXQgPSBwYXRoLnNwbGl0KGIucGF0aCk7CiAgICAgIGZpbmFsIGFMZXZlbCA9IGFTcGxpdC5sZW5ndGg7CiAgICAgIGZpbmFsIGJMZXZlbCA9IGJTcGxpdC5sZW5ndGg7CgogICAgICBpZiAoYUxldmVsID09IGJMZXZlbCkgewogICAgICAgIHJldHVybiBhU3BsaXQubGFzdC5jb21wYXJlVG8oYlNwbGl0Lmxhc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBhTGV2ZWwuY29tcGFyZVRvKGJMZXZlbCk7CiAgICAgIH0KICAgIH0pOwoKICBmb3IgKGZpbmFsIGVudGl0eSBpbiB0ZXN0cykgewogICAgZmluYWwgcmVsYXRpdmVQYXRoID0KICAgICAgICBwYXRoLnJlbGF0aXZlKGVudGl0eS5wYXRoLCBmcm9tOiB0ZXN0RGlyLnBhdGgpLnJlcGxhY2VBbGwocidcJywgJy8nKTsKICAgIHRlc3RJZGVudGlmaWVyVGFibGUuYWRkKHsKICAgICAgJ3BhdGgnOiByZWxhdGl2ZVBhdGgsCiAgICAgICdpZGVudGlmaWVyJzogaWRlbnRpZmllckdlbmVyYXRvci5uZXh0KCksCiAgICB9KTsKICB9CgogIGNvbnRleHQudmFycyA9IHsndGVzdHMnOiB0ZXN0SWRlbnRpZmllclRhYmxlLCAnaXNGbHV0dGVyJzogaXNGbHV0dGVyfTsKfQoKZXh0ZW5zaW9uIG9uIEZpbGVTeXN0ZW1FbnRpdHkgewogIGJvb2wgZ2V0IGlzVGVzdCB7CiAgICByZXR1cm4gdGhpcyBpcyBGaWxlICYmIHBhdGguYmFzZW5hbWUodGhpcy5wYXRoKS5lbmRzV2l0aCgnX3Rlc3QuZGFydCcpOwogIH0KfQo=",
"type": "text"
},
{
Expand All @@ -47,7 +47,7 @@ final testOptimizerBundle = MasonBundle.fromJson(<String, dynamic>{
{
"path": "test/pre_gen_test.dart",
"data":
"aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpob29rcy9wcmVfZ2VuLmRhcnQnIGFzIHByZV9nZW47CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgpjbGFzcyBNb2NrUHJvZ3Jlc3MgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgUHJvZ3Jlc3Mge30KCmNsYXNzIE1vY2tMb2dnZXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgTG9nZ2VyIHt9CgpjbGFzcyBGYWtlQ29udGV4dCBleHRlbmRzIEZha2UgaW1wbGVtZW50cyBIb29rQ29udGV4dCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgbG9nZ2VyID0gTW9ja0xvZ2dlcigpOwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBPYmplY3Q/PiB2YXJzID0ge307Cn0KCnZvaWQgbWFpbigpIHsKICBsYXRlIEhvb2tDb250ZXh0IGNvbnRleHQ7CgogIHNldFVwKCgpIHsKICAgIGNvbnRleHQgPSBGYWtlQ29udGV4dCgpOwogIH0pOwoKICBncm91cCgnUHJlIGdlbiBob29rJywgKCkgewogICAgZ3JvdXAoJ0NvbXBsZXRlcycsICgpIHsKICAgICAgdGVzdCgnd2l0aCB0ZXN0IGZpbGVzIGxpc3QnLCAoKSBhc3luYyB7CiAgICAgICAgZmluYWwgcGFja2FnZVJvb3QgPQogICAgICAgICAgICBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygndGVzdF9vcHRpbWl6ZXInKTsKICAgICAgICBGaWxlKHBhdGguam9pbihwYWNrYWdlUm9vdC5wYXRoLCAncHVic3BlYy55YW1sJykpLmNyZWF0ZVN5bmMoKTsKCiAgICAgICAgZmluYWwgdGVzdERpciA9IERpcmVjdG9yeShwYXRoLmpvaW4ocGFja2FnZVJvb3QucGF0aCwgJ3Rlc3QnKSkKICAgICAgICAgIC4uY3JlYXRlU3luYygpOwogICAgICAgIEZpbGUocGF0aC5qb2luKHRlc3REaXIucGF0aCwgJ3Rlc3QxX3Rlc3QuZGFydCcpKS5jcmVhdGVTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4odGVzdERpci5wYXRoLCAndGVzdDJfdGVzdC5kYXJ0JykpLmNyZWF0ZVN5bmMoKTsKICAgICAgICBGaWxlKHBhdGguam9pbih0ZXN0RGlyLnBhdGgsICdub190ZXN0X2hlcmUuZGFydCcpKS5jcmVhdGVTeW5jKCk7CgogICAgICAgIGNvbnRleHQudmFyc1sncGFja2FnZS1yb290J10gPSBwYWNrYWdlUm9vdC5hYnNvbHV0ZS5wYXRoOwoKICAgICAgICBhd2FpdCBwcmVfZ2VuLnJ1bihjb250ZXh0KTsKCiAgICAgICAgZmluYWwgdGVzdHMgPSBjb250ZXh0LnZhcnNbJ3Rlc3RzJ10gYXMgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PjsKCiAgICAgICAgZXhwZWN0KAogICAgICAgICAgdGVzdHMsCiAgICAgICAgICBlcXVhbHMoWwogICAgICAgICAgICB7J3BhdGgnOiAndGVzdDJfdGVzdC5kYXJ0JywgJ2lkZW50aWZpZXInOiAnX2EnfSwKICAgICAgICAgICAgeydwYXRoJzogJ3Rlc3QxX3Rlc3QuZGFydCcsICdpZGVudGlmaWVyJzogJ19iJ30sCiAgICAgICAgICBdKSwKICAgICAgICApOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzRmx1dHRlciddLCBmYWxzZSk7CiAgICAgIH0pOwoKICAgICAgdGVzdCgnd2l0aCBwcm9wZXIgaXNGbHV0dGVyIGlkZW50aWZpY2F0aW9uJywgKCkgYXN5bmMgewogICAgICAgIGZpbmFsIHBhY2thZ2VSb290ID0KICAgICAgICAgICAgRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoJ3Rlc3Rfb3B0aW1pemVyJyk7CgogICAgICAgIEZpbGUocGF0aC5qb2luKHBhY2thZ2VSb290LnBhdGgsICdwdWJzcGVjLnlhbWwnKSkKICAgICAgICAgIC4uY3JlYXRlU3luYygpCiAgICAgICAgICAuLndyaXRlQXNTdHJpbmdTeW5jKCcnJwpkZXBlbmRlbmNpZXM6CiAgZmx1dHRlcjoKICAgIHNkazogZmx1dHRlcicnJyk7CgogICAgICAgIERpcmVjdG9yeShwYXRoLmpvaW4ocGFja2FnZVJvb3QucGF0aCwgJ3Rlc3QnKSkuY3JlYXRlU3luYygpOwoKICAgICAgICBjb250ZXh0LnZhcnNbJ3BhY2thZ2Utcm9vdCddID0gcGFja2FnZVJvb3QuYWJzb2x1dGUucGF0aDsKCiAgICAgICAgYXdhaXQgcHJlX2dlbi5ydW4oY29udGV4dCk7CgogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzRmx1dHRlciddLCB0cnVlKTsKICAgICAgfSk7CiAgICB9KTsKICAgIGdyb3VwKCdGYWlscycsICgpIHsKICAgICAgc2V0VXAoKCkgewogICAgICAgIHByZV9nZW4uZXhpdEZuID0gKGNvZGUpIHsKICAgICAgICAgIHRocm93IFByb2Nlc3NFeGNlcHRpb24oJ2V4aXQnLCBbY29kZS50b1N0cmluZygpXSk7CiAgICAgICAgfTsKICAgICAgfSk7CgogICAgICB0ZWFyRG93bigoKSB7CiAgICAgICAgcHJlX2dlbi5leGl0Rm4gPSBleGl0OwogICAgICB9KTsKCiAgICAgIHRlc3QoJ3doZW4gdGFyZ2V0IHRlc3QgZGlyIGRvZXMgbm90IGV4aXN0JywgKCkgYXN5bmMgewogICAgICAgIGZpbmFsIHBhY2thZ2VSb290ID0KICAgICAgICAgICAgRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoJ3Rlc3Rfb3B0aW1pemVyJyk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4ocGFja2FnZVJvb3QucGF0aCwgJ3B1YnNwZWMueWFtbCcpKS5jcmVhdGVTeW5jKCk7CgogICAgICAgIGZpbmFsIHRlc3REaXIgPSBEaXJlY3RvcnkocGF0aC5qb2luKHBhY2thZ2VSb290LnBhdGgsICd0ZXN0JykpOwoKICAgICAgICBjb250ZXh0LnZhcnNbJ3BhY2thZ2Utcm9vdCddID0gcGFja2FnZVJvb3QuYWJzb2x1dGUucGF0aDsKCiAgICAgICAgYXdhaXQgZXhwZWN0TGF0ZXIoCiAgICAgICAgICAoKSA9PiBwcmVfZ2VuLnJ1bihjb250ZXh0KSwKICAgICAgICAgIHRocm93c0EoCiAgICAgICAgICAgIGlzQTxQcm9jZXNzRXhjZXB0aW9uPigpLmhhdmluZygKICAgICAgICAgICAgICAoZXgpID0+IGV4LmFyZ3VtZW50cy5maXJzdCwKICAgICAgICAgICAgICAnZXJyb3IgY29kZScsCiAgICAgICAgICAgICAgZXF1YWxzKCcxJyksCiAgICAgICAgICAgICksCiAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIHZlcmlmeSgKICAgICAgICAgICgpID0+IGNvbnRleHQubG9nZ2VyLmVycignQ291bGQgbm90IGZpbmQgZGlyZWN0b3J5ICR7dGVzdERpci5wYXRofScpLAogICAgICAgICkuY2FsbGVkKDEpOwoKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWyd0ZXN0cyddLCBpc051bGwpOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzRmx1dHRlciddLCBpc051bGwpOwogICAgICB9KTsKICAgICAgdGVzdCgnd2hlbiB0YXJnZXQgZGlyIGRvZXMgbm90IGNvbnRhaW4gYSBwdWJzcGVjLnlhbWwnLCAoKSBhc3luYyB7CiAgICAgICAgZmluYWwgcGFja2FnZVJvb3QgPQogICAgICAgICAgICBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygndGVzdF9vcHRpbWl6ZXInKTsKCiAgICAgICAgZmluYWwgdGVzdERpciA9IERpcmVjdG9yeShwYXRoLmpvaW4ocGFja2FnZVJvb3QucGF0aCwgJ3Rlc3QnKSkKICAgICAgICAgIC4uY3JlYXRlU3luYygpOwogICAgICAgIEZpbGUocGF0aC5qb2luKHRlc3REaXIucGF0aCwgJ3Rlc3QxX3Rlc3QuZGFydCcpKS5jcmVhdGVTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4odGVzdERpci5wYXRoLCAndGVzdDJfdGVzdC5kYXJ0JykpLmNyZWF0ZVN5bmMoKTsKICAgICAgICBGaWxlKHBhdGguam9pbih0ZXN0RGlyLnBhdGgsICdub190ZXN0X2hlcmUuZGFydCcpKS5jcmVhdGVTeW5jKCk7CgogICAgICAgIGNvbnRleHQudmFyc1sncGFja2FnZS1yb290J10gPSBwYWNrYWdlUm9vdC5hYnNvbHV0ZS5wYXRoOwoKICAgICAgICBhd2FpdCBleHBlY3RMYXRlcigKICAgICAgICAgICgpID0+IHByZV9nZW4ucnVuKGNvbnRleHQpLAogICAgICAgICAgdGhyb3dzQSgKICAgICAgICAgICAgaXNBPFByb2Nlc3NFeGNlcHRpb24+KCkuaGF2aW5nKAogICAgICAgICAgICAgIChleCkgPT4gZXguYXJndW1lbnRzLmZpcnN0LAogICAgICAgICAgICAgICdlcnJvciBjb2RlJywKICAgICAgICAgICAgICBlcXVhbHMoJzEnKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICksCiAgICAgICAgKTsKCiAgICAgICAgdmVyaWZ5KAogICAgICAgICAgKCkgPT4gY29udGV4dC5sb2dnZXIuZXJyKAogICAgICAgICAgICAnQ291bGQgbm90IGZpbmQgcHVic3BlYy55YW1sIGF0ICR7dGVzdERpci5wYXRofScsCiAgICAgICAgICApLAogICAgICAgICkuY2FsbGVkKDEpOwoKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWyd0ZXN0cyddLCBpc051bGwpOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzRmx1dHRlciddLCBpc051bGwpOwogICAgICB9KTsKICAgIH0pOwogIH0pOwp9Cg==",
"aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpob29rcy9wcmVfZ2VuLmRhcnQnIGFzIHByZV9nZW47CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgpjbGFzcyBNb2NrUHJvZ3Jlc3MgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgUHJvZ3Jlc3Mge30KCmNsYXNzIE1vY2tMb2dnZXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgTG9nZ2VyIHt9CgpjbGFzcyBGYWtlQ29udGV4dCBleHRlbmRzIEZha2UgaW1wbGVtZW50cyBIb29rQ29udGV4dCB7CiAgQG92ZXJyaWRlCiAgZmluYWwgbG9nZ2VyID0gTW9ja0xvZ2dlcigpOwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBPYmplY3Q/PiB2YXJzID0ge307Cn0KCnZvaWQgbWFpbigpIHsKICBsYXRlIEhvb2tDb250ZXh0IGNvbnRleHQ7CgogIHNldFVwKCgpIHsKICAgIGNvbnRleHQgPSBGYWtlQ29udGV4dCgpOwogIH0pOwoKICBncm91cCgnUHJlIGdlbiBob29rJywgKCkgewogICAgZ3JvdXAoJ0NvbXBsZXRlcycsICgpIHsKICAgICAgdGVzdCgnd2l0aCB0ZXN0IGZpbGVzIGxpc3QnLCAoKSBhc3luYyB7CiAgICAgICAgZmluYWwgcGFja2FnZVJvb3QgPQogICAgICAgICAgICBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygndGVzdF9vcHRpbWl6ZXInKTsKICAgICAgICBGaWxlKHBhdGguam9pbihwYWNrYWdlUm9vdC5wYXRoLCAncHVic3BlYy55YW1sJykpLmNyZWF0ZVN5bmMoKTsKCiAgICAgICAgZmluYWwgdGVzdERpciA9IERpcmVjdG9yeShwYXRoLmpvaW4ocGFja2FnZVJvb3QucGF0aCwgJ3Rlc3QnKSkKICAgICAgICAgIC4uY3JlYXRlU3luYygpOwogICAgICAgIEZpbGUocGF0aC5qb2luKHRlc3REaXIucGF0aCwgJ3Rlc3QxX3Rlc3QuZGFydCcpKS5jcmVhdGVTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4odGVzdERpci5wYXRoLCAndGVzdDJfdGVzdC5kYXJ0JykpLmNyZWF0ZVN5bmMoKTsKICAgICAgICBmaW5hbCBzdWJUZXN0RGlyID0gRGlyZWN0b3J5KHBhdGguam9pbih0ZXN0RGlyLnBhdGgsICdzdWJfdGVzdCcpKQogICAgICAgICAgLi5jcmVhdGVTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4oc3ViVGVzdERpci5wYXRoLCAndGVzdDFfdGVzdC5kYXJ0JykpLmNyZWF0ZVN5bmMoKTsKICAgICAgICBGaWxlKHBhdGguam9pbih0ZXN0RGlyLnBhdGgsICdub190ZXN0X2hlcmUuZGFydCcpKS5jcmVhdGVTeW5jKCk7CgogICAgICAgIGNvbnRleHQudmFyc1sncGFja2FnZS1yb290J10gPSBwYWNrYWdlUm9vdC5hYnNvbHV0ZS5wYXRoOwoKICAgICAgICBhd2FpdCBwcmVfZ2VuLnJ1bihjb250ZXh0KTsKCiAgICAgICAgZmluYWwgdGVzdHMgPSBjb250ZXh0LnZhcnNbJ3Rlc3RzJ10gYXMgTGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PjsKCiAgICAgICAgZXhwZWN0KAogICAgICAgICAgdGVzdHMsCiAgICAgICAgICBlcXVhbHMoWwogICAgICAgICAgICB7J3BhdGgnOiAndGVzdDFfdGVzdC5kYXJ0JywgJ2lkZW50aWZpZXInOiAnX2EnfSwKICAgICAgICAgICAgeydwYXRoJzogJ3Rlc3QyX3Rlc3QuZGFydCcsICdpZGVudGlmaWVyJzogJ19iJ30sCiAgICAgICAgICAgIHsncGF0aCc6ICdzdWJfdGVzdC90ZXN0MV90ZXN0LmRhcnQnLCAnaWRlbnRpZmllcic6ICdfYyd9LAogICAgICAgICAgXSksCiAgICAgICAgKTsKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydpc0ZsdXR0ZXInXSwgZmFsc2UpOwogICAgICB9KTsKCiAgICAgIHRlc3QoJ3dpdGggcHJvcGVyIGlzRmx1dHRlciBpZGVudGlmaWNhdGlvbicsICgpIGFzeW5jIHsKICAgICAgICBmaW5hbCBwYWNrYWdlUm9vdCA9CiAgICAgICAgICAgIERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCd0ZXN0X29wdGltaXplcicpOwoKICAgICAgICBGaWxlKHBhdGguam9pbihwYWNrYWdlUm9vdC5wYXRoLCAncHVic3BlYy55YW1sJykpCiAgICAgICAgICAuLmNyZWF0ZVN5bmMoKQogICAgICAgICAgLi53cml0ZUFzU3RyaW5nU3luYygnJycKZGVwZW5kZW5jaWVzOgogIGZsdXR0ZXI6CiAgICBzZGs6IGZsdXR0ZXInJycpOwoKICAgICAgICBEaXJlY3RvcnkocGF0aC5qb2luKHBhY2thZ2VSb290LnBhdGgsICd0ZXN0JykpLmNyZWF0ZVN5bmMoKTsKCiAgICAgICAgY29udGV4dC52YXJzWydwYWNrYWdlLXJvb3QnXSA9IHBhY2thZ2VSb290LmFic29sdXRlLnBhdGg7CgogICAgICAgIGF3YWl0IHByZV9nZW4ucnVuKGNvbnRleHQpOwoKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydpc0ZsdXR0ZXInXSwgdHJ1ZSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBncm91cCgnRmFpbHMnLCAoKSB7CiAgICAgIHNldFVwKCgpIHsKICAgICAgICBwcmVfZ2VuLmV4aXRGbiA9IChjb2RlKSB7CiAgICAgICAgICB0aHJvdyBQcm9jZXNzRXhjZXB0aW9uKCdleGl0JywgW2NvZGUudG9TdHJpbmcoKV0pOwogICAgICAgIH07CiAgICAgIH0pOwoKICAgICAgdGVhckRvd24oKCkgewogICAgICAgIHByZV9nZW4uZXhpdEZuID0gZXhpdDsKICAgICAgfSk7CgogICAgICB0ZXN0KCd3aGVuIHRhcmdldCB0ZXN0IGRpciBkb2VzIG5vdCBleGlzdCcsICgpIGFzeW5jIHsKICAgICAgICBmaW5hbCBwYWNrYWdlUm9vdCA9CiAgICAgICAgICAgIERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCd0ZXN0X29wdGltaXplcicpOwogICAgICAgIEZpbGUocGF0aC5qb2luKHBhY2thZ2VSb290LnBhdGgsICdwdWJzcGVjLnlhbWwnKSkuY3JlYXRlU3luYygpOwoKICAgICAgICBmaW5hbCB0ZXN0RGlyID0gRGlyZWN0b3J5KHBhdGguam9pbihwYWNrYWdlUm9vdC5wYXRoLCAndGVzdCcpKTsKCiAgICAgICAgY29udGV4dC52YXJzWydwYWNrYWdlLXJvb3QnXSA9IHBhY2thZ2VSb290LmFic29sdXRlLnBhdGg7CgogICAgICAgIGF3YWl0IGV4cGVjdExhdGVyKAogICAgICAgICAgKCkgPT4gcHJlX2dlbi5ydW4oY29udGV4dCksCiAgICAgICAgICB0aHJvd3NBKAogICAgICAgICAgICBpc0E8UHJvY2Vzc0V4Y2VwdGlvbj4oKS5oYXZpbmcoCiAgICAgICAgICAgICAgKGV4KSA9PiBleC5hcmd1bWVudHMuZmlyc3QsCiAgICAgICAgICAgICAgJ2Vycm9yIGNvZGUnLAogICAgICAgICAgICAgIGVxdWFscygnMScpLAogICAgICAgICAgICApLAogICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICB2ZXJpZnkoCiAgICAgICAgICAoKSA9PiBjb250ZXh0LmxvZ2dlci5lcnIoJ0NvdWxkIG5vdCBmaW5kIGRpcmVjdG9yeSAke3Rlc3REaXIucGF0aH0nKSwKICAgICAgICApLmNhbGxlZCgxKTsKCiAgICAgICAgZXhwZWN0KGNvbnRleHQudmFyc1sndGVzdHMnXSwgaXNOdWxsKTsKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydpc0ZsdXR0ZXInXSwgaXNOdWxsKTsKICAgICAgfSk7CiAgICAgIHRlc3QoJ3doZW4gdGFyZ2V0IGRpciBkb2VzIG5vdCBjb250YWluIGEgcHVic3BlYy55YW1sJywgKCkgYXN5bmMgewogICAgICAgIGZpbmFsIHBhY2thZ2VSb290ID0KICAgICAgICAgICAgRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoJ3Rlc3Rfb3B0aW1pemVyJyk7CgogICAgICAgIGZpbmFsIHRlc3REaXIgPSBEaXJlY3RvcnkocGF0aC5qb2luKHBhY2thZ2VSb290LnBhdGgsICd0ZXN0JykpCiAgICAgICAgICAuLmNyZWF0ZVN5bmMoKTsKICAgICAgICBGaWxlKHBhdGguam9pbih0ZXN0RGlyLnBhdGgsICd0ZXN0MV90ZXN0LmRhcnQnKSkuY3JlYXRlU3luYygpOwogICAgICAgIEZpbGUocGF0aC5qb2luKHRlc3REaXIucGF0aCwgJ3Rlc3QyX3Rlc3QuZGFydCcpKS5jcmVhdGVTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4odGVzdERpci5wYXRoLCAnbm9fdGVzdF9oZXJlLmRhcnQnKSkuY3JlYXRlU3luYygpOwoKICAgICAgICBjb250ZXh0LnZhcnNbJ3BhY2thZ2Utcm9vdCddID0gcGFja2FnZVJvb3QuYWJzb2x1dGUucGF0aDsKCiAgICAgICAgYXdhaXQgZXhwZWN0TGF0ZXIoCiAgICAgICAgICAoKSA9PiBwcmVfZ2VuLnJ1bihjb250ZXh0KSwKICAgICAgICAgIHRocm93c0EoCiAgICAgICAgICAgIGlzQTxQcm9jZXNzRXhjZXB0aW9uPigpLmhhdmluZygKICAgICAgICAgICAgICAoZXgpID0+IGV4LmFyZ3VtZW50cy5maXJzdCwKICAgICAgICAgICAgICAnZXJyb3IgY29kZScsCiAgICAgICAgICAgICAgZXF1YWxzKCcxJyksCiAgICAgICAgICAgICksCiAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIHZlcmlmeSgKICAgICAgICAgICgpID0+IGNvbnRleHQubG9nZ2VyLmVycigKICAgICAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIHB1YnNwZWMueWFtbCBhdCAke3Rlc3REaXIucGF0aH0nLAogICAgICAgICAgKSwKICAgICAgICApLmNhbGxlZCgxKTsKCiAgICAgICAgZXhwZWN0KGNvbnRleHQudmFyc1sndGVzdHMnXSwgaXNOdWxsKTsKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydpc0ZsdXR0ZXInXSwgaXNOdWxsKTsKICAgICAgfSk7CiAgICB9KTsKICB9KTsKfQo=",
"type": "text"
}
],
Expand Down