15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/nacl/nacl_browsertest_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <stdlib.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/nacl/common/nacl_switches.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef content::TestMessageHandler::MessageResponse MessageResponse;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageResponse StructuredMessageHandler::HandleMessage(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& json) {
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> value;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONReader reader(base::JSON_ALLOW_TRAILING_COMMAS);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Automation messages are stringified before they are sent because the
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // automation channel cannot handle arbitrary objects.  This means we
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to decode the json twice to get the original message.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value.reset(reader.ReadToValue(json));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value.get())
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InternalError("Could parse automation JSON: " + json +
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         " because " + reader.GetErrorMessage());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string temp;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value->GetAsString(&temp))
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InternalError("Message was not a string: " + json);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value.reset(reader.ReadToValue(temp));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value.get())
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InternalError("Could not parse message JSON: " + temp +
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         " because " + reader.GetErrorMessage());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* msg;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value->GetAsDictionary(&msg))
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InternalError("Message was not an object: " + temp);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string type;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!msg->GetString("type", &type))
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MissingField("unknown", "type");
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HandleStructuredMessage(type, msg);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageResponse StructuredMessageHandler::MissingField(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& type,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& field) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return InternalError(type + " message did not have field: " + field);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageResponse StructuredMessageHandler::InternalError(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& reason) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetError(reason);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DONE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LoadTestMessageHandler::LoadTestMessageHandler()
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : test_passed_(false) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LoadTestMessageHandler::Log(const std::string& type,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& message) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(ncbray) better logging.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << type << " " << message;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageResponse LoadTestMessageHandler::HandleStructuredMessage(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const std::string& type,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   base::DictionaryValue* msg) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == "Log") {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string message;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!msg->GetString("message", &message))
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return MissingField(type, "message");
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Log("LOG", message);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CONTINUE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type == "Shutdown") {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string message;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!msg->GetString("message", &message))
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return MissingField(type, "message");
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!msg->GetBoolean("passed", &test_passed_))
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return MissingField(type, "passed");
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Log("SHUTDOWN", message);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return DONE;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InternalError("Unknown message type: " + type);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A message handler for nacl_integration tests ported to be browser_tests.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// nacl_integration tests report to their test jig using a series of RPC calls
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that are encoded as URL requests. When these tests run as browser_tests,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// they make the same RPC requests, but use the automation channel instead of
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL requests. This message handler decodes and responds to these requests.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NaClIntegrationMessageHandler : public StructuredMessageHandler {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClIntegrationMessageHandler();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Log(const std::string& message);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual MessageResponse HandleStructuredMessage(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& type,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::DictionaryValue* msg) OVERRIDE;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool test_passed() const {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_passed_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool test_passed_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NaClIntegrationMessageHandler);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NaClIntegrationMessageHandler::NaClIntegrationMessageHandler()
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : test_passed_(false) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NaClIntegrationMessageHandler::Log(const std::string& message) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(ncbray) better logging.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << "|||| " << message;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageResponse NaClIntegrationMessageHandler::HandleStructuredMessage(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& type,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* msg) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == "TestLog") {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string message;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!msg->GetString("message", &message))
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return MissingField(type, "message");
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Log(message);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CONTINUE;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type == "Shutdown") {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string message;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!msg->GetString("message", &message))
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return MissingField(type, "message");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!msg->GetBoolean("passed", &test_passed_))
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return MissingField(type, "passed");
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Log(message);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return DONE;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type == "Ping") {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CONTINUE;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (type == "JavaScriptIsAlive") {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CONTINUE;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InternalError("Unknown message type: " + type);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NaCl browser tests serve files out of the build directory because nexes and
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pexes are artifacts of the build.  To keep things tidy, all test data is kept
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in a subdirectory.  Several variants of a test may be run, for example when
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// linked against newlib and when linked against glibc.  These variants are kept
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in different subdirectories.  For example, the build directory will look
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// something like this on Linux:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// out/
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     Release/
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             nacl_test_data/
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                            newlib/
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                            glibc/
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//                            pnacl/
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool GetNaClVariantRoot(const base::FilePath::StringType& variant,
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::FilePath* document_root) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ui_test_utils::GetRelativeBuildDirectory(document_root))
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *document_root = document_root->Append(FILE_PATH_LITERAL("nacl_test_data"));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *document_root = document_root->Append(variant);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static void AddPnaclParm(const base::FilePath::StringType& url,
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         base::FilePath::StringType* url_with_parm) {
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (url.find(FILE_PATH_LITERAL("?")) == base::FilePath::StringType::npos) {
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    *url_with_parm = url + FILE_PATH_LITERAL("?pnacl=1");
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  } else {
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    *url_with_parm = url + FILE_PATH_LITERAL("&pnacl=1");
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NaClBrowserTestBase::NaClBrowserTestBase() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NaClBrowserTestBase::~NaClBrowserTestBase() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid NaClBrowserTestBase::SetUpCommandLine(base::CommandLine* command_line) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line->AppendSwitch(switches::kEnableNaCl);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void NaClBrowserTestBase::SetUpOnMainThread() {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartTestServer()) << "Cannot start test server.";
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NaClBrowserTestBase::GetDocumentRoot(base::FilePath* document_root) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetNaClVariantRoot(Variant(), document_root);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool NaClBrowserTestBase::IsAPnaclTest() {
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return false;
2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL NaClBrowserTestBase::TestURL(
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::StringType& url_fragment) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath expanded_url = base::FilePath(FILE_PATH_LITERAL("files"));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expanded_url = expanded_url.Append(url_fragment);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return test_server_->GetURL(expanded_url.MaybeAsASCII());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool NaClBrowserTestBase::RunJavascriptTest(
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const GURL& url,
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::TestMessageHandler* handler) {
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::JavascriptTestObserver observer(
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handler);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return observer.Run();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NaClBrowserTestBase::RunLoadTest(
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::StringType& test_file) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestMessageHandler handler;
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath::StringType test_file_with_pnacl = test_file;
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (IsAPnaclTest()) {
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    AddPnaclParm(test_file, &test_file_with_pnacl);
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath::StringType test_file_with_both = test_file_with_pnacl;
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool ok = RunJavascriptTest(TestURL(test_file_with_both), &handler);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ok) << handler.error_message();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(handler.test_passed()) << "Test failed.";
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NaClBrowserTestBase::RunNaClIntegrationTest(
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::FilePath::StringType& url_fragment, bool full_url) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NaClIntegrationMessageHandler handler;
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath::StringType url_fragment_with_pnacl = url_fragment;
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (IsAPnaclTest()) {
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    AddPnaclParm(url_fragment, &url_fragment_with_pnacl);
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath::StringType url_fragment_with_both = url_fragment_with_pnacl;
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool ok = RunJavascriptTest(full_url
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              ? GURL(url_fragment_with_both)
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              : TestURL(url_fragment_with_both),
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              &handler);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ok) << handler.error_message();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(handler.test_passed()) << "Test failed.";
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NaClBrowserTestBase::StartTestServer() {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch the web server.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath document_root;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetDocumentRoot(&document_root))
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  test_server_.reset(new net::SpawnedTestServer(
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         net::SpawnedTestServer::TYPE_HTTP,
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         net::SpawnedTestServer::kLocalhost,
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         document_root));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return test_server_->Start();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath::StringType NaClBrowserTestNewlib::Variant() {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FILE_PATH_LITERAL("newlib");
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath::StringType NaClBrowserTestGLibc::Variant() {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FILE_PATH_LITERAL("glibc");
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath::StringType NaClBrowserTestPnacl::Variant() {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FILE_PATH_LITERAL("pnacl");
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool NaClBrowserTestPnacl::IsAPnaclTest() {
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbase::FilePath::StringType NaClBrowserTestNonSfiMode::Variant() {
288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return FILE_PATH_LITERAL("libc-free");
289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid NaClBrowserTestNonSfiMode::SetUpCommandLine(
292effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::CommandLine* command_line) {
293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NaClBrowserTestBase::SetUpCommandLine(command_line);
294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  command_line->AppendSwitch(switches::kEnableNaClNonSfiMode);
295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath::StringType NaClBrowserTestStatic::Variant() {
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FILE_PATH_LITERAL("static");
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NaClBrowserTestStatic::GetDocumentRoot(base::FilePath* document_root) {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *document_root = base::FilePath(FILE_PATH_LITERAL("chrome/test/data/nacl"));
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::FilePath::StringType NaClBrowserTestPnaclNonSfi::Variant() {
3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return FILE_PATH_LITERAL("nonsfi");
3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid NaClBrowserTestPnaclNonSfi::SetUpCommandLine(
3115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    base::CommandLine* command_line) {
3125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NaClBrowserTestBase::SetUpCommandLine(command_line);
3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  command_line->AppendSwitch(switches::kEnableNaClNonSfiMode);
3145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NaClBrowserTestNewlibExtension::SetUpCommandLine(
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CommandLine* command_line) {
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NaClBrowserTestBase::SetUpCommandLine(command_line);
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath src_root;
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_root));
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Extension-based tests should specialize the GetDocumentRoot() / Variant()
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to point at the isolated the test extension directory.
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Otherwise, multiple NaCl extensions tests will end up sharing the
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // same directory when loading the extension files.
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath document_root;
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(GetDocumentRoot(&document_root));
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Document root is relative to source root, and source root may not be CWD.
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  command_line->AppendSwitchPath(switches::kLoadExtension,
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 src_root.Append(document_root));
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
3336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void NaClBrowserTestGLibcExtension::SetUpCommandLine(
3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    CommandLine* command_line) {
3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NaClBrowserTestBase::SetUpCommandLine(command_line);
3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::FilePath src_root;
3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_root));
3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Extension-based tests should specialize the GetDocumentRoot() / Variant()
3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // to point at the isolated the test extension directory.
3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Otherwise, multiple NaCl extensions tests will end up sharing the
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // same directory when loading the extension files.
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::FilePath document_root;
3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(GetDocumentRoot(&document_root));
3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Document root is relative to source root, and source root may not be CWD.
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  command_line->AppendSwitchPath(switches::kLoadExtension,
3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                 src_root.Append(document_root));
3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
351