iOS gtest launcher: get list of tests from executable running in simulator

BUG=426870
[email protected], [email protected]

Review URL: https://codereview.chromium.org/838603004

Cr-Commit-Position: refs/heads/master@{#311652}
diff --git a/base/test/gtest_util.cc b/base/test/gtest_util.cc
index 47fd639..f98320c 100644
--- a/base/test/gtest_util.cc
+++ b/base/test/gtest_util.cc
@@ -40,4 +40,39 @@
   return serializer.Serialize(root);
 }
 
+bool ReadTestNamesFromFile(const FilePath& path,
+                           std::vector<SplitTestName>* output) {
+  JSONFileValueSerializer deserializer(path);
+  int error_code = 0;
+  std::string error_message;
+  scoped_ptr<base::Value> value(
+      deserializer.Deserialize(&error_code, &error_message));
+  if (!value.get())
+    return false;
+
+  base::ListValue* tests = nullptr;
+  if (!value->GetAsList(&tests))
+    return false;
+
+  std::vector<base::SplitTestName> result;
+  for (base::ListValue::iterator i = tests->begin(); i != tests->end(); ++i) {
+    base::DictionaryValue* test = nullptr;
+    if (!(*i)->GetAsDictionary(&test))
+      return false;
+
+    std::string test_case_name;
+    if (!test->GetStringASCII("test_case_name", &test_case_name))
+      return false;
+
+    std::string test_name;
+    if (!test->GetStringASCII("test_name", &test_name))
+      return false;
+
+    result.push_back(std::make_pair(test_case_name, test_name));
+  }
+
+  output->swap(result);
+  return true;
+}
+
 }  // namespace