#include <optional>
#include "mojo/public/cpp/base/shared_memory_version.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
TEST(SharedMemoryVersionTest, InitialSetupAllowsVersionSharing) {
mojo::SharedMemoryVersionController controller;
EXPECT_EQ(controller.GetSharedVersion(),
mojo::shared_memory_version::kInitialVersion);
mojo::SharedMemoryVersionClient client(controller.GetSharedMemoryRegion());
EXPECT_FALSE(client.SharedVersionIsGreaterThan(
mojo::shared_memory_version::kInitialVersion));
EXPECT_FALSE(client.SharedVersionIsLessThan(
mojo::shared_memory_version::kInitialVersion));
EXPECT_TRUE(client.SharedVersionIsGreaterThan(
mojo::shared_memory_version::kInvalidVersion));
EXPECT_TRUE(client.SharedVersionIsLessThan(
mojo::shared_memory_version::kInvalidVersion));
EXPECT_FALSE(client.CommittedWritesIsLessThan(0));
EXPECT_TRUE(client.CommittedWritesIsLessThan(1));
}
TEST(SharedMemoryVersionTest, VersionIncrementsAreReflectedInClient) {
mojo::SharedMemoryVersionController controller;
mojo::SharedMemoryVersionClient client(controller.GetSharedMemoryRegion());
mojo::VersionType local_version =
mojo::shared_memory_version::kInitialVersion;
EXPECT_FALSE(client.SharedVersionIsGreaterThan(local_version));
controller.Increment();
EXPECT_TRUE(client.SharedVersionIsGreaterThan(local_version));
++local_version;
EXPECT_FALSE(client.SharedVersionIsGreaterThan(local_version));
EXPECT_FALSE(client.SharedVersionIsLessThan(local_version));
++local_version;
EXPECT_TRUE(client.SharedVersionIsLessThan(local_version));
}
TEST(SharedMemoryVersionTest, CommittedWritesAreReflectedInClient) {
mojo::SharedMemoryVersionController controller;
mojo::SharedMemoryVersionClient client(controller.GetSharedMemoryRegion());
mojo::VersionType required_committed_writes = 0;
EXPECT_FALSE(client.CommittedWritesIsLessThan(required_committed_writes));
++required_committed_writes;
EXPECT_TRUE(client.CommittedWritesIsLessThan(required_committed_writes));
controller.CommitWrite();
EXPECT_FALSE(client.CommittedWritesIsLessThan(required_committed_writes));
controller.CommitWrite();
EXPECT_FALSE(client.CommittedWritesIsLessThan(required_committed_writes));
}
TEST(SharedMemoryVersionTest, ClientRemainsValidThroughControllerDestuction) {
std::optional<mojo::SharedMemoryVersionController> controller;
controller.emplace();
controller->Increment();
controller->CommitWrite();
mojo::SharedMemoryVersionClient client(controller->GetSharedMemoryRegion());
controller.reset();
EXPECT_TRUE(client.SharedVersionIsGreaterThan(
mojo::shared_memory_version::kInitialVersion));
EXPECT_FALSE(client.SharedVersionIsLessThan(
mojo::shared_memory_version::kInitialVersion));
EXPECT_FALSE(client.CommittedWritesIsLessThan(1));
EXPECT_TRUE(client.CommittedWritesIsLessThan(2));
}
}