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