Shard Travis job into three pieces (#8232)

diff --git a/dev/bots/test.dart b/dev/bots/test.dart
index 942e420..1a2e105 100644
--- a/dev/bots/test.dart
+++ b/dev/bots/test.dart
@@ -13,86 +13,92 @@
 /// script using FLUTTER_TEST_ARGS=--local-engine=host_debug_unopt to
 /// use your own build of the engine.
 Future<Null> main() async {
-  // Analyze all the Dart code in the repo.
-  await _runFlutterAnalyze(flutterRoot,
+  if (Platform.environment['SHARD'] == 'docs') {
+    print('\x1B[32mDONE: test.dart does nothing in the docs shard.\x1B[0m');
+  } else if (Platform.environment['SHARD'] == 'analyze') {
+    // Analyze all the Dart code in the repo.
+    await _runFlutterAnalyze(flutterRoot,
       options: <String>['--flutter-repo'],
-  );
+    );
 
-  // Verify that the tests actually return failure on failure and success on success.
-  String automatedTests = p.join(flutterRoot, 'dev', 'automated_tests');
-  await _runFlutterTest(automatedTests,
+    await _runCmd(dart, <String>[p.join(flutterRoot, 'dev', 'tools', 'mega_gallery.dart')],
+      workingDirectory: flutterRoot,
+    );
+    await _runFlutterAnalyze(p.join(flutterRoot, 'dev', 'benchmarks', 'mega_gallery'),
+      options: <String>['--watch', '--benchmark'],
+    );
+
+    print('\x1B[32mDONE: Analysis successful.\x1B[0m');
+  } else {
+    // Verify that the tests actually return failure on failure and success on success.
+    String automatedTests = p.join(flutterRoot, 'dev', 'automated_tests');
+    await _runFlutterTest(automatedTests,
       script: p.join('test_smoke_test', 'fail_test.dart'),
       expectFailure: true,
       printOutput: false,
-  );
-  await _runFlutterTest(automatedTests,
+    );
+    await _runFlutterTest(automatedTests,
       script: p.join('test_smoke_test', 'pass_test.dart'),
       printOutput: false,
-  );
-  await _runFlutterTest(automatedTests,
+    );
+    await _runFlutterTest(automatedTests,
       script: p.join('test_smoke_test', 'crash1_test.dart'),
       expectFailure: true,
       printOutput: false,
-  );
-  await _runFlutterTest(automatedTests,
+    );
+    await _runFlutterTest(automatedTests,
       script: p.join('test_smoke_test', 'crash2_test.dart'),
       expectFailure: true,
       printOutput: false,
-  );
-  await _runFlutterTest(automatedTests,
+    );
+    await _runFlutterTest(automatedTests,
       script: p.join('test_smoke_test', 'syntax_error_test.broken_dart'),
       expectFailure: true,
       printOutput: false,
-  );
-  await _runFlutterTest(automatedTests,
+    );
+    await _runFlutterTest(automatedTests,
       script: p.join('test_smoke_test', 'missing_import_test.broken_dart'),
       expectFailure: true,
       printOutput: false,
-  );
-  await _runCmd(flutter, <String>['drive', '--use-existing-app', '-t', p.join('test_driver', 'failure.dart')],
+    );
+    await _runCmd(flutter, <String>['drive', '--use-existing-app', '-t', p.join('test_driver', 'failure.dart')],
       workingDirectory: p.join(flutterRoot, 'packages', 'flutter_driver'),
       expectFailure: true,
       printOutput: false,
-  );
+    );
 
-  List<String> coverageFlags = <String>[];
-  if (Platform.environment['TRAVIS'] != null && Platform.environment['TRAVIS_PULL_REQUEST'] == 'false')
-    coverageFlags.add('--coverage');
+    List<String> coverageFlags = <String>[];
+    if (Platform.environment['TRAVIS'] != null && Platform.environment['TRAVIS_PULL_REQUEST'] == 'false')
+      coverageFlags.add('--coverage');
 
-  // Run tests.
-  await _runFlutterTest(p.join(flutterRoot, 'packages', 'flutter'),
+    // Run tests.
+    await _runFlutterTest(p.join(flutterRoot, 'packages', 'flutter'),
       options: coverageFlags,
-  );
-  await _runAllDartTests(p.join(flutterRoot, 'packages', 'flutter_driver'));
-  await _runFlutterTest(p.join(flutterRoot, 'packages', 'flutter_test'));
-  await _runFlutterTest(p.join(flutterRoot, 'packages', 'flutter_markdown'));
-  await _runAllDartTests(p.join(flutterRoot, 'packages', 'flutter_tools'),
+    );
+    await _runAllDartTests(p.join(flutterRoot, 'packages', 'flutter_driver'));
+    await _runFlutterTest(p.join(flutterRoot, 'packages', 'flutter_test'));
+    await _runFlutterTest(p.join(flutterRoot, 'packages', 'flutter_markdown'));
+    await _runAllDartTests(p.join(flutterRoot, 'packages', 'flutter_tools'),
       environment: <String, String>{ 'FLUTTER_ROOT': flutterRoot },
-  );
+    );
 
-  await _runAllDartTests(p.join(flutterRoot, 'dev', 'devicelab'));
-  await _runFlutterTest(p.join(flutterRoot, 'dev', 'manual_tests'));
-  await _runFlutterTest(p.join(flutterRoot, 'examples', 'hello_world'));
-  await _runFlutterTest(p.join(flutterRoot, 'examples', 'layers'));
-  await _runFlutterTest(p.join(flutterRoot, 'examples', 'stocks'));
-  await _runFlutterTest(p.join(flutterRoot, 'examples', 'flutter_gallery'));
+    await _runAllDartTests(p.join(flutterRoot, 'dev', 'devicelab'));
+    await _runFlutterTest(p.join(flutterRoot, 'dev', 'manual_tests'));
+    await _runFlutterTest(p.join(flutterRoot, 'examples', 'hello_world'));
+    await _runFlutterTest(p.join(flutterRoot, 'examples', 'layers'));
+    await _runFlutterTest(p.join(flutterRoot, 'examples', 'stocks'));
+    await _runFlutterTest(p.join(flutterRoot, 'examples', 'flutter_gallery'));
 
-  await _runCmd(dart, <String>[p.join(flutterRoot, 'dev', 'tools', 'mega_gallery.dart')],
-      workingDirectory: flutterRoot,
-  );
-  await _runFlutterAnalyze(p.join(flutterRoot, 'dev', 'benchmarks', 'mega_gallery'),
-      options: <String>['--watch', '--benchmark'],
-  );
-
-  print('\x1B[32mDONE: All tests successful.\x1B[0m');
+    print('\x1B[32mDONE: All tests successful.\x1B[0m');
+  }
 }
 
 Future<Null> _runCmd(String executable, List<String> arguments, {
-    String workingDirectory,
-    Map<String, String> environment,
-    bool expectFailure: false,
-    bool printOutput: true,
-    bool skip: false,
+  String workingDirectory,
+  Map<String, String> environment,
+  bool expectFailure: false,
+  bool printOutput: true,
+  bool skip: false,
 }) async {
   String cmd = '${p.relative(executable)} ${arguments.join(' ')}';
   String relativeWorkingDir = p.relative(workingDirectory);
@@ -103,8 +109,8 @@
   _printProgress('RUNNING', relativeWorkingDir, cmd);
 
   Process process = await Process.start(executable, arguments,
-      workingDirectory: workingDirectory,
-      environment: environment,
+    workingDirectory: workingDirectory,
+    environment: environment,
   );
 
   if (printOutput) {
@@ -115,9 +121,9 @@
   int exitCode = await process.exitCode;
   if ((exitCode == 0) == expectFailure) {
     print(
-        '\x1B[31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1B[0m\n'
-        '\x1B[1mERROR:\x1B[31m Last command exited with $exitCode (expected: ${expectFailure ? 'non-zero' : 'zero'}).\x1B[0m\n'
-        '\x1B[31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1B[0m'
+      '\x1B[31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1B[0m\n'
+      '\x1B[1mERROR:\x1B[31m Last command exited with $exitCode (expected: ${expectFailure ? 'non-zero' : 'zero'}).\x1B[0m\n'
+      '\x1B[31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1B[0m'
     );
     exit(1);
   }
@@ -136,28 +142,28 @@
   if (script != null)
     args.add(script);
   return _runCmd(flutter, args,
-      workingDirectory: workingDirectory,
-      expectFailure: expectFailure,
-      printOutput: printOutput,
-      skip: skip || Platform.isWindows, // TODO(goderbauer): run on Windows when sky_shell is available
+    workingDirectory: workingDirectory,
+    expectFailure: expectFailure,
+    printOutput: printOutput,
+    skip: skip || Platform.isWindows, // TODO(goderbauer): run on Windows when sky_shell is available
   );
 }
 
 Future<Null> _runAllDartTests(String workingDirectory, {
-    Map<String, String> environment,
+  Map<String, String> environment,
 }) {
   List<String> args = <String>['--checked', p.join('test', 'all.dart')];
   return _runCmd(dart, args,
-      workingDirectory: workingDirectory,
-      environment: environment,
+    workingDirectory: workingDirectory,
+    environment: environment,
   );
 }
 
 Future<Null> _runFlutterAnalyze(String workingDirectory, {
-    List<String> options: const <String>[]
+  List<String> options: const <String>[]
 }) {
   return _runCmd(flutter, <String>['analyze']..addAll(options),
-      workingDirectory: workingDirectory,
+    workingDirectory: workingDirectory,
   );
 }