blob: 6e4f306641d0feceb4f97e64eb20f6157106ebe1 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 <lib/zxio/posix_mode.h>
#include <lib/zxio/types.h>
#include <sys/stat.h>
#include <zxtest/zxtest.h>
#include "sdk/lib/zxio/private.h"
// Tests the conversion between |zxio_node_attributes_t| and POSIX |mode_t|.
TEST(NodeProtocolsToPosixType, Basic) {
EXPECT_EQ(S_IFREG, zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_CONNECTOR));
EXPECT_EQ(S_IFDIR, zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_DIRECTORY));
EXPECT_EQ(S_IFREG, zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_FILE));
EXPECT_EQ(S_IFREG, zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_MEMORY));
EXPECT_EQ(S_IFSOCK, zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_STREAM_SOCKET));
EXPECT_EQ(S_IFIFO, zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_PIPE));
EXPECT_EQ(S_IFBLK, zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_DEVICE));
EXPECT_EQ(S_IFCHR, zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_TTY));
}
TEST(NodeProtocolsToPosixType, MultiProtocol) {
EXPECT_EQ(S_IFREG,
zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_FILE | ZXIO_NODE_PROTOCOL_MEMORY));
// If the node supports both directory and file protocol, we only assert that
// the conversion result is either |S_IFDIR| (directory) or |S_IFREG| (file).
EXPECT_TRUE(zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_DIRECTORY |
ZXIO_NODE_PROTOCOL_FILE) == S_IFDIR ||
zxio_node_protocols_to_posix_type(ZXIO_NODE_PROTOCOL_DIRECTORY |
ZXIO_NODE_PROTOCOL_FILE) == S_IFREG);
}
TEST(AbilitiesToPosixPermissions, File) {
EXPECT_EQ(S_IRUSR | S_IFREG,
zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_FILE, ZXIO_OPERATION_READ_BYTES));
EXPECT_EQ(S_IRUSR | S_IWUSR | S_IFREG,
zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_FILE,
ZXIO_OPERATION_READ_BYTES | ZXIO_OPERATION_WRITE_BYTES));
EXPECT_EQ(S_IRUSR | S_IWUSR | S_IXUSR | S_IFREG,
zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_FILE, ZXIO_OPERATION_READ_BYTES |
ZXIO_OPERATION_WRITE_BYTES |
ZXIO_OPERATION_EXECUTE));
EXPECT_EQ(S_IFREG, zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_FILE, ZXIO_OPERATION_ENUMERATE));
EXPECT_EQ(S_IFREG, zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_FILE, ZXIO_OPERATION_MODIFY_DIRECTORY));
EXPECT_EQ(S_IFREG, zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_FILE, ZXIO_OPERATION_TRAVERSE));
}
TEST(AbilitiesToPosixPermissions, Directory) {
EXPECT_EQ(S_IRUSR | S_IFDIR,
zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_DIRECTORY, ZXIO_OPERATION_ENUMERATE));
EXPECT_EQ(S_IRUSR | S_IWUSR | S_IFDIR,
zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_DIRECTORY,
ZXIO_OPERATION_ENUMERATE | ZXIO_OPERATION_MODIFY_DIRECTORY));
EXPECT_EQ(S_IRUSR | S_IWUSR | S_IXUSR | S_IFDIR,
zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_DIRECTORY, ZXIO_OPERATION_ENUMERATE |
ZXIO_OPERATION_MODIFY_DIRECTORY |
ZXIO_OPERATION_TRAVERSE));
// These are ignored when converting in directory mode.
EXPECT_EQ(S_IFDIR, zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_DIRECTORY, ZXIO_OPERATION_READ_BYTES));
EXPECT_EQ(S_IFDIR, zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_DIRECTORY, ZXIO_OPERATION_WRITE_BYTES));
EXPECT_EQ(S_IFDIR, zxio_get_posix_mode(ZXIO_NODE_PROTOCOL_DIRECTORY, ZXIO_OPERATION_EXECUTE));
}