| Index: tests/compiler/dart2js/serialization_library_test.dart | 
| diff --git a/tests/compiler/dart2js/serialization_library_test.dart b/tests/compiler/dart2js/serialization_library_test.dart | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..6c1644b61cb6cd71e56de56529398309598b8bd5 | 
| --- /dev/null | 
| +++ b/tests/compiler/dart2js/serialization_library_test.dart | 
| @@ -0,0 +1,130 @@ | 
| +// Copyright (c) 2016, 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 dart2js.serialization_test; | 
| + | 
| +import 'dart:io'; | 
| +import 'memory_compiler.dart'; | 
| +import 'package:async_helper/async_helper.dart'; | 
| +import 'package:compiler/src/commandline_options.dart'; | 
| +import 'package:compiler/src/common/names.dart'; | 
| +import 'package:compiler/src/constants/constructors.dart'; | 
| +import 'package:compiler/src/constants/expressions.dart'; | 
| +import 'package:compiler/src/dart_types.dart'; | 
| +import 'package:compiler/src/compiler.dart'; | 
| +import 'package:compiler/src/diagnostics/invariant.dart'; | 
| +import 'package:compiler/src/elements/elements.dart'; | 
| +import 'package:compiler/src/elements/visitor.dart'; | 
| +import 'package:compiler/src/ordered_typeset.dart'; | 
| +import 'package:compiler/src/serialization/element_serialization.dart'; | 
| +import 'package:compiler/src/serialization/json_serializer.dart'; | 
| +import 'package:compiler/src/serialization/serialization.dart'; | 
| + | 
| +import 'serialization_test.dart'; | 
| + | 
| +main(List<String> arguments) { | 
| +  // Ensure that we can print out constant expressions. | 
| +  DEBUG_MODE = true; | 
| + | 
| +  Uri entryPoint; | 
| +  String outPath; | 
| +  int shardCount = 3; | 
| +  bool prettyPrint = false; | 
| +  for (String arg in arguments) { | 
| +    if (arg.startsWith('--')) { | 
| +      if (arg.startsWith('--out=')) { | 
| +        outPath = arg.substring('--out='.length); | 
| +      } else if (arg == '--pretty-print') { | 
| +        prettyPrint = true; | 
| +      } else if (arg.startsWith('--shards=')) { | 
| +        shardCount = int.parse(arg.substring('--shards='.length)); | 
| +      } else { | 
| +        print("Unknown option $arg"); | 
| +      } | 
| +    } else { | 
| +      if (entryPoint != null) { | 
| +        print("Multiple entrypoints are not supported."); | 
| +      } | 
| +      entryPoint = Uri.parse(arg); | 
| +    } | 
| +  } | 
| +  if (entryPoint == null) { | 
| +    entryPoint = Uris.dart_core; | 
| +  } | 
| +  asyncTest(() async { | 
| +    CompilationResult result = await runCompiler( | 
| +        entryPoint: entryPoint, options: [Flags.analyzeAll]); | 
| +    Compiler compiler = result.compiler; | 
| +    testSerialization(compiler.libraryLoader.libraries, | 
| +                      outPath: outPath, | 
| +                      prettyPrint: prettyPrint, | 
| +                      shardCount: shardCount); | 
| +  }); | 
| +} | 
| + | 
| +void testSerialization(Iterable<LibraryElement> libraries1, | 
| +                       {String outPath, | 
| +                        bool prettyPrint, | 
| +                        int shardCount: 3}) { | 
| +  if (shardCount < 1 || shardCount > libraries1.length) { | 
| +    shardCount = libraries1.length; | 
| +  } | 
| +  List<List<LibraryElement>> librarySplits = <List<LibraryElement>>[]; | 
| +  int offset = 0; | 
| +  int shardSize = (libraries1.length / shardCount).ceil(); | 
| +  for (int shard = 0; shard < shardCount; shard++) { | 
| +    List<LibraryElement> libraries = <LibraryElement>[]; | 
| +    for (int index = 0; index < shardSize; index++) { | 
| +      if (offset + index < libraries1.length) { | 
| +        libraries.add(libraries1.elementAt(offset + index)); | 
| +      } | 
| +    } | 
| +    librarySplits.add(libraries); | 
| +    offset += shardSize; | 
| +  } | 
| +  print(librarySplits.join('\n')); | 
| +  List<String> texts = <String>[]; | 
| +  for (int shard = 0; shard < shardCount; shard++) { | 
| +    List<LibraryElement> libraries = librarySplits[shard]; | 
| +    Serializer serializer = new Serializer( | 
| +        shouldInclude: (e) => libraries.contains(e.library)); | 
| +    for (LibraryElement library in libraries) { | 
| +      serializer.serialize(library); | 
| +    } | 
| +    String text = serializer.toText(const JsonSerializationEncoder()); | 
| +    String outText = text; | 
| +    if (prettyPrint) { | 
| +      outText = serializer.prettyPrint(); | 
| +    } | 
| +    if (outPath != null) { | 
| +      String name = outPath; | 
| +      String ext = ''; | 
| +      int dotPos = outPath.lastIndexOf('.'); | 
| +      if (dotPos != -1) { | 
| +        name = outPath.substring(0, dotPos); | 
| +        ext = outPath.substring(dotPos); | 
| +      } | 
| +      new File('$name$shard$ext').writeAsStringSync(outText); | 
| +    } else if (prettyPrint) { | 
| +      print(outText); | 
| +    } | 
| +    texts.add(text); | 
| +  } | 
| +  DeserializationContext deserializationContext = | 
| +      new DeserializationContext(); | 
| +  for (int shard = 0; shard < shardCount; shard++) { | 
| +    new Deserializer.fromText( | 
| +        deserializationContext, texts[shard], const JsonSerializationDecoder()); | 
| +  } | 
| +  List<LibraryElement> libraries2 = <LibraryElement>[]; | 
| +  for (LibraryElement library1 in libraries1) { | 
| +    LibraryElement library2 = | 
| +        deserializationContext.lookupLibrary(library1.canonicalUri); | 
| +    if (library2 == null) { | 
| +      throw new ArgumentError('No library ${library1.canonicalUri} found.'); | 
| +    } | 
| +    checkLibraryContent('library1', 'library2', 'library', library1, library2); | 
| +    libraries2.add(library2); | 
| +  } | 
| +} | 
|  |