Commit 3af9b87e authored by Kent Tamura's avatar Kent Tamura Committed by Commit Bot

File API: Add File timestamps tests

for timestamps obtained by FileUtilitiesHost.

Bug: 1027959
Change-Id: Ib3c12e44b2fdeb028bcb6856943525425351e510
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1933838
Commit-Queue: Kent Tamura <tkent@chromium.org>
Reviewed-by: default avatarJoshua Bell <jsbell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#718911}
parent 06aed1c8
......@@ -4,16 +4,104 @@
#include "third_party/blink/renderer/core/fileapi/file.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
#include "third_party/blink/public/mojom/file/file_utilities.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/platform/file_metadata.h"
namespace blink {
TEST(FileTest, nativeFile) {
namespace {
class MockFileUtilitiesHost : public mojom::blink::FileUtilitiesHost {
public:
MockFileUtilitiesHost()
: broker_(*Platform::Current()->GetBrowserInterfaceBroker()) {
broker_.SetBinderForTesting(
FileUtilitiesHost::Name_,
WTF::BindRepeating(&MockFileUtilitiesHost::BindReceiver,
WTF::Unretained(this)));
RebindFileUtilitiesForTesting();
}
~MockFileUtilitiesHost() override {
broker_.SetBinderForTesting(FileUtilitiesHost::Name_, {});
RebindFileUtilitiesForTesting();
}
void SetFileInfoToBeReturned(const base::File::Info info) {
file_info_ = info;
}
private:
void BindReceiver(mojo::ScopedMessagePipeHandle handle) {
receivers_.Add(this,
mojo::PendingReceiver<FileUtilitiesHost>(std::move(handle)));
}
// FileUtilitiesHost function:
void GetFileInfo(const base::FilePath& path,
GetFileInfoCallback callback) override {
std::move(callback).Run(file_info_);
}
ThreadSafeBrowserInterfaceBrokerProxy& broker_;
mojo::ReceiverSet<FileUtilitiesHost> receivers_;
base::File::Info file_info_;
};
void ExpectLastModifiedIsNow(const File& file) {
const base::Time now = base::Time::Now();
const base::Time epoch = base::Time::UnixEpoch();
// Because lastModified() applies floor() internally, it can be smaller than
// |now|. |+ 1| adjusts it.
EXPECT_GE(epoch + base::TimeDelta::FromMilliseconds(file.lastModified() + 1),
now);
EXPECT_GE(file.LastModifiedDate() + 1, now.ToJsTime());
}
} // namespace
TEST(FileTest, NativeFileWithoutTimestamp) {
MockFileUtilitiesHost host;
base::File::Info info;
info.last_modified = base::Time();
host.SetFileInfoToBeReturned(info);
File* const file = File::Create("/native/path");
EXPECT_TRUE(file->HasBackingFile());
EXPECT_EQ("/native/path", file->GetPath());
EXPECT_TRUE(file->FileSystemURL().IsEmpty());
ExpectLastModifiedIsNow(*file);
}
TEST(FileTest, NativeFileWithUnixEpochTimestamp) {
MockFileUtilitiesHost host;
base::File::Info info;
info.last_modified = base::Time::UnixEpoch();
host.SetFileInfoToBeReturned(info);
File* const file = File::Create("/native/path");
EXPECT_TRUE(file->HasBackingFile());
EXPECT_EQ(0, file->lastModified());
EXPECT_EQ(0.0, file->LastModifiedDate());
}
TEST(FileTest, NativeFileWithApocalypseTimestamp) {
MockFileUtilitiesHost host;
base::File::Info info;
info.last_modified = base::Time::Max();
host.SetFileInfoToBeReturned(info);
File* const file = File::Create("/native/path");
EXPECT_TRUE(file->HasBackingFile());
ExpectLastModifiedIsNow(*file);
// Actually, the timestamp should not be |now|.
// EXPECT_EQ(base::Time::Max() - base::Time::UnixEpoch(),
// base::TimeDelta::FromMilliseconds(file->lastModified()));
}
TEST(FileTest, blobBackingFile) {
......
......@@ -46,6 +46,17 @@
namespace blink {
namespace {
mojo::Remote<mojom::blink::FileUtilitiesHost>& GetFileUtilitiesHost() {
DEFINE_THREAD_SAFE_STATIC_LOCAL(
ThreadSpecific<mojo::Remote<mojom::blink::FileUtilitiesHost>>,
thread_specific_host, ());
return *thread_specific_host;
}
} // namespace
// static
FileMetadata FileMetadata::From(const base::File::Info& file_info) {
FileMetadata file_metadata;
......@@ -76,11 +87,17 @@ bool GetFileModificationTime(const String& path,
return true;
}
void RebindFileUtilitiesForTesting() {
auto& host = GetFileUtilitiesHost();
if (host) {
host.Unbind().reset();
}
Platform::Current()->GetInterfaceProvider()->GetInterface(
host.BindNewPipeAndPassReceiver());
}
bool GetFileMetadata(const String& path, FileMetadata& metadata) {
DEFINE_THREAD_SAFE_STATIC_LOCAL(
ThreadSpecific<mojo::Remote<mojom::blink::FileUtilitiesHost>>,
thread_specific_host, ());
auto& host = *thread_specific_host;
auto& host = GetFileUtilitiesHost();
if (!host) {
Platform::Current()->GetInterfaceProvider()->GetInterface(
host.BindNewPipeAndPassReceiver());
......
......@@ -79,6 +79,8 @@ PLATFORM_EXPORT bool GetFileModificationTime(
PLATFORM_EXPORT bool GetFileMetadata(const String&, FileMetadata&);
PLATFORM_EXPORT KURL FilePathToURL(const String&);
PLATFORM_EXPORT void RebindFileUtilitiesForTesting();
// TODO(crbug.com/988343): Temporary conversion function. This should be
// removed.
inline double ToJsTimeOrNaN(base::Optional<base::Time> time) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment