// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/manta/snapper_provider.h"
#include <memory>
#include <string>
#include "base/strings/stringprintf.h"
#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "components/manta/base_provider_test_helper.h"
#include "components/manta/manta_status.h"
#include "components/signin/public/base/consent_level.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/signin/public/identity_manager/identity_test_environment.h"
#include "net/base/net_errors.h"
#include "net/http/http_status_code.h"
#include "net/http/http_util.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace manta {
namespace {
constexpr char kMockEndpoint[] = "https://my-endpoint.com";
} // namespace
class FakeSnapperProvider : public SnapperProvider, public FakeBaseProvider {
public:
FakeSnapperProvider(
scoped_refptr<network::SharedURLLoaderFactory> test_url_loader_factory,
signin::IdentityManager* identity_manager)
: BaseProvider(test_url_loader_factory, identity_manager),
SnapperProvider(test_url_loader_factory, identity_manager),
FakeBaseProvider(test_url_loader_factory, identity_manager) {}
};
class SnapperProviderTest : public BaseProviderTest {
public:
SnapperProviderTest() = default;
SnapperProviderTest(const SnapperProviderTest&) = delete;
SnapperProviderTest& operator=(const SnapperProviderTest&) = delete;
~SnapperProviderTest() override = default;
std::unique_ptr<FakeSnapperProvider> CreateSnapperProvider() {
return std::make_unique<FakeSnapperProvider>(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_),
identity_test_env_->identity_manager());
}
};
// Test POST data is correctly passed from SnapperProvider to EndpointFetcher.
TEST_F(SnapperProviderTest, SimpleRequestPayload) {
base::HistogramTester histogram_tester;
manta::proto::Response response;
manta::proto::OutputData& output_data = *response.add_output_data();
manta::proto::Image& image = *output_data.mutable_image();
image.set_serialized_bytes("foo");
std::string response_data;
response.SerializeToString(&response_data);
SetEndpointMockResponse(GURL{kMockEndpoint}, response_data, net::HTTP_OK,
net::OK);
std::unique_ptr<FakeSnapperProvider> snapper_provider =
CreateSnapperProvider();
auto quit_closure = task_environment_.QuitClosure();
manta::proto::Request request;
snapper_provider->Call(
request, TRAFFIC_ANNOTATION_FOR_TESTS,
base::BindLambdaForTesting(
[&quit_closure](std::unique_ptr<manta::proto::Response> response,
MantaStatus manta_status) {
ASSERT_EQ(manta_status.status_code, MantaStatusCode::kOk);
ASSERT_TRUE(response);
ASSERT_EQ(1, response->output_data_size());
ASSERT_TRUE(response->output_data(0).has_image());
ASSERT_TRUE(
response->output_data(0).image().has_serialized_bytes());
EXPECT_EQ("foo",
response->output_data(0).image().serialized_bytes());
quit_closure.Run();
}));
task_environment_.RunUntilQuit();
// Metric is logged when respose is successfully parsed.
histogram_tester.ExpectTotalCount("Ash.MantaService.SnapperProvider.TimeCost",
1);
}
TEST_F(SnapperProviderTest, EmptyResponseAfterIdentityManagerShutdown) {
base::HistogramTester histogram_tester;
std::unique_ptr<FakeSnapperProvider> snapper_provider =
CreateSnapperProvider();
identity_test_env_.reset();
manta::proto::Request request;
snapper_provider->Call(
request, TRAFFIC_ANNOTATION_FOR_TESTS,
base::BindLambdaForTesting(
[quit_closure = task_environment_.QuitClosure()](
std::unique_ptr<manta::proto::Response> response,
MantaStatus manta_status) {
ASSERT_FALSE(response);
ASSERT_EQ(MantaStatusCode::kNoIdentityManager,
manta_status.status_code);
quit_closure.Run();
}));
task_environment_.RunUntilQuit();
// No metric logged.
histogram_tester.ExpectTotalCount("Ash.MantaService.SnapperProvider.TimeCost",
0);
}
} // namespace manta