blob: f23d4524ceee85acda1593e71c6d799d688d66f3 [file] [log] [blame]
// Copyright 2023 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 "src/devices/block/lib/common/include/common.h"
#include <lib/driver/testing/cpp/scoped_global_logger.h>
#include <zxtest/zxtest.h>
namespace block {
class TestWithLogger : public zxtest::Test {
public:
protected:
fdf_testing::ScopedGlobalLogger logger_;
};
TEST_F(TestWithLogger, CheckIoRangeTest) {
block_read_write rw;
rw = {
.length = 0,
.offset_dev = 10,
};
EXPECT_EQ(CheckIoRange(rw, 100, logger_.logger()), ZX_ERR_OUT_OF_RANGE);
rw = {
.length = 11,
.offset_dev = 90,
};
EXPECT_EQ(CheckIoRange(rw, 100, logger_.logger()), ZX_ERR_OUT_OF_RANGE);
rw = {
.length = 1,
.offset_dev = 100,
};
EXPECT_EQ(CheckIoRange(rw, 100, logger_.logger()), ZX_ERR_OUT_OF_RANGE);
rw = {
.length = 2,
.offset_dev = 99,
};
EXPECT_EQ(CheckIoRange(rw, 100, logger_.logger()), ZX_ERR_OUT_OF_RANGE);
rw = {
.length = 101,
.offset_dev = 0,
};
EXPECT_EQ(CheckIoRange(rw, 100, logger_.logger()), ZX_ERR_OUT_OF_RANGE);
rw = {
.length = 1,
.offset_dev = 0,
};
EXPECT_OK(CheckIoRange(rw, 100, logger_.logger()));
rw = {
.length = 1,
.offset_dev = 99,
};
EXPECT_OK(CheckIoRange(rw, 100, logger_.logger()));
rw = {
.length = 100,
.offset_dev = 0,
};
EXPECT_OK(CheckIoRange(rw, 100, logger_.logger()));
}
TEST_F(TestWithLogger, CheckIoRangeMaxTransferTest) {
block_trim trim;
trim = {
.length = 26,
.offset_dev = 0,
};
EXPECT_EQ(CheckIoRange(trim, 100, 25, logger_.logger()), ZX_ERR_OUT_OF_RANGE);
trim = {
.length = 2,
.offset_dev = 99,
};
EXPECT_EQ(CheckIoRange(trim, 100, 25, logger_.logger()), ZX_ERR_OUT_OF_RANGE);
trim = {
.length = 25,
.offset_dev = 0,
};
EXPECT_OK(CheckIoRange(trim, 100, 25, logger_.logger()));
}
TEST_F(TestWithLogger, CheckFlushValidTest) {
block_read_write rw;
rw = {
.vmo = 1,
.length = 0,
.offset_dev = 0,
.offset_vmo = 0,
};
EXPECT_EQ(CheckFlushValid(rw, logger_.logger()), ZX_ERR_INVALID_ARGS);
rw = {
.vmo = ZX_HANDLE_INVALID,
.length = 2,
.offset_dev = 0,
.offset_vmo = 0,
};
EXPECT_EQ(CheckFlushValid(rw, logger_.logger()), ZX_ERR_INVALID_ARGS);
rw = {
.vmo = ZX_HANDLE_INVALID,
.length = 0,
.offset_dev = 3,
.offset_vmo = 0,
};
EXPECT_EQ(CheckFlushValid(rw, logger_.logger()), ZX_ERR_INVALID_ARGS);
rw = {
.vmo = ZX_HANDLE_INVALID,
.length = 0,
.offset_dev = 0,
.offset_vmo = 4,
};
EXPECT_EQ(CheckFlushValid(rw, logger_.logger()), ZX_ERR_INVALID_ARGS);
rw = {
.vmo = ZX_HANDLE_INVALID,
.length = 0,
.offset_dev = 0,
.offset_vmo = 0,
};
EXPECT_OK(CheckFlushValid(rw, logger_.logger()));
}
TEST(EndianTest, BigEndian24Test) {
uint8_t memory[3] = {};
EXPECT_OK(WriteToBigEndian24(0x654321, memory));
EXPECT_EQ(memory[0], 0x65); // MSB
EXPECT_EQ(memory[1], 0x43);
EXPECT_EQ(memory[2], 0x21); // LSB
EXPECT_EQ(WriteToBigEndian24(0x1000000, memory), ZX_ERR_OUT_OF_RANGE);
EXPECT_EQ(ReadFromBigEndian24(memory), 0x654321);
}
TEST(EndianTest, LittleEndian24Test) {
uint8_t memory[3] = {};
EXPECT_OK(WriteToLittleEndian24(0x654321, memory));
EXPECT_EQ(memory[0], 0x21); // LSB
EXPECT_EQ(memory[1], 0x43);
EXPECT_EQ(memory[2], 0x65); // MSB
EXPECT_EQ(WriteToLittleEndian24(0x1000000, memory), ZX_ERR_OUT_OF_RANGE);
EXPECT_EQ(ReadFromLittleEndian24(memory), 0x654321);
}
} // namespace block