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 "base/command_line.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h" 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/ppapi/ppapi_test.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/nacl/common/nacl_switches.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const base::FilePath::CharType kMockNaClGdb[] = 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("mock_nacl_gdb.exe"); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("mock_nacl_gdb"); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NaClGdbTest : public PPAPINaClNewlibTest { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NaClGdbTest() { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPAPINaClNewlibTest::SetUpCommandLine(command_line); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath mock_nacl_gdb; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(PathService::Get(base::DIR_EXE, &mock_nacl_gdb)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_nacl_gdb = mock_nacl_gdb.Append(kMockNaClGdb); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath(switches::kNaClGdb, mock_nacl_gdb); 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(base::CreateTemporaryFile(&script_)); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath(switches::kNaClGdbScript, script_); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunWithNaClGdb(std::string test_name) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath mock_nacl_gdb_file; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env(base::Environment::Create()); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string content; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(halyavin): Make this test work on Windows 32-bit. Currently this 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not possible because NaCl doesn't work without sandbox since 1Gb of 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // space is not reserved. We can't reserve 1Gb of space because 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base::LaunchProcess doesn't support creating suspended processes. We need 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to either add suspended process support to base::LaunchProcess or use 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Win API. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::OSInfo::GetInstance()->wow64_status() == 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::OSInfo::WOW64_DISABLED) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(base::CreateTemporaryFile(&mock_nacl_gdb_file)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("MOCK_NACL_GDB", mock_nacl_gdb_file.AsUTF8Unsafe()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTestViaHTTP(test_name); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->UnSetVar("MOCK_NACL_GDB"); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(mock_nacl_gdb_file, &content)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("PASS", content.c_str()); 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DeleteFile(mock_nacl_gdb_file, false)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content.clear(); 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(script_, &content)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("PASS", content.c_str()); 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DeleteFile(script_, false)); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath script_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails on the ASAN test bot. See http://crbug.com/122219 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ADDRESS_SANITIZER) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_Empty DISABLED_Empty 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_Empty Empty 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(NaClGdbTest, MAYBE_Empty) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunWithNaClGdb("Empty"); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 81