blob: 7bf11409913bb077cb41ff8350e90e09b4164d51 [file] [log] [blame]
[email protected]1f7d92af2014-05-29 20:10:361// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/supports_user_data.h"
6
7#include <vector>
8
sdefresneae5e2d22017-02-13 11:49:269#include "base/memory/ptr_util.h"
[email protected]1f7d92af2014-05-29 20:10:3610#include "testing/gtest/include/gtest/gtest.h"
11
12namespace base {
13namespace {
14
Matt Muellere74f61772019-08-13 20:00:5915struct TestSupportsUserData : public SupportsUserData {
16 // Make ClearAllUserData public so tests can access it.
17 using SupportsUserData::ClearAllUserData;
18};
[email protected]1f7d92af2014-05-29 20:10:3619
20struct UsesItself : public SupportsUserData::Data {
21 UsesItself(SupportsUserData* supports_user_data, const void* key)
22 : supports_user_data_(supports_user_data),
23 key_(key) {
24 }
25
dcheng56488182014-10-21 10:54:5126 ~UsesItself() override {
Ivan Kotenkova16212a52017-11-08 12:37:3327 EXPECT_EQ(nullptr, supports_user_data_->GetUserData(key_));
[email protected]1f7d92af2014-05-29 20:10:3628 }
29
30 SupportsUserData* supports_user_data_;
31 const void* key_;
32};
33
34TEST(SupportsUserDataTest, ClearWorksRecursively) {
35 TestSupportsUserData supports_user_data;
36 char key = 0;
sdefresneae5e2d22017-02-13 11:49:2637 supports_user_data.SetUserData(
Jeremy Roman9532f252017-08-16 23:27:2438 &key, std::make_unique<UsesItself>(&supports_user_data, &key));
[email protected]1f7d92af2014-05-29 20:10:3639 // Destruction of supports_user_data runs the actual test.
40}
41
Matt Mueller39fc01f92019-08-10 02:24:0842struct TestData : public SupportsUserData::Data {};
43
44TEST(SupportsUserDataTest, Movable) {
45 TestSupportsUserData supports_user_data_1;
46 char key1 = 0;
47 supports_user_data_1.SetUserData(&key1, std::make_unique<TestData>());
48 void* data_1_ptr = supports_user_data_1.GetUserData(&key1);
49
50 TestSupportsUserData supports_user_data_2;
51 char key2 = 0;
52 supports_user_data_2.SetUserData(&key2, std::make_unique<TestData>());
53
54 supports_user_data_2 = std::move(supports_user_data_1);
55
56 EXPECT_EQ(data_1_ptr, supports_user_data_2.GetUserData(&key1));
57 EXPECT_EQ(nullptr, supports_user_data_2.GetUserData(&key2));
58}
59
Matt Muellere74f61772019-08-13 20:00:5960TEST(SupportsUserDataTest, ClearAllUserData) {
61 TestSupportsUserData supports_user_data;
62 char key1 = 0;
63 supports_user_data.SetUserData(&key1, std::make_unique<TestData>());
64 char key2 = 0;
65 supports_user_data.SetUserData(&key2, std::make_unique<TestData>());
66
67 EXPECT_TRUE(supports_user_data.GetUserData(&key1));
68 EXPECT_TRUE(supports_user_data.GetUserData(&key2));
69
70 supports_user_data.ClearAllUserData();
71
72 EXPECT_FALSE(supports_user_data.GetUserData(&key1));
73 EXPECT_FALSE(supports_user_data.GetUserData(&key2));
74}
75
[email protected]1f7d92af2014-05-29 20:10:3676} // namespace
77} // namespace base