Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Unified Diff: packages/intl/test/message_extraction/message_extraction_test.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: packages/intl/test/message_extraction/message_extraction_test.dart
diff --git a/packages/intl/test/message_extraction/message_extraction_test.dart b/packages/intl/test/message_extraction/message_extraction_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..6b7de6b2e056f591540926b3c6a002b53b3443e7
--- /dev/null
+++ b/packages/intl/test/message_extraction/message_extraction_test.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2013, 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.
+
+library message_extraction_test;
+
+import 'package:unittest/unittest.dart';
+import 'dart:io';
+import 'dart:async';
+import 'dart:convert';
+import 'package:path/path.dart' as path;
+import '../data_directory.dart';
+
+final dart = Platform.executable;
+
+/** Should we use deferred loading. */
+bool useDeferredLoading = true;
+
+String get _deferredLoadPrefix => useDeferredLoading ? '' : 'no-';
+
+String get deferredLoadArg => '--${_deferredLoadPrefix}use-deferred-loading';
+
+/** The VM arguments we were given, most important package-root. */
+final vmArgs = Platform.executableArguments;
+
+/**
+ * For testing we move the files into a temporary directory so as not to leave
+ * generated files around after a failed test. For debugging, we omit that
+ * step if [useLocalDirectory] is true. The place we move them to is saved as
+ * [tempDir].
+ */
+String get tempDir => _tempDir == null ? _tempDir = _createTempDir() : _tempDir;
+var _tempDir;
+_createTempDir() => useLocalDirectory
+ ? '.'
+ : Directory.systemTemp.createTempSync('message_extraction_test').path;
+
+var useLocalDirectory = false;
+
+/**
+ * Translate a relative file path into this test directory. This is
+ * applied to all the arguments of [run]. It will ignore a string that
+ * is an absolute path or begins with "--", because some of the arguments
+ * might be command-line options.
+ */
+String asTestDirPath([String s]) {
+ if (s == null || s.startsWith("--") || path.isAbsolute(s)) return s;
+ return path.join(intlDirectory, 'test', 'message_extraction', s);
+}
+
+/**
+ * Translate a relative file path into our temp directory. This is
+ * applied to all the arguments of [run]. It will ignore a string that
+ * is an absolute path or begins with "--", because some of the arguments
+ * might be command-line options.
+ */
+String asTempDirPath([String s]) {
+ if (s == null || s.startsWith("--") || path.isAbsolute(s)) return s;
+ return path.join(tempDir, s);
+}
+
+main(arguments) {
+ // If debugging, use --local to avoid copying everything to temporary
+ // directories to make it even harder to debug. Note that this will also
+ // not delete the generated files, so may require manual cleanup.
+ if (arguments.contains("--local")) {
+ print("Testing using local directory for generated files");
+ useLocalDirectory = true;
+ }
+ setUp(copyFilesToTempDirectory);
+ tearDown(deleteGeneratedFiles);
+ test("Test round trip message extraction, translation, code generation, "
+ "and printing", () {
+ var makeSureWeVerify = expectAsync(runAndVerify);
+ return extractMessages(null).then((result) {
+ return generateTranslationFiles(result);
+ }).then((result) {
+ return generateCodeFromTranslation(result);
+ }).then(makeSureWeVerify).then(checkResult);
+ });
+}
+
+void copyFilesToTempDirectory() {
+ if (useLocalDirectory) return;
+ var files = [
+ asTestDirPath('sample_with_messages.dart'),
+ asTestDirPath('part_of_sample_with_messages.dart'),
+ asTestDirPath('verify_messages.dart'),
+ asTestDirPath('run_and_verify.dart'),
+ asTestDirPath('embedded_plural_text_before.dart'),
+ asTestDirPath('embedded_plural_text_after.dart'),
+ asTestDirPath('print_to_list.dart')
+ ];
+ for (var filename in files) {
+ var file = new File(filename);
+ file.copySync(path.join(tempDir, path.basename(filename)));
+ }
+}
+
+void deleteGeneratedFiles() {
+ if (useLocalDirectory) return;
+ try {
+ new Directory(tempDir).deleteSync(recursive: true);
+ } on Error catch (e) {
+ print("Failed to delete $tempDir");
+ print("Exception:\n$e");
+ }
+}
+
+/**
+ * Run the process with the given list of filenames, which we assume
+ * are in dir() and need to be qualified in case that's not our working
+ * directory.
+ */
+Future<ProcessResult> run(
+ ProcessResult previousResult, List<String> filenames) {
+ // If there's a failure in one of the sub-programs, print its output.
+ checkResult(previousResult);
+ var filesInTheRightDirectory = filenames
+ .map((x) => asTempDirPath(x))
+ .map((x) => path.normalize(x))
+ .toList();
+ // Inject the script argument --output-dir in between the script and its
+ // arguments.
+ var args = []
+ ..addAll(vmArgs)
+ ..add(filesInTheRightDirectory.first)
+ ..addAll(["--output-dir=$tempDir"])
+ ..addAll(filesInTheRightDirectory.skip(1));
+ var result =
+ Process.run(dart, args, stdoutEncoding: UTF8, stderrEncoding: UTF8);
+ return result;
+}
+
+void checkResult(ProcessResult previousResult) {
+ if (previousResult != null) {
+ if (previousResult.exitCode != 0) {
+ print("Error running sub-program:");
+ }
+ print(previousResult.stdout);
+ print(previousResult.stderr);
+ print("exitCode=${previousResult.exitCode}");
+ // Fail the test.
+ expect(previousResult.exitCode, 0);
+ }
+}
+
+Future<ProcessResult> extractMessages(ProcessResult previousResult) => run(
+ previousResult, [
+ asTestDirPath('../../bin/extract_to_arb.dart'),
+ '--suppress-warnings',
+ 'sample_with_messages.dart',
+ 'part_of_sample_with_messages.dart'
+]);
+
+Future<ProcessResult> generateTranslationFiles(ProcessResult previousResult) =>
+ run(previousResult, [
+ asTestDirPath('make_hardcoded_translation.dart'),
+ 'intl_messages.arb'
+]);
+
+Future<ProcessResult> generateCodeFromTranslation(
+ ProcessResult previousResult) => run(previousResult, [
+ asTestDirPath('../../bin/generate_from_arb.dart'),
+ deferredLoadArg,
+ '--generated-file-prefix=foo_',
+ 'sample_with_messages.dart',
+ 'part_of_sample_with_messages.dart',
+ 'translation_fr.arb',
+ 'translation_de_DE.arb'
+]);
+
+Future<ProcessResult> runAndVerify(ProcessResult previousResult) =>
+ run(previousResult, [asTempDirPath('run_and_verify.dart')]);

Powered by Google App Engine
This is Rietveld 408576698