Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: ppapi/shared_impl/var_tracker_unittest.cc

Issue 8953017: Pepper: unit tests for VarTracker (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ppapi/shared_impl/var_tracker.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 "testing/gtest/include/gtest/gtest.h"
6
7 #include "base/compiler_specific.h"
8 #include "ppapi/shared_impl/var.h"
9 #include "ppapi/shared_impl/var_tracker.h"
10 #include "ppapi/shared_impl/test_globals.h"
11
12 namespace ppapi {
13
14 namespace {
15
16 int mock_var_alive_count = 0;
17
18 class MockStringVar : public StringVar {
19 public:
20 MockStringVar(const std::string& str) : StringVar(str) {
21 mock_var_alive_count++;
22 }
23 virtual ~MockStringVar() {
24 mock_var_alive_count--;
25 }
26 bool HasValidVarID() {
27 return GetExistingVarID() != 0;
28 }
29 };
30
31 class MockObjectVar : public Var {
32 public:
33 MockObjectVar() : Var() {
34 mock_var_alive_count++;
35 }
36 virtual ~MockObjectVar() {
37 mock_var_alive_count--;
38 }
39 virtual PP_Var GetPPVar() OVERRIDE {
40 int32 id = GetOrCreateVarID();
41 if (!id)
42 return PP_MakeNull();
43
44 PP_Var result;
45 result.type = PP_VARTYPE_OBJECT;
46 result.padding = 0;
47 result.value.as_id = id;
48 return result;
49 }
50 virtual PP_VarType GetType() const OVERRIDE {
51 return PP_VARTYPE_OBJECT;
52 }
53 bool HasValidVarID() {
54 return GetExistingVarID() != 0;
55 }
56 };
57
58 } // namespace
59
60 class VarTrackerTest : public testing::Test {
61 public:
62 VarTrackerTest() {}
63
64 // Test implementation.
65 virtual void SetUp() OVERRIDE {
66 ASSERT_EQ(0, mock_var_alive_count);
67 }
68 virtual void TearDown() OVERRIDE {
69 }
70
71 VarTracker& var_tracker() { return *globals_.GetVarTracker(); }
72
73 private:
74 TestGlobals globals_;
75 };
76
77 // Test that ResetVarID is called when the last PP_Var ref was deleted but the
78 // object lives on.
79 TEST_F(VarTrackerTest, LastResourceRef) {
80 scoped_refptr<MockStringVar> var(new MockStringVar(std::string("xyz")));
81 PP_Var pp_var = var->GetPPVar();
82 EXPECT_TRUE(var->HasValidVarID());
83 EXPECT_TRUE(var_tracker().GetVar(var->GetExistingVarID()));
84
85 // Releasing it should keep the object (because we have a ref) but reset the
86 // var_id_.
87 EXPECT_TRUE(var_tracker().ReleaseVar(pp_var));
88 EXPECT_FALSE(var->HasValidVarID());
89 EXPECT_EQ(1, mock_var_alive_count);
90
91 var = NULL;
92 EXPECT_EQ(0, mock_var_alive_count);
93 }
94
95 TEST_F(VarTrackerTest, GetResourceRefAgain) {
brettw 2011/12/15 16:58:45 Can you substitute every time you say "Resource" i
Takashi Toyoshima 2011/12/16 04:28:45 Done.
96 scoped_refptr<MockStringVar> var(new MockStringVar(std::string("xyz")));
97 PP_Var pp_var = var->GetPPVar();
98 EXPECT_TRUE(var_tracker().ReleaseVar(pp_var));
99 EXPECT_FALSE(var->HasValidVarID());
100 EXPECT_EQ(1, mock_var_alive_count);
101
102 // Obtaining PP_Var ref again, and add ref from VarTracker.
103 pp_var = var->GetPPVar();
104 EXPECT_TRUE(var->HasValidVarID());
105 EXPECT_TRUE(var_tracker().GetVar(var->GetExistingVarID()));
106 scoped_refptr<MockStringVar> another_var =
107 static_cast<MockStringVar*>(var_tracker().GetVar(pp_var));
108 EXPECT_EQ(1, mock_var_alive_count);
109
110 // Releasing it again.
111 EXPECT_TRUE(var_tracker().ReleaseVar(pp_var));
112 EXPECT_FALSE(var->HasValidVarID());
113 EXPECT_EQ(1, mock_var_alive_count);
114
115 var = NULL;
116 EXPECT_FALSE(var_tracker().GetVar(pp_var));
117 EXPECT_EQ(1, mock_var_alive_count);
118 another_var = NULL;
119 EXPECT_FALSE(var_tracker().GetVar(pp_var));
120 EXPECT_EQ(0, mock_var_alive_count);
121 }
122
123 // Tests when the plugin is holding a ref to a PP_Var when the instance is
124 // owned only by VarTracker.
125 TEST_F(VarTrackerTest, ResourceRefWithoutVarRef) {
126 // Make a PP_Var with one ref held by the plugin, and release the reference.
127 scoped_refptr<MockStringVar> var(new MockStringVar(std::string("zzz")));
128 PP_Var pp_var = var->GetPPVar();
129 EXPECT_EQ(1, mock_var_alive_count);
130 var = NULL;
131 EXPECT_EQ(1, mock_var_alive_count);
132
133 // The var is owned only by VarTracker. PP_Var must be still valid.
134 EXPECT_TRUE(var_tracker().GetVar(pp_var));
135
136 var_tracker().ReleaseVar(pp_var);
137 EXPECT_EQ(0, mock_var_alive_count);
138 EXPECT_FALSE(var_tracker().GetVar(pp_var));
139 }
140
141 // Tests on Var having type of PP_VARTYPE_OBJECT.
142 TEST_F(VarTrackerTest, ObjectRef) {
143 scoped_refptr<MockObjectVar> var(new MockObjectVar());
144 PP_Var pp_var = var->GetPPVar();
145 EXPECT_TRUE(var_tracker().ReleaseVar(pp_var));
146 EXPECT_FALSE(var->HasValidVarID());
147 EXPECT_EQ(1, mock_var_alive_count);
148
149 // Obtaining PP_Var ref again, and add ref from VarTracker.
150 pp_var = var->GetPPVar();
151 EXPECT_TRUE(var->HasValidVarID());
152 EXPECT_TRUE(var_tracker().GetVar(var->GetExistingVarID()));
153 scoped_refptr<MockObjectVar> another_var =
154 static_cast<MockObjectVar*>(var_tracker().GetVar(pp_var));
155 EXPECT_EQ(1, mock_var_alive_count);
156
157 // Releasing all references, then only VarTracker own the instance.
158 var = NULL;
159 EXPECT_TRUE(var_tracker().GetVar(pp_var));
160 EXPECT_EQ(1, mock_var_alive_count);
161 another_var = NULL;
162 EXPECT_TRUE(var_tracker().GetVar(pp_var));
163 EXPECT_EQ(1, mock_var_alive_count);
164
165 // Releasing resource reference.
166 EXPECT_TRUE(var_tracker().ReleaseVar(pp_var));
167 EXPECT_EQ(0, mock_var_alive_count);
168 }
169
170 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/shared_impl/var_tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698