blob: 6cd8da022ffd115a1b234f99eaa5c621578719e0 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h"
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/extensions/extension_api_unittest.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gmock/include/gmock/gmock.h"
using ::testing::_;
using ::testing::Invoke;
using ::testing::WithArgs;
namespace extensions {
namespace {
const char kFakeDMToken[] = "fake-dm-token";
const char kFakeClientId[] = "fake-client-id";
const char kFakeMachineNameReport[] = "{\"computername\":\"name\"}";
class MockCloudPolicyClient : public policy::MockCloudPolicyClient {
public:
MockCloudPolicyClient() = default;
void UploadChromeDesktopReport(
std::unique_ptr<enterprise_management::ChromeDesktopReportRequest>
request,
const StatusCallback& callback) override {
UploadChromeDesktopReportProxy(request.get(), callback);
}
MOCK_METHOD2(UploadChromeDesktopReportProxy,
void(enterprise_management::ChromeDesktopReportRequest*,
const StatusCallback&));
void OnReportUploadedFailed(const StatusCallback& callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(callback, false));
}
void OnReportUploadedSucceeded(const StatusCallback& callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(callback, true));
}
private:
DISALLOW_COPY_AND_ASSIGN(MockCloudPolicyClient);
};
} // namespace
class EnterpriseReportingPrivateTest : public ExtensionApiUnittest {
public:
EnterpriseReportingPrivateTest()
: test_shared_loader_factory_(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_)) {}
void TearDown() override { test_shared_loader_factory_->Detach(); }
UIThreadExtensionFunction* CreateChromeDesktopReportingFunction(
const std::string& dm_token) {
EnterpriseReportingPrivateUploadChromeDesktopReportFunction* function =
EnterpriseReportingPrivateUploadChromeDesktopReportFunction::
CreateForTesting(test_shared_loader_factory_);
std::unique_ptr<MockCloudPolicyClient> client =
std::make_unique<MockCloudPolicyClient>();
client_ = client.get();
function->SetCloudPolicyClientForTesting(std::move(client));
function->SetRegistrationInfoForTesting(dm_token, kFakeClientId);
return function;
}
std::string GenerateArgs(const char* name) {
return base::StringPrintf("[{\"machineName\":%s}]", name);
}
std::string GenerateInvalidReport() {
// This report is invalid as the chromeSignInUser dictionary should not be
// wrapped in a list.
return std::string(
"[{\"browserReport\": "
"{\"chromeUserProfileReport\":[{\"chromeSignInUser\":\"Name\"}]}}]");
}
MockCloudPolicyClient* client_;
private:
network::TestURLLoaderFactory test_url_loader_factory_;
scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
test_shared_loader_factory_;
DISALLOW_COPY_AND_ASSIGN(EnterpriseReportingPrivateTest);
};
TEST_F(EnterpriseReportingPrivateTest, DeviceIsNotEnrolled) {
ASSERT_EQ(enterprise_reporting::kDeviceNotEnrolled,
RunFunctionAndReturnError(
CreateChromeDesktopReportingFunction(std::string()),
GenerateArgs(kFakeMachineNameReport)));
}
TEST_F(EnterpriseReportingPrivateTest, ReportIsNotValid) {
ASSERT_EQ(enterprise_reporting::kInvalidInputErrorMessage,
RunFunctionAndReturnError(
CreateChromeDesktopReportingFunction(kFakeDMToken),
GenerateInvalidReport()));
}
TEST_F(EnterpriseReportingPrivateTest, UploadFailed) {
UIThreadExtensionFunction* function =
CreateChromeDesktopReportingFunction(kFakeDMToken);
EXPECT_CALL(*client_, SetupRegistration(kFakeDMToken, kFakeClientId, _))
.Times(1);
EXPECT_CALL(*client_, UploadChromeDesktopReportProxy(_, _))
.WillOnce(WithArgs<1>(
Invoke(client_, &MockCloudPolicyClient::OnReportUploadedFailed)));
ASSERT_EQ(enterprise_reporting::kUploadFailed,
RunFunctionAndReturnError(function,
GenerateArgs(kFakeMachineNameReport)));
::testing::Mock::VerifyAndClearExpectations(client_);
}
TEST_F(EnterpriseReportingPrivateTest, UploadSucceeded) {
UIThreadExtensionFunction* function =
CreateChromeDesktopReportingFunction(kFakeDMToken);
EXPECT_CALL(*client_, SetupRegistration(kFakeDMToken, kFakeClientId, _))
.Times(1);
EXPECT_CALL(*client_, UploadChromeDesktopReportProxy(_, _))
.WillOnce(WithArgs<1>(
Invoke(client_, &MockCloudPolicyClient::OnReportUploadedSucceeded)));
ASSERT_EQ(nullptr, RunFunctionAndReturnValue(
function, GenerateArgs(kFakeMachineNameReport)));
::testing::Mock::VerifyAndClearExpectations(client_);
}
} // namespace extensions