12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/messaging/native_messaging_test_util.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_file_value_serializer.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/win/registry.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WriteTestNativeHostManifest(const base::FilePath& target_dir, 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& host_name, 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::FilePath& host_path, 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool user_level) { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> manifest(new base::DictionaryValue()); 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manifest->SetString("name", host_name); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manifest->SetString("description", "Native Messaging Echo Test"); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manifest->SetString("type", "stdio"); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manifest->SetString("path", host_path.AsUTF8Unsafe()); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> origins(new base::ListValue()); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origins->AppendString(base::StringPrintf( 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "chrome-extension://%s/", ScopedTestNativeMessagingHost::kExtensionId)); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manifest->Set("allowed_origins", origins.release()); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::FilePath manifest_path = target_dir.AppendASCII(host_name + ".json"); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JSONFileValueSerializer serializer(manifest_path); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(serializer.Serialize(*manifest)); 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN) 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch HKEY root_key = user_level ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::string16 key = L"SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\" + 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::UTF8ToUTF16(host_name); 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::win::RegKey manifest_key( 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch root_key, key.c_str(), 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_CREATE_LINK); 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_EQ(ERROR_SUCCESS, 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch manifest_key.WriteValue(NULL, manifest_path.value().c_str())); 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char ScopedTestNativeMessagingHost::kHostName[] = 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "com.google.chrome.test.echo"; 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char ScopedTestNativeMessagingHost::kBinaryMissingHostName[] = 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "com.google.chrome.test.host_binary_missing"; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char ScopedTestNativeMessagingHost::kExtensionId[] = 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "knldjmfmopnpolahpmmgbagdohdnhkik"; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ScopedTestNativeMessagingHost::ScopedTestNativeMessagingHost() {} 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ScopedTestNativeMessagingHost::RegisterTestHost(bool user_level) { 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedTestNativeMessagingHost test_host; 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::FilePath test_user_data_dir; 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_user_data_dir)); 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch test_user_data_dir = test_user_data_dir.AppendASCII("native_messaging") 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch .AppendASCII("native_hosts"); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HKEY root_key = user_level ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci registry_override_.OverrideRegistry(root_key); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) path_override_.reset(new base::ScopedPathOverride( 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_level ? chrome::DIR_USER_NATIVE_MESSAGING 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : chrome::DIR_NATIVE_MESSAGING, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temp_dir_.path())); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_POSIX) 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::FilePath host_path = test_user_data_dir.AppendASCII("echo.py"); 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::FilePath host_path = test_user_data_dir.AppendASCII("echo.bat"); 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_NO_FATAL_FAILURE(WriteTestNativeHostManifest( 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch temp_dir_.path(), kHostName, host_path, user_level)); 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_NO_FATAL_FAILURE(WriteTestNativeHostManifest( 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch temp_dir_.path(), kBinaryMissingHostName, 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch test_user_data_dir.AppendASCII("missing_nm_binary.exe"), user_level)); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ScopedTestNativeMessagingHost::~ScopedTestNativeMessagingHost() {} 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 102