#include "gpu/command_buffer/service/client_service_map.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace gpu {
namespace gles2 {
using MapDataType = size_t;
using ClientServiceMapType = ClientServiceMap<MapDataType, MapDataType>;
TEST(ClientServiceMap, BasicMapping) {
static constexpr MapDataType kClientId = 1;
static constexpr MapDataType kServiceId = 2;
ClientServiceMapType map;
map.SetIDMapping(kClientId, kServiceId);
MapDataType service_id = 0;
EXPECT_TRUE(map.GetServiceID(kClientId, &service_id));
EXPECT_EQ(kServiceId, service_id);
EXPECT_TRUE(map.HasClientID(kClientId));
MapDataType client_id = 0;
EXPECT_TRUE(map.GetClientID(kServiceId, &client_id));
EXPECT_EQ(kClientId, client_id);
EXPECT_TRUE(map.GetClientID(kServiceId, nullptr));
}
TEST(ClientServiceMap, ZeroID) {
static constexpr MapDataType kServiceId = 2;
ClientServiceMapType map;
MapDataType service_id = 0;
EXPECT_TRUE(map.GetServiceID(0, &service_id));
EXPECT_EQ(0u, service_id);
map.SetIDMapping(0, kServiceId);
EXPECT_TRUE(map.GetServiceID(0, &service_id));
EXPECT_EQ(kServiceId, service_id);
}
TEST(ClientServiceMap, InvalidIDs) {
static constexpr MapDataType kClientId = 1;
static constexpr MapDataType kServiceId = 2;
ClientServiceMapType map;
map.SetIDMapping(kClientId, kServiceId);
EXPECT_EQ(kServiceId, map.GetServiceIDOrInvalid(kClientId));
EXPECT_EQ(map.invalid_service_id(), map.GetServiceIDOrInvalid(kClientId + 1));
EXPECT_FALSE(map.GetClientID(kServiceId + 1, nullptr));
}
TEST(ClientServiceMap, UpdateMapping) {
static constexpr MapDataType kClientId = 1;
static constexpr MapDataType kServiceId = 2;
static constexpr MapDataType kNewServiceId =
ClientServiceMapType::kMaxFlatArraySize + 10;
ClientServiceMapType map;
map.SetIDMapping(kClientId, kServiceId);
EXPECT_EQ(kServiceId, map.GetServiceIDOrInvalid(kClientId));
map.RemoveClientID(kClientId);
map.SetIDMapping(kClientId, kNewServiceId);
EXPECT_EQ(kNewServiceId, map.GetServiceIDOrInvalid(kClientId));
}
TEST(ClientServiceMap, RemoveMapping) {
static constexpr MapDataType kClientId = 1;
static constexpr MapDataType kServiceId = 2;
static constexpr MapDataType kLargeServiceId =
ClientServiceMapType::kMaxFlatArraySize + 10;
ClientServiceMapType map;
map.SetIDMapping(kClientId, kServiceId);
EXPECT_TRUE(map.HasClientID(kClientId));
map.RemoveClientID(kClientId);
EXPECT_FALSE(map.HasClientID(kClientId));
map.SetIDMapping(kClientId, kServiceId);
EXPECT_TRUE(map.HasClientID(kClientId));
map.Clear();
EXPECT_FALSE(map.HasClientID(kClientId));
map.SetIDMapping(kClientId, kLargeServiceId);
EXPECT_TRUE(map.HasClientID(kClientId));
map.RemoveClientID(kClientId);
EXPECT_FALSE(map.HasClientID(kClientId));
}
TEST(ClientServiceMap, ManyIDs) {
static constexpr MapDataType kFirstClientId = 1;
static constexpr MapDataType kFirstServiceId = 2;
static constexpr size_t kIdStep = 100;
static constexpr size_t kIdCount =
(ClientServiceMapType::kMaxFlatArraySize + 10) / kIdStep;
ClientServiceMapType map;
for (size_t ii = 0; ii < kIdCount; ii++) {
map.SetIDMapping(kFirstClientId + (ii * kIdStep),
kFirstServiceId + (ii * kIdStep));
}
for (size_t ii = 0; ii < kIdCount; ii++) {
EXPECT_EQ(kFirstServiceId + (ii * kIdStep),
map.GetServiceIDOrInvalid(kFirstClientId + (ii * kIdStep)));
MapDataType client_id = 0;
EXPECT_TRUE(map.GetClientID(kFirstServiceId + (ii * kIdStep), &client_id));
EXPECT_EQ(kFirstClientId + (ii * kIdStep), client_id);
}
}
TEST(ClientServiceMap, DuplicateServiceIDs) {
static constexpr MapDataType kFirstClientId = 1;
static constexpr MapDataType kSecondClientId =
ClientServiceMapType::kMaxFlatArraySize + 1000;
static constexpr MapDataType kServiceId = 2;
ClientServiceMapType map;
map.SetIDMapping(kFirstClientId, kServiceId);
map.SetIDMapping(kSecondClientId, kServiceId);
EXPECT_EQ(kServiceId, map.GetServiceIDOrInvalid(kFirstClientId));
EXPECT_EQ(kServiceId, map.GetServiceIDOrInvalid(kSecondClientId));
MapDataType client_id = 0;
EXPECT_TRUE(map.GetClientID(kServiceId, &client_id));
EXPECT_EQ(kFirstClientId, client_id);
}
TEST(ClientServiceMap, ForEach) {
using MappingSet = std::set<std::pair<MapDataType, MapDataType>>;
const MappingSet kMappings = {
{0, 1},
{10, 10},
{100, 100},
{ClientServiceMapType::kMaxFlatArraySize - 1, 15},
{ClientServiceMapType::kMaxFlatArraySize, 5},
{ClientServiceMapType::kMaxFlatArraySize + 1000, 50},
};
ClientServiceMapType map;
for (const auto& mapping : kMappings) {
map.SetIDMapping(mapping.first, mapping.second);
}
MappingSet seen_mappings;
map.ForEach([&seen_mappings](MapDataType client_id, MapDataType service_id) {
seen_mappings.insert(std::make_pair(client_id, service_id));
});
EXPECT_EQ(kMappings, seen_mappings);
}
}
}