blob: 7dbc775020c057658a5dcf9925b4db2e31206887 [file] [log] [blame]
// Copyright 2020 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/storage/blobfs/compression-settings.h"
#include <gtest/gtest.h>
#include <src/lib/chunked-compression/compression-params.h>
#include <zstd/zstd.h>
#include "src/storage/blobfs/format.h"
namespace blobfs {
namespace {
// Simple basic conversion test.
TEST(CompressionSettingsTest, CompressionAlgorithmToStringConvertLZ4) {
ASSERT_STREQ(CompressionAlgorithmToString(CompressionAlgorithm::LZ4), "LZ4");
}
// Simple basic conversion for compression enabled.
TEST(CompressionSettingsTest, AlgorithmForInodeConvertLZ4) {
Inode inode;
inode.header.flags = kBlobFlagLZ4Compressed;
ASSERT_EQ(AlgorithmForInode(inode), CompressionAlgorithm::LZ4);
}
// Conversion when no compression flags are enabled.
TEST(CompressionSettingsTest, AlgorithmForInodeConvertUncompressed) {
Inode inode;
inode.header.flags &= ~kBlobFlagMaskAnyCompression;
ASSERT_EQ(AlgorithmForInode(inode).value(), CompressionAlgorithm::UNCOMPRESSED);
}
TEST(CompressionSettingsTest, AlgorithmForInodeMultipleFlagsSet) {
Inode inode;
inode.header.flags = kBlobFlagLZ4Compressed | kBlobFlagZSTDCompressed;
ASSERT_FALSE(AlgorithmForInode(inode).is_ok());
}
// Simple basic conversion test.
TEST(CompressionSettingsTest, CompressionInodeHeaderFlagsConvertLZ4) {
ASSERT_EQ(CompressionInodeHeaderFlags(CompressionAlgorithm::LZ4), kBlobFlagLZ4Compressed);
}
// Apply a couple of CompressionAlgorithms, verify that they come back right
// despite multiple calls.
TEST(CompressionSettingsTest, SetCompressionAlgorithmCalledTwice) {
Inode inode;
inode.header.flags = kBlobFlagAllocated; // Ensure that this stays set.
SetCompressionAlgorithm(&inode, CompressionAlgorithm::LZ4);
ASSERT_EQ(inode.header.flags, kBlobFlagLZ4Compressed | kBlobFlagAllocated);
SetCompressionAlgorithm(&inode, CompressionAlgorithm::ZSTD);
ASSERT_EQ(inode.header.flags, kBlobFlagZSTDCompressed | kBlobFlagAllocated);
}
// Anything is valid with no compression level setings.
TEST(CompressionSettingsTest, IsValidWithNoSettings) {
CompressionSettings settings = {CompressionAlgorithm::UNCOMPRESSED, std::nullopt};
ASSERT_TRUE(settings.IsValid());
}
// There should be no compression settings for UNCOMPRESSED.
TEST(CompressionSettingsTest, IsValidCompressionLevelUncompressed) {
CompressionSettings settings = {CompressionAlgorithm::UNCOMPRESSED, 4};
ASSERT_FALSE(settings.IsValid());
}
// Check range limits on ZSTD.
TEST(CompressionSettingsTest, IsValidCompressionLevelZSTD) {
CompressionSettings settings = {CompressionAlgorithm::ZSTD, ZSTD_minCLevel()};
ASSERT_TRUE(settings.IsValid());
settings.compression_level = ZSTD_maxCLevel() + 1;
ASSERT_FALSE(settings.IsValid());
}
// Check range limits on Chunked compression.
TEST(CompressionSettingsTest, IsValidCompressionLevelChunked) {
CompressionSettings settings = {CompressionAlgorithm::CHUNKED,
chunked_compression::CompressionParams::MinCompressionLevel()};
ASSERT_TRUE(settings.IsValid());
settings.compression_level = chunked_compression::CompressionParams::MaxCompressionLevel() + 1;
ASSERT_FALSE(settings.IsValid());
}
} // namespace
} // namespace blobfs