|  | // Copyright 2018 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "extensions/browser/api/bluetooth_socket/bluetooth_socket_api.h" | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "base/strings/stringprintf.h" | 
|  | #include "build/build_config.h" | 
|  | #include "extensions/browser/api_test_utils.h" | 
|  | #include "extensions/browser/api_unittest.h" | 
|  | #include "extensions/common/extension_builder.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace extensions { | 
|  |  | 
|  | class BluetoothSocketApiUnittest : public ApiUnitTest { | 
|  | public: | 
|  | BluetoothSocketApiUnittest() = default; | 
|  |  | 
|  | BluetoothSocketApiUnittest(const BluetoothSocketApiUnittest&) = delete; | 
|  | BluetoothSocketApiUnittest& operator=(const BluetoothSocketApiUnittest&) = | 
|  | delete; | 
|  | }; | 
|  |  | 
|  | // Tests that bluetoothSocket.create fails as expected when extension does not | 
|  | // have permission. | 
|  | TEST_F(BluetoothSocketApiUnittest, Permission) { | 
|  | auto function = base::MakeRefCounted<api::BluetoothSocketCreateFunction>(); | 
|  | // Runs with an extension without bluetooth permission. | 
|  | EXPECT_EQ("Permission denied", | 
|  | RunFunctionAndReturnError(function.get(), "[]")); | 
|  | } | 
|  |  | 
|  | // Tests bluetoothSocket.create() and bluetoothSocket.close(). | 
|  | // Regression test for https://crbug.com/831651. | 
|  | TEST_F(BluetoothSocketApiUnittest, CreateThenClose) { | 
|  | scoped_refptr<const Extension> extension_with_socket_permitted = | 
|  | ExtensionBuilder() | 
|  | .SetManifest( | 
|  | base::Value::Dict() | 
|  | .Set("name", "bluetooth app") | 
|  | .Set("version", "1.0") | 
|  | .Set("bluetooth", base::Value::Dict().Set("socket", true)) | 
|  | .Set("app", base::Value::Dict().Set( | 
|  | "background", | 
|  | base::Value::Dict().Set( | 
|  | "scripts", base::Value::List().Append( | 
|  | "background.js"))))) | 
|  | .SetLocation(mojom::ManifestLocation::kComponent) | 
|  | .Build(); | 
|  |  | 
|  | ASSERT_TRUE(extension_with_socket_permitted); | 
|  | set_extension(extension_with_socket_permitted); | 
|  |  | 
|  | auto create_function = | 
|  | base::MakeRefCounted<api::BluetoothSocketCreateFunction>(); | 
|  | std::optional<base::Value> result = | 
|  | RunFunctionAndReturnValue(create_function.get(), "[]"); | 
|  | ASSERT_TRUE(result); | 
|  | ASSERT_TRUE(result->is_dict()); | 
|  |  | 
|  | auto create_info = | 
|  | api::bluetooth_socket::CreateInfo::FromValue(result->GetDict()); | 
|  | EXPECT_TRUE(create_info); | 
|  |  | 
|  | const int socket_id = create_info->socket_id; | 
|  | auto close_function = | 
|  | base::MakeRefCounted<api::BluetoothSocketCloseFunction>(); | 
|  | RunFunction(close_function.get(), base::StringPrintf("[%d]", socket_id)); | 
|  | } | 
|  |  | 
|  | }  // namespace extensions |