blob: 08e9a8983cb36a3b843e82dae9271ce5ffbe3707 [file] [log] [blame]
// Copyright 2020 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 <memory>
#include <random>
#include <string>
#include <gtest/gtest.h>
#include "vm_tools/pstore_dump/persistent_ram_buffer.h"
namespace vm_tools {
namespace pstore_dump {
class PersistentRamBufferTest : public ::testing::Test {
public:
PersistentRamBufferTest() = default;
~PersistentRamBufferTest() override = default;
private:
std::default_random_engine gen;
public:
std::string GetRandomString(size_t length) {
std::string s;
while (s.length() < length) {
s.push_back(std::uniform_int_distribution<char>('A', 'Z')(gen));
}
return s;
}
};
void InitializePersistentRamBuffer(persistent_ram_buffer* buf,
size_t buf_capacity) {
DCHECK(buf);
buf->sig = PERSISTENT_RAM_SIG;
buf->start = 0;
buf->size = 0;
memset(buf->data, 0, buf_capacity);
}
void StorePersistentRamBuffer(persistent_ram_buffer* buf,
size_t buf_capacity,
const std::string& data) {
DCHECK(buf);
DCHECK(data.length() <= buf_capacity);
if (buf->start + data.length() <= buf_capacity) {
memcpy(buf->data + buf->start, data.c_str(), data.length());
buf->start += data.length();
buf->size += data.length();
} else {
int remaining_capacity = buf_capacity - buf->start;
memcpy(buf->data + buf->start, data.c_str(), remaining_capacity);
memcpy(buf->data, data.c_str() + remaining_capacity,
data.length() - remaining_capacity);
buf->start = (buf->start + data.length()) % buf_capacity;
buf->size = buf_capacity;
}
}
const int kBufferSize = 0x10000;
const int kBufferCapacity = kBufferSize - sizeof(persistent_ram_buffer);
TEST_F(PersistentRamBufferTest, checkGetContentWithoutRotation) {
std::unique_ptr<char[]> buf_ = std::make_unique<char[]>(kBufferSize);
persistent_ram_buffer* buf =
reinterpret_cast<persistent_ram_buffer*>(buf_.get());
InitializePersistentRamBuffer(buf, kBufferCapacity);
std::string expected = GetRandomString(100);
StorePersistentRamBuffer(buf, kBufferCapacity, expected);
std::string actual;
EXPECT_TRUE(GetPersistentRamBufferContent(buf, kBufferCapacity, &actual));
EXPECT_EQ(actual, expected);
EXPECT_EQ(buf->start, expected.size());
}
TEST_F(PersistentRamBufferTest, checkGetContentWithRotation) {
std::unique_ptr<char[]> buf_ = std::make_unique<char[]>(kBufferSize);
persistent_ram_buffer* buf =
reinterpret_cast<persistent_ram_buffer*>(buf_.get());
InitializePersistentRamBuffer(buf, kBufferCapacity);
std::string data1 =
GetRandomString(static_cast<size_t>(kBufferCapacity * 0.8));
StorePersistentRamBuffer(buf, kBufferCapacity, data1);
std::string data2 =
GetRandomString(static_cast<size_t>(kBufferCapacity * 0.8));
StorePersistentRamBuffer(buf, kBufferCapacity, data2);
std::string expected =
data1.substr(data1.length() + data2.length() - kBufferCapacity) + data2;
std::string actual;
EXPECT_TRUE(GetPersistentRamBufferContent(buf, kBufferCapacity, &actual));
EXPECT_EQ(actual, expected);
EXPECT_EQ(buf->start, data1.length() + data2.length() - kBufferCapacity);
}
} // namespace pstore_dump
} // namespace vm_tools