blob: c14e70177d4afd05505878974f2f78a01532104c [file] [log] [blame]
// Copyright 2018 The Chromium OS 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 <string>
#include <dbus/smbprovider/dbus-constants.h>
#include <gtest/gtest.h>
#include "smbprovider/constants.h"
#include "smbprovider/proto.h"
#include "smbprovider/proto_bindings/directory_entry.pb.h"
#include "smbprovider/smbprovider_helper.h"
#include "smbprovider/smbprovider_test_helper.h"
namespace smbprovider {
namespace {
template <typename Proto>
void CheckMethodName(const char* name, const Proto& proto) {
EXPECT_EQ(0, strcmp(name, GetMethodName(proto)));
}
void CheckDirectoryEntryAndDirectoryEntryProtoAreEqual(
const DirectoryEntry& entry, const DirectoryEntryProto& proto) {
EXPECT_EQ(entry.is_directory, proto.is_directory());
EXPECT_EQ(entry.name, proto.name());
EXPECT_EQ(entry.size, proto.size());
EXPECT_EQ(entry.last_modified_time, proto.last_modified_time());
}
} // namespace
class SmbProviderProtoTest : public testing::Test {
public:
SmbProviderProtoTest() = default;
~SmbProviderProtoTest() override = default;
private:
DISALLOW_COPY_AND_ASSIGN(SmbProviderProtoTest);
};
// Blobs should be serialized correctly.
TEST_F(SmbProviderProtoTest, SerializeProtoToBlob) {
DirectoryEntryProto entry;
entry.set_is_directory(true);
entry.set_name("test");
entry.set_size(0);
entry.set_last_modified_time(0);
ProtoBlob blob;
EXPECT_EQ(ERROR_OK, SerializeProtoToBlob(entry, &blob));
}
// IsValidOptions returns true when options are valid for valid protos.
TEST_F(SmbProviderProtoTest, IsValidOptionsForValidProtos) {
MountOptionsProto mount_proto = CreateMountOptionsProto("smb://testShare");
EXPECT_TRUE(IsValidOptions(mount_proto));
UnmountOptionsProto unmount_proto =
CreateUnmountOptionsProto(3 /* mount_id */);
EXPECT_TRUE(IsValidOptions(unmount_proto));
ReadDirectoryOptionsProto read_directory_proto =
CreateReadDirectoryOptionsProto(3 /* mount_id */, "smb://testShare/dir1");
EXPECT_TRUE(IsValidOptions(read_directory_proto));
GetMetadataEntryOptionsProto get_metadata_proto =
CreateGetMetadataOptionsProto(3 /* mount_id */,
"smb://testShare/dir1/pic.png");
EXPECT_TRUE(IsValidOptions(get_metadata_proto));
OpenFileOptionsProto open_file_proto = CreateOpenFileOptionsProto(
3 /* mount_id */, "smb://testShare/dir1/pic.png", false /* writeable */);
EXPECT_TRUE(IsValidOptions(open_file_proto));
CloseFileOptionsProto close_file_proto =
CreateCloseFileOptionsProto(3 /* mount_id */, 4 /* file_id */);
EXPECT_TRUE(IsValidOptions(close_file_proto));
DeleteEntryOptionsProto delete_entry_proto = CreateDeleteEntryOptionsProto(
3 /* mount_id */, "smb://testShare/dir1/pic.png", false /* recursive */);
EXPECT_TRUE(IsValidOptions(delete_entry_proto));
ReadFileOptionsProto read_file_proto = CreateReadFileOptionsProto(
3 /* mount_id */, 4 /* file_id */, 0 /* offset */, 0 /* length */);
EXPECT_TRUE(IsValidOptions(read_file_proto));
CreateFileOptionsProto create_file_proto = CreateCreateFileOptionsProto(
3 /* mount_id */, "smb://testShare/dir1/pic.png");
EXPECT_TRUE(IsValidOptions(create_file_proto));
TruncateOptionsProto truncate_proto = CreateTruncateOptionsProto(
3 /* mount_id */, "smb://testShare/dir1/pic.png", 0 /* length */);
EXPECT_TRUE(IsValidOptions(truncate_proto));
WriteFileOptionsProto write_file_proto = CreateWriteFileOptionsProto(
3 /* mount_id */, 4 /* file_id */, 0 /* offset */, 0 /* length */);
EXPECT_TRUE(IsValidOptions(write_file_proto));
CreateDirectoryOptionsProto create_dir_proto =
CreateCreateDirectoryOptionsProto(
3 /* mount_id */, "smb://testShare/dir1", true /* recursive */);
EXPECT_TRUE(IsValidOptions(create_dir_proto));
MoveEntryOptionsProto move_entry_proto = CreateMoveEntryOptionsProto(
3 /* mount_id */, "smb://testShare/src", "smb://testShare/dst");
EXPECT_TRUE(IsValidOptions(move_entry_proto));
}
// IsValidOptions returns false when options are invalid for invalid protos.
TEST_F(SmbProviderProtoTest, IsValidOptionsForInValidProtos) {
MountOptionsProto mount_proto_blank;
EXPECT_FALSE(IsValidOptions(mount_proto_blank));
UnmountOptionsProto unmount_proto_blank;
EXPECT_FALSE(IsValidOptions(unmount_proto_blank));
ReadDirectoryOptionsProto read_directory_proto_blank;
EXPECT_FALSE(IsValidOptions(read_directory_proto_blank));
GetMetadataEntryOptionsProto get_metadata_proto_blank;
EXPECT_FALSE(IsValidOptions(get_metadata_proto_blank));
OpenFileOptionsProto open_file_proto_blank;
EXPECT_FALSE(IsValidOptions(open_file_proto_blank));
CloseFileOptionsProto close_file_proto_blank;
EXPECT_FALSE(IsValidOptions(close_file_proto_blank));
DeleteEntryOptionsProto delete_entry_proto_blank;
EXPECT_FALSE(IsValidOptions(delete_entry_proto_blank));
ReadFileOptionsProto read_file_proto_blank;
EXPECT_FALSE(IsValidOptions(read_file_proto_blank));
CreateFileOptionsProto create_file_proto_blank;
EXPECT_FALSE(IsValidOptions(create_file_proto_blank));
TruncateOptionsProto truncate_proto_blank;
EXPECT_FALSE(IsValidOptions(truncate_proto_blank));
WriteFileOptionsProto write_file_proto_blank;
EXPECT_FALSE(IsValidOptions(write_file_proto_blank));
CreateDirectoryOptionsProto create_dir_proto_blank;
EXPECT_FALSE(IsValidOptions(create_dir_proto_blank));
MoveEntryOptionsProto move_entry_proto_blank;
EXPECT_FALSE(IsValidOptions(move_entry_proto_blank));
}
// IsValidOptions checks offset and length ranges for ReadFileOptionsProto.
TEST_F(SmbProviderProtoTest, IsValidOptionsChecksReadFileRanges) {
ReadFileOptionsProto read_file_proto = CreateReadFileOptionsProto(
3 /* mount_id */, 4 /* file_id */, 0 /* offset */, 0 /* length */);
EXPECT_TRUE(IsValidOptions(read_file_proto));
ReadFileOptionsProto read_file_proto_bad_offset = CreateReadFileOptionsProto(
3 /* mount_id */, 4 /* file_id */, -5 /* offset */, 0 /* length */);
EXPECT_FALSE(IsValidOptions(read_file_proto_bad_offset));
ReadFileOptionsProto read_file_proto_bad_length = CreateReadFileOptionsProto(
3 /* mount_id */, 4 /* file_id */, 0 /* offset */, -10 /* length */);
EXPECT_FALSE(IsValidOptions(read_file_proto_bad_length));
}
// IsValidOptions checks length for TruncateOptionsProto.
TEST_F(SmbProviderProtoTest, IsValidOptionsChecksTruncateLength) {
TruncateOptionsProto truncate_proto = CreateTruncateOptionsProto(
3 /* mount_id */, "smb://testShare/dir1/pic.png", 0 /* length */);
EXPECT_TRUE(IsValidOptions(truncate_proto));
TruncateOptionsProto truncate_proto_bad_length = CreateTruncateOptionsProto(
3 /* mount_id */, "smb://testShare/dir1/pic.png", -10 /* length */);
EXPECT_FALSE(IsValidOptions(truncate_proto_bad_length));
}
// IsValidOptions checks offset and length ranges for WriteFileOptionsProto.
TEST_F(SmbProviderProtoTest, IsValidOptionsChecksWriteFileRanges) {
WriteFileOptionsProto write_file_proto = CreateWriteFileOptionsProto(
3 /* mount_id */, 4 /* file_id */, 0 /* offset */, 0 /* length */);
EXPECT_TRUE(IsValidOptions(write_file_proto));
WriteFileOptionsProto write_file_proto_bad_offset =
CreateWriteFileOptionsProto(3 /* mount_id */, 4 /* file_id */,
-1 /* offset */, 0 /* length */);
EXPECT_FALSE(IsValidOptions(write_file_proto_bad_offset));
WriteFileOptionsProto write_file_proto_bad_length =
CreateWriteFileOptionsProto(3 /* mount_id */, 4 /* file_id */,
0 /* offset */, -1 /* length */);
EXPECT_FALSE(IsValidOptions(write_file_proto_bad_length));
}
// GetEntryPath gets the correct part of corresponding protos.
TEST_F(SmbProviderProtoTest, GetEntryPath) {
const std::string expected_dir_path = "smb://testShare/dir1";
const std::string expected_file_path = "smb://testShare/dir1/pic.png";
ReadDirectoryOptionsProto read_directory_proto =
CreateReadDirectoryOptionsProto(3 /* mount_id */, expected_dir_path);
EXPECT_EQ(expected_dir_path, GetEntryPath(read_directory_proto));
GetMetadataEntryOptionsProto get_metadata_proto =
CreateGetMetadataOptionsProto(3 /* mount_id */, expected_file_path);
EXPECT_EQ(expected_file_path, GetEntryPath(get_metadata_proto));
OpenFileOptionsProto open_file_proto = CreateOpenFileOptionsProto(
3 /* mount_id */, expected_file_path, false /* writeable */);
EXPECT_EQ(expected_file_path, GetEntryPath(open_file_proto));
DeleteEntryOptionsProto delete_entry_proto = CreateDeleteEntryOptionsProto(
3 /* mount_id */, expected_file_path, false /* recursive */);
EXPECT_EQ(expected_file_path, GetEntryPath(delete_entry_proto));
CreateFileOptionsProto create_file_proto =
CreateCreateFileOptionsProto(3 /* mount_id */, expected_file_path);
EXPECT_EQ(expected_file_path, GetEntryPath(create_file_proto));
}
// GetSourcePath and GetDestinationPath get the correct parts of a MoveEntry
// proto.
TEST_F(SmbProviderProtoTest, GetSourcePathAndGetDestinationPath) {
const std::string expected_source_path = "smb://testShare/src";
const std::string expected_dest_path = "smb://testShare/dest";
MoveEntryOptionsProto move_entry_proto = CreateMoveEntryOptionsProto(
3 /* mount_id */, expected_source_path, expected_dest_path);
EXPECT_EQ(expected_source_path, GetSourcePath(move_entry_proto));
EXPECT_EQ(expected_dest_path, GetDestinationPath(move_entry_proto));
}
// GetMethodName returns the correct name for each proto.
TEST_F(SmbProviderProtoTest, GetMethodName) {
CheckMethodName(kMountMethod, MountOptionsProto());
CheckMethodName(kUnmountMethod, UnmountOptionsProto());
CheckMethodName(kGetMetadataEntryMethod, GetMetadataEntryOptionsProto());
CheckMethodName(kReadDirectoryMethod, ReadDirectoryOptionsProto());
CheckMethodName(kOpenFileMethod, OpenFileOptionsProto());
CheckMethodName(kCloseFileMethod, CloseFileOptionsProto());
CheckMethodName(kDeleteEntryMethod, DeleteEntryOptionsProto());
CheckMethodName(kReadFileMethod, ReadFileOptionsProto());
CheckMethodName(kCreateFileMethod, CreateFileOptionsProto());
CheckMethodName(kWriteFileMethod, WriteFileOptionsProto());
CheckMethodName(kMoveEntryMethod, MoveEntryOptionsProto());
}
// DirectoryEntryCtor initializes a DirectoryEntry correctly.
TEST_F(SmbProviderProtoTest, DirectoryEntry) {
const bool is_dir = false;
const std::string name = "testentry.jpg";
const std::string full_path = "smb://testUrl/testentry.jpg";
int64_t size = 23;
int64_t last_modified_time = 456;
DirectoryEntry entry(is_dir, name, full_path, size, last_modified_time);
EXPECT_EQ(is_dir, entry.is_directory);
EXPECT_EQ(name, entry.name);
EXPECT_EQ(full_path, entry.full_path);
EXPECT_EQ(size, entry.size);
EXPECT_EQ(last_modified_time, entry.last_modified_time);
}
// ConvertToProto correctly converts a DirectoryEntry to a DirectoryEntryProto.
TEST_F(SmbProviderProtoTest, ConvertToProto) {
DirectoryEntry entry(false /* is_directory */, "testentry.jpg",
"smb://testUrl/testentry.jpg", 23 /* size */,
456 /* last_modified_time */);
DirectoryEntryProto proto;
ConvertToProto(entry, &proto);
CheckDirectoryEntryAndDirectoryEntryProtoAreEqual(entry, proto);
}
// AddDirectoryEntry adds a DirectoryEntry to a DirectoryEntryListProto as a
// DirectoryEntryProto.
TEST_F(SmbProviderProtoTest, AddDirectoryEntry) {
DirectoryEntry entry(false /* is_directory */, "testentry.jpg",
"smb://testUrl/testentry.jpg", 23 /* size */,
456 /* last_modified_time */);
DirectoryEntryListProto entries_proto;
EXPECT_EQ(0, entries_proto.entries_size());
AddDirectoryEntry(entry, &entries_proto);
EXPECT_EQ(1, entries_proto.entries_size());
DirectoryEntryProto entry_proto = entries_proto.entries(0);
CheckDirectoryEntryAndDirectoryEntryProtoAreEqual(entry, entry_proto);
}
// SerializeDirEntryVectorToProto correctly serializes a vector of dirents.
TEST_F(SmbProviderProtoTest, SerializeDirEntryVectorToProto) {
std::vector<DirectoryEntry> entries;
DirectoryEntry entry1(false /* is_directory */, "testentry.jpg",
"smb://testUrl/testentry.jpg", 23 /* size */,
456 /* last_modified_time */);
DirectoryEntry entry2(true /* is_directory */, "stuff",
"smb://testUrl/testentry.jpg", 5 /* size */,
789 /* last_modified_time */);
entries.push_back(entry1);
entries.push_back(entry2);
DirectoryEntryListProto entries_proto;
SerializeDirEntryVectorToProto(entries, &entries_proto);
EXPECT_EQ(2, entries_proto.entries_size());
CheckDirectoryEntryAndDirectoryEntryProtoAreEqual(entry1,
entries_proto.entries(0));
CheckDirectoryEntryAndDirectoryEntryProtoAreEqual(entry2,
entries_proto.entries(1));
}
} // namespace smbprovider