blob: 52169ccbca3698737a316a9f3a635829608b5297 [file] [log] [blame]
// Copyright 2018 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 <string>
#include <gtest/gtest.h>
#include "smbprovider/id_map.h"
namespace smbprovider {
class IdMapTest : public testing::Test {
public:
IdMapTest() = default;
~IdMapTest() override = default;
protected:
void ExpectFound(int32_t id, std::string expected) {
auto iter = map_.Find(id);
EXPECT_NE(map_.End(), iter);
EXPECT_TRUE(map_.Contains(id));
EXPECT_EQ(expected, iter->second);
}
void ExpectNotFound(int32_t id) {
auto iter = map_.Find(id);
EXPECT_EQ(map_.End(), iter);
EXPECT_FALSE(map_.Contains(id));
}
IdMap<const std::string> map_;
DISALLOW_COPY_AND_ASSIGN(IdMapTest);
};
TEST_F(IdMapTest, FindOnEmpty) {
EXPECT_EQ(0, map_.Count());
ExpectNotFound(0);
}
TEST_F(IdMapTest, TestInsertandFind) {
const std::string expected = "Foo";
const int32_t id = map_.Insert(expected);
EXPECT_GE(id, 0);
ExpectFound(id, expected);
EXPECT_EQ(1, map_.Count());
}
TEST_F(IdMapTest, TestInsertAndContains) {
const std::string expected = "Foo";
const int32_t id = map_.Insert(expected);
EXPECT_GE(id, 0);
EXPECT_TRUE(map_.Contains(id));
EXPECT_FALSE(map_.Contains(id + 1));
}
TEST_F(IdMapTest, TestInsertandFindNonExistant) {
const std::string expected = "Foo";
const int32_t id = map_.Insert(expected);
EXPECT_GE(id, 0);
ExpectFound(id, expected);
ExpectNotFound(id + 1);
}
TEST_F(IdMapTest, TestInsertMultipleAndFind) {
const std::string expected1 = "Foo1";
const std::string expected2 = "Foo2";
const int32_t id1 = map_.Insert(expected1);
EXPECT_EQ(1, map_.Count());
const int32_t id2 = map_.Insert(expected2);
EXPECT_EQ(2, map_.Count());
// Both ids are >= 0 and not the same.
EXPECT_GE(id1, 0);
EXPECT_GE(id2, 0);
EXPECT_NE(id1, id2);
ExpectFound(id1, expected1);
ExpectFound(id2, expected2);
}
TEST_F(IdMapTest, TestRemoveOnEmpty) {
EXPECT_FALSE(map_.Remove(0));
}
TEST_F(IdMapTest, TestRemoveNonExistant) {
const std::string expected = "Foo";
const int32_t id = map_.Insert(expected);
EXPECT_GE(id, 0);
ExpectFound(id, expected);
ExpectNotFound(id + 1);
EXPECT_FALSE(map_.Remove(id + 1));
}
TEST_F(IdMapTest, TestInsertAndRemove) {
const std::string expected = "Foo";
const int32_t id = map_.Insert(expected);
EXPECT_GE(id, 0);
EXPECT_TRUE(map_.Contains(id));
EXPECT_EQ(1, map_.Count());
EXPECT_TRUE(map_.Remove(id));
ExpectNotFound(id);
EXPECT_EQ(0, map_.Count());
}
TEST_F(IdMapTest, TestInsertRemoveInsertRemove) {
const std::string expected = "Foo";
const int32_t id1 = map_.Insert(expected);
EXPECT_GE(id1, 0);
EXPECT_TRUE(map_.Contains(id1));
EXPECT_EQ(1, map_.Count());
EXPECT_TRUE(map_.Remove(id1));
ExpectNotFound(id1);
EXPECT_EQ(0, map_.Count());
const int32_t id2 = map_.Insert(expected);
EXPECT_GE(id2, 0);
EXPECT_TRUE(map_.Contains(id2));
EXPECT_EQ(1, map_.Count());
EXPECT_TRUE(map_.Remove(id2));
ExpectNotFound(id2);
EXPECT_EQ(0, map_.Count());
}
TEST_F(IdMapTest, TestIdReuse) {
const int32_t id1 = map_.Insert("Foo");
const int32_t id2 = map_.Insert("Bar");
EXPECT_GE(id1, 0);
EXPECT_GE(id2, 0);
EXPECT_NE(id1, id2);
// Remove the id and check that it is reused.
map_.Remove(id2);
const int32_t id3 = map_.Insert("Baz");
EXPECT_EQ(id3, id2);
// Get another unused id.
const int32_t id4 = map_.Insert("Qux");
EXPECT_GE(id4, 0);
EXPECT_NE(id1, id4);
EXPECT_NE(id3, id4);
}
} // namespace smbprovider