blob: a5fbcae0c4672c83c7c9ae13d007978c9605d2cb [file] [log] [blame]
// Copyright 2015 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 <stdint.h>
#include "base/containers/scoped_ptr_hash_map.h"
#include "base/files/file.h"
#include "base/run_loop.h"
#include "components/resource_provider/public/cpp/resource_loader.h"
#include "components/resource_provider/public/interfaces/resource_provider.mojom.h"
#include "mojo/application/public/cpp/application_delegate.h"
#include "mojo/application/public/cpp/application_impl.h"
#include "mojo/application/public/cpp/application_test_base.h"
#include "mojo/application/public/cpp/service_provider_impl.h"
#include "mojo/common/common_type_converters.h"
#include "mojo/platform_handle/platform_handle_functions.h"
#include "mojo/public/cpp/bindings/array.h"
#include "mojo/public/cpp/system/macros.h"
namespace resource_provider {
namespace {
std::string ReadFile(base::File* file) {
const size_t kBufferSize = 1 << 16;
scoped_ptr<char[]> buffer(new char[kBufferSize]);
const int read = file->ReadAtCurrentPos(buffer.get(), kBufferSize);
if (read == -1)
return std::string();
return std::string(buffer.get(), read);
}
std::set<std::string> SetWithString(const std::string& contents) {
std::set<std::string> result;
result.insert(contents);
return result;
}
std::set<std::string> SetWithStrings(const std::string& contents1,
const std::string& contents2) {
std::set<std::string> result;
result.insert(contents1);
result.insert(contents2);
return result;
}
class ResourceProviderApplicationTest : public mojo::test::ApplicationTestBase {
public:
ResourceProviderApplicationTest() {}
~ResourceProviderApplicationTest() override {}
protected:
using ResourceContentsMap = std::map<std::string, std::string>;
// Queries ResourceProvider for the specified resources, blocking until the
// resources are returned. The return map maps from the path to the contents
// of the file at the specified path.
ResourceContentsMap GetResources(const std::set<std::string>& paths) {
ResourceLoader loader(application_impl(), paths);
loader.BlockUntilLoaded();
// Load the contents of each of the handles.
ResourceContentsMap results;
for (auto& path : paths) {
base::File file(loader.ReleaseFile(path));
results[path] = ReadFile(&file);
}
return results;
}
// ApplicationTestBase:
void SetUp() override {
ApplicationTestBase::SetUp();
}
private:
MOJO_DISALLOW_COPY_AND_ASSIGN(ResourceProviderApplicationTest);
};
TEST_F(ResourceProviderApplicationTest, FetchOneResource) {
ResourceContentsMap results(GetResources(SetWithString("sample")));
ASSERT_TRUE(results.count("sample") > 0u);
EXPECT_EQ("test data\n", results["sample"]);
}
TEST_F(ResourceProviderApplicationTest, FetchTwoResources) {
ResourceContentsMap results(
GetResources(SetWithStrings("sample", "dir/sample2")));
ASSERT_TRUE(results.count("sample") > 0u);
EXPECT_EQ("test data\n", results["sample"]);
ASSERT_TRUE(results.count("dir/sample2") > 0u);
EXPECT_EQ("xxyy\n", results["dir/sample2"]);
}
} // namespace
} // namespace resource_provider