blob: 33a23e4f2e40a6c1e6908470745c553a566ca2c8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <gmock/gmock.h>
#include <boost/filesystem.hpp>
#include <boost/process/environment.hpp>
#include <gtest/gtest.h>
#include "CacheImpl.hpp"
#include "statistics/HostStatSampler.hpp"
#include "statistics/StatArchiveWriter.hpp"
using ::testing::Eq;
using ::testing::IsEmpty;
using ::testing::IsFalse;
using ::testing::IsTrue;
using ::testing::StrEq;
using apache::geode::statistics::HostStatSampler;
using apache::geode::statistics::StatArchiveWriter;
constexpr size_t kibibyte = 1024;
constexpr size_t mebibyte = kibibyte * 1024;
constexpr size_t gibibyte = mebibyte * 1024;
class TestableHostStatSampler : public HostStatSampler {
public:
explicit TestableHostStatSampler(std::string filePath,
std::chrono::milliseconds sampleRate,
size_t statFileLimit,
size_t statDiskSpaceLimit)
: HostStatSampler(filePath, sampleRate, statFileLimit,
statDiskSpaceLimit) {}
boost::filesystem::path chkForGFSExt(boost::filesystem::path filename) const {
return HostStatSampler::chkForGFSExt(filename);
}
boost::filesystem::path initStatFileWithExt() {
return HostStatSampler::initStatFileWithExt();
}
void rollArchive(std::string filename) {
HostStatSampler::rollArchive(filename);
}
void initStatDiskSpaceEnabled() {
HostStatSampler::initStatDiskSpaceEnabled();
}
void initRollIndex() { HostStatSampler::initRollIndex(); }
int32_t getRollIndex() { return HostStatSampler::rollIndex_; }
size_t getSpaceUsed() { return HostStatSampler::spaceUsed_; }
};
TEST(HostStatSamplerTest,
constructEmptyPathZeroSampleRateZeroFileLimitZeroDiskLimit) {
const TestableHostStatSampler hostStatSampler(
"", std::chrono::milliseconds::zero(), 0, 0);
EXPECT_THAT(hostStatSampler.getArchiveFilename(), Eq(""));
EXPECT_THAT(hostStatSampler.getSampleRate(),
Eq(std::chrono::milliseconds::zero()));
EXPECT_THAT(hostStatSampler.getArchiveFileSizeLimit(), Eq(0));
EXPECT_THAT(hostStatSampler.getArchiveDiskSpaceLimit(), Eq(0));
}
TEST(HostStatSamplerTest, constructWithFileLimitOverMax) {
const TestableHostStatSampler hostStatSampler(
"", std::chrono::milliseconds::zero(), 1025, 0);
EXPECT_THAT(hostStatSampler.getArchiveFileSizeLimit(), Eq(1 * gibibyte));
}
TEST(HostStatSamplerTest, constructWithDiskLimitLessThanFileLimit) {
const TestableHostStatSampler hostStatSampler(
"", std::chrono::milliseconds::zero(), 5, 4);
EXPECT_THAT(hostStatSampler.getArchiveDiskSpaceLimit(), Eq(4 * mebibyte));
}
TEST(HostStatSamplerTest, chkForGFSExtWithoutDiskLimit) {
const TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 0);
EXPECT_THAT(hostStatSampler.chkForGFSExt("x.gfs"), Eq("x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("/tmp/x.gfs"), Eq("/tmp/x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("x"), Eq("x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("/tmp/x"), Eq("/tmp/x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("x.ext"), Eq("x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("/tmp/x.ext"), Eq("/tmp/x.gfs"));
}
TEST(HostStatSamplerTest, chkForGFSExtWithDiskSpaceLimit) {
const TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 1);
EXPECT_THAT(hostStatSampler.chkForGFSExt("x.gfs"), Eq("x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("/tmp/x.gfs"), Eq("/tmp/x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("x"), Eq("x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("/tmp/x"), Eq("/tmp/x.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("x.ext"), Eq("x.ext.gfs"));
EXPECT_THAT(hostStatSampler.chkForGFSExt("/tmp/x.ext"), Eq("/tmp/x.ext.gfs"));
}
TEST(HostStatSamplerTest, createArchiveFilenameWithoutDiskSpaceLimit) {
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 0);
EXPECT_THAT(
hostStatSampler.createArchiveFilename(),
Eq("stats-" + std::to_string(boost::this_process::get_id()) + ".gfs"));
}
TEST(HostStatSamplerTest,
createArchiveFilenameWithAlternativeExtensionWithoutDiskSpaceLimit) {
TestableHostStatSampler hostStatSampler(
"stats.ext", std::chrono::milliseconds::zero(), 0, 0);
EXPECT_THAT(
hostStatSampler.createArchiveFilename(),
Eq("stats-" + std::to_string(boost::this_process::get_id()) + ".gfs"));
}
TEST(HostStatSamplerTest,
createArchiveFilenameWithoutExtensionOrDiskSpaceLimit) {
TestableHostStatSampler hostStatSampler(
"stats", std::chrono::milliseconds::zero(), 0, 0);
EXPECT_THAT(
hostStatSampler.createArchiveFilename(),
Eq("stats-" + std::to_string(boost::this_process::get_id()) + ".gfs"));
}
TEST(HostStatSamplerTest, createArchiveFilenameWithDiskSpaceLimit) {
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 1);
EXPECT_THAT(hostStatSampler.createArchiveFilename(), Eq("stats.gfs"));
}
TEST(HostStatSamplerTest, initStatFileWithExtWithoutDiskSpaceLimit) {
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 0);
EXPECT_THAT(
hostStatSampler.initStatFileWithExt(),
Eq("stats-" + std::to_string(boost::this_process::get_id()) + ".gfs"));
}
TEST(HostStatSamplerTest,
initStatFileWithExtWithAlternativeExtensionWithoutDiskSpaceLimit) {
TestableHostStatSampler hostStatSampler(
"stats.ext", std::chrono::milliseconds::zero(), 0, 0);
EXPECT_THAT(
hostStatSampler.initStatFileWithExt(),
Eq("stats-" + std::to_string(boost::this_process::get_id()) + ".gfs"));
}
TEST(HostStatSamplerTest, initStatFileWithExtWithoutExtensionOrDiskSpaceLimit) {
TestableHostStatSampler hostStatSampler(
"stats", std::chrono::milliseconds::zero(), 0, 0);
EXPECT_THAT(
hostStatSampler.initStatFileWithExt(),
Eq("stats-" + std::to_string(boost::this_process::get_id()) + ".gfs"));
}
TEST(HostStatSamplerTest, initStatFileWithExtWithDiskSpaceLimit) {
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 1);
EXPECT_THAT(hostStatSampler.initStatFileWithExt(), Eq("stats.gfs"));
}
// TODO integration test
TEST(HostStatSamplerTest, DISABLED_changeArchive) {
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 0);
// const auto archiver = hostStatSampler.getArchiver();
hostStatSampler.changeArchive("changed.gfs");
// EXPECT_THAT(hostStatSampler.getArchiver(), Eq(archiver));
EXPECT_THAT(hostStatSampler.isRunning(), IsTrue());
}
TEST(HostStatSamplerTest, rollArchiveFileWithNonexistentFile) {
boost::filesystem::path file("nonexistent.gfs");
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 0);
boost::filesystem::remove(file);
ASSERT_THAT(boost::filesystem::exists(file), IsFalse());
hostStatSampler.rollArchive(file.string());
EXPECT_THAT(boost::filesystem::exists(file), IsFalse());
}
TEST(HostStatSamplerTest, rollArchiveFileWithEmptyFile) {
boost::filesystem::path file{"empty.gfs"};
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 0);
{
boost::filesystem::remove(file);
boost::filesystem::ofstream ofs{file};
}
ASSERT_THAT(boost::filesystem::exists(file), IsTrue());
ASSERT_THAT(boost::filesystem::is_empty(file), IsTrue());
hostStatSampler.rollArchive(file.string());
EXPECT_THAT(boost::filesystem::exists(file), IsTrue());
EXPECT_THAT(boost::filesystem::is_empty(file), IsTrue());
boost::filesystem::remove(file);
}
TEST(HostStatSamplerTest, rollArchiveFile) {
boost::filesystem::path file{"stats.gfs"};
boost::filesystem::path file0{"stats-0.gfs"};
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 0);
{
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::ofstream ofs{file};
ofs << "original content";
}
ASSERT_THAT(boost::filesystem::exists(file), IsTrue());
ASSERT_THAT(boost::filesystem::is_empty(file), IsFalse());
ASSERT_THAT(boost::filesystem::exists(file0), IsFalse());
hostStatSampler.rollArchive(file.string());
EXPECT_THAT(boost::filesystem::exists(file), IsFalse());
EXPECT_THAT(boost::filesystem::exists(file0), IsTrue());
EXPECT_THAT(boost::filesystem::is_empty(file0), IsFalse());
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
}
TEST(HostStatSamplerTest, rollArchiveFileWithDirectory) {
auto file = boost::filesystem::temp_directory_path() / "stats.gfs";
auto file0 = boost::filesystem::temp_directory_path() / "stats-0.gfs";
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 0);
{
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::ofstream ofs{file};
ofs << "original content";
}
ASSERT_THAT(boost::filesystem::exists(file), IsTrue());
ASSERT_THAT(boost::filesystem::is_empty(file), IsFalse());
ASSERT_THAT(boost::filesystem::exists(file0), IsFalse());
hostStatSampler.rollArchive(file.string());
EXPECT_THAT(boost::filesystem::exists(file), IsFalse());
EXPECT_THAT(boost::filesystem::exists(file0), IsTrue());
EXPECT_THAT(boost::filesystem::is_empty(file0), IsFalse());
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
}
TEST(HostStatSamplerTest, rollArchiveFileWithoutExtensionThrows) {
boost::filesystem::path file{"stats"};
boost::filesystem::path file0{"stats-0"};
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 0);
{
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::ofstream ofs{file};
ofs << "original content";
}
ASSERT_THAT(boost::filesystem::exists(file), IsTrue());
ASSERT_THAT(boost::filesystem::is_empty(file), IsFalse());
ASSERT_THAT(boost::filesystem::exists(file0), IsFalse());
EXPECT_THROW(hostStatSampler.rollArchive(file.string()),
apache::geode::client::IllegalArgumentException);
EXPECT_THAT(boost::filesystem::exists(file), IsTrue());
EXPECT_THAT(boost::filesystem::is_empty(file), IsFalse());
EXPECT_THAT(boost::filesystem::exists(file0), IsFalse());
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
}
TEST(HostStatSamplerTest, rollArchiveFileNextFileExists) {
boost::filesystem::path file{"stats.gfs"};
boost::filesystem::path file0{"stats-0.gfs"};
boost::filesystem::path file1{"stats-1.gfs"};
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 0);
{
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::remove(file1);
boost::filesystem::ofstream ofs{file};
ofs << "more content";
boost::filesystem::ofstream ofs0{file0};
ofs0 << "original content";
}
ASSERT_THAT(boost::filesystem::exists(file), IsTrue());
ASSERT_THAT(boost::filesystem::is_empty(file), IsFalse());
ASSERT_THAT(boost::filesystem::exists(file0), IsTrue());
ASSERT_THAT(boost::filesystem::is_empty(file0), IsFalse());
ASSERT_THAT(boost::filesystem::exists(file1), IsFalse());
hostStatSampler.rollArchive(file.string());
EXPECT_THAT(boost::filesystem::exists(file), IsFalse());
EXPECT_THAT(boost::filesystem::exists(file0), IsTrue());
EXPECT_THAT(boost::filesystem::is_empty(file0), IsFalse());
EXPECT_THAT(boost::filesystem::exists(file1), IsTrue());
EXPECT_THAT(boost::filesystem::is_empty(file1), IsFalse());
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::remove(file1);
}
TEST(HostStatSamplerTest, initStatDiskSpaceEnabledWithZeroDiskLimit) {
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 0);
hostStatSampler.initStatDiskSpaceEnabled();
EXPECT_THAT(hostStatSampler.getArchiveFilename(), Eq("stats.gfs"));
}
TEST(HostStatSamplerTest,
DISABLED_initStatDiskSpaceEnabledWithNonzeronDiskLimit) {
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 1);
hostStatSampler.initStatDiskSpaceEnabled();
EXPECT_THAT(hostStatSampler.getArchiveFilename(), Eq("stats.gfs"));
}
TEST(
HostStatSamplerTest,
DISABLED_initStatDiskSpaceEnabledWithNonzeroFileLimitNonzeronDiskLimitAndExistingFile) {
boost::filesystem::path file{"stats.gfs"};
boost::filesystem::remove(file);
{ boost::filesystem::ofstream ofs{file}; }
boost::filesystem::path file0{"stats-0.gfs"};
boost::filesystem::remove(file0);
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 1, 1);
ASSERT_THAT(boost::filesystem::exists(file), IsTrue());
hostStatSampler.initStatDiskSpaceEnabled();
EXPECT_THAT(boost::filesystem::exists(file), IsFalse());
EXPECT_THAT(boost::filesystem::exists(file0), IsTrue());
}
TEST(HostStatSamplerTest, initRollIndexNoFiles) {
TestableHostStatSampler hostStatSampler(
"stats.gfs", std::chrono::milliseconds::zero(), 0, 1);
hostStatSampler.initRollIndex();
EXPECT_THAT(hostStatSampler.getRollIndex(), Eq(0));
}
TEST(HostStatSamplerTest, initRollIndex2Files) {
boost::filesystem::path file{"stats.gfs"};
boost::filesystem::path file0{"stats-0.gfs"};
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 1);
{
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::ofstream ofs{file};
boost::filesystem::ofstream ofs0{file0};
}
hostStatSampler.initRollIndex();
EXPECT_THAT(hostStatSampler.getRollIndex(), Eq(1));
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
}
TEST(HostStatSamplerTest, checkDiskLimitUnderLimit) {
boost::filesystem::path file{"stats.gfs"};
boost::filesystem::path file0{"stats-0.gfs"};
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 1);
{
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::ofstream ofs{file};
ofs << "more content";
boost::filesystem::ofstream ofs0{file0};
ofs0 << "original content";
}
EXPECT_THAT(boost::filesystem::exists(file), IsTrue());
EXPECT_THAT(boost::filesystem::exists(file0), IsTrue());
EXPECT_THAT(boost::filesystem::file_size(file0), Eq(16));
hostStatSampler.checkDiskLimit();
EXPECT_THAT(hostStatSampler.getSpaceUsed(), Eq(16));
EXPECT_THAT(boost::filesystem::exists(file), IsTrue());
EXPECT_THAT(boost::filesystem::exists(file0), IsTrue());
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
}
TEST(HostStatSamplerTest, checkDiskLimitOverLimit) {
boost::filesystem::path file{"stats.gfs"};
boost::filesystem::path file0{"stats-0.gfs"};
boost::filesystem::path file1{"stats-1.gfs"};
TestableHostStatSampler hostStatSampler(
file.string(), std::chrono::milliseconds::zero(), 0, 1);
{
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::ofstream ofs{file};
ofs << "more content";
boost::filesystem::ofstream ofs0{file0};
ofs0 << std::string(1 * mebibyte, 'a');
boost::filesystem::ofstream ofs1{file1};
ofs1 << std::string(1, 'a');
}
EXPECT_THAT(boost::filesystem::exists(file), IsTrue());
EXPECT_THAT(boost::filesystem::exists(file0), IsTrue());
EXPECT_THAT(boost::filesystem::file_size(file0), Eq(1 * mebibyte));
EXPECT_THAT(boost::filesystem::exists(file1), IsTrue());
EXPECT_THAT(boost::filesystem::file_size(file1), Eq(1));
hostStatSampler.checkDiskLimit();
EXPECT_THAT(hostStatSampler.getSpaceUsed(), Eq(1));
EXPECT_THAT(boost::filesystem::exists(file), IsTrue());
EXPECT_THAT(boost::filesystem::exists(file0), IsFalse());
EXPECT_THAT(boost::filesystem::exists(file1), IsTrue());
// EXPECT_THAT(boost::filesystem::file_size(file1), Eq(1));
boost::filesystem::remove(file);
boost::filesystem::remove(file0);
boost::filesystem::remove(file1);
}