blob: f5caf2477a7046f9120c2e29f50a07501d201374 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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());
// Shared version is equal to `kInitialVersion`
EXPECT_FALSE(client.SharedVersionIsGreaterThan(
mojo::shared_memory_version::kInitialVersion));
EXPECT_FALSE(client.SharedVersionIsLessThan(
mojo::shared_memory_version::kInitialVersion));
// Comparing to `kInvalidVersion` always defaults to true.
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;
// Remote version initially smaller then incremented.
EXPECT_FALSE(client.SharedVersionIsGreaterThan(local_version));
controller.Increment();
EXPECT_TRUE(client.SharedVersionIsGreaterThan(local_version));
// Local version catches up.
++local_version;
EXPECT_FALSE(client.SharedVersionIsGreaterThan(local_version));
EXPECT_FALSE(client.SharedVersionIsLessThan(local_version));
// Local version overtakes remote 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;
// Remote count up to date.
EXPECT_FALSE(client.CommittedWritesIsLessThan(required_committed_writes));
// Local count increases.
++required_committed_writes;
EXPECT_TRUE(client.CommittedWritesIsLessThan(required_committed_writes));
// Remote count catches up.
controller.CommitWrite();
EXPECT_FALSE(client.CommittedWritesIsLessThan(required_committed_writes));
// More remote updates still satisfy the requirement.
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();
// Client is still valid past the lifetime of the controller.
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));
}
} // namespace