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