OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "fake_var_interface.h" | 5 #include "fake_var_interface.h" |
| 6 #include "fake_var_manager.h" |
6 #include "gtest/gtest.h" | 7 #include "gtest/gtest.h" |
7 | 8 |
8 FakeVarInterface::FakeVarInterface() : next_id_(1) {} | 9 FakeVarInterface::FakeVarInterface(FakeVarManager* manager) |
| 10 : manager_(manager) {} |
9 | 11 |
10 FakeVarInterface::~FakeVarInterface() { | 12 PP_Var FakeVarInterface::VarFromUtf8(const char* data, uint32_t len) { |
11 // The ref counts for all vars should be zero. | 13 FakeVarData* var_data = manager_->CreateVarData(); |
12 for (VarMap::const_iterator iter = var_map_.begin(); iter != var_map_.end(); | 14 var_data->type = PP_VARTYPE_STRING; |
13 ++iter) { | 15 var_data->string_value.assign(data, len); |
14 const FakeStringVar& string_var = iter->second; | 16 |
15 EXPECT_EQ(0, string_var.ref_count) << "Non-zero refcount on string var " | 17 struct PP_Var result = {PP_VARTYPE_STRING, 0, {PP_FALSE}}; |
16 << iter->first << " with value \"" | 18 result.value.as_id = var_data->id; |
17 << string_var.value << "\""; | 19 return result; |
18 } | |
19 } | 20 } |
20 | 21 |
21 void FakeVarInterface::AddRef(PP_Var var) { | 22 void FakeVarInterface::AddRef(PP_Var var) { |
22 // From ppb_var.h: | 23 manager_->AddRef(var); |
23 // AddRef() adds a reference to the given var. If this is not a refcounted | |
24 // object, this function will do nothing so you can always call it no matter | |
25 // what the type. | |
26 if (var.type != PP_VARTYPE_STRING) | |
27 return; | |
28 | |
29 VarMap::iterator iter = var_map_.find(var.value.as_id); | |
30 if (iter == var_map_.end()) | |
31 return; | |
32 | |
33 FakeStringVar& string_var = iter->second; | |
34 EXPECT_LT(0, string_var.ref_count) << "AddRefing freed string var " | |
35 << var.value.as_id << " with value \"" | |
36 << string_var.value << "\""; | |
37 string_var.ref_count++; | |
38 } | 24 } |
39 | 25 |
40 void FakeVarInterface::Release(PP_Var var) { | 26 void FakeVarInterface::Release(PP_Var var) { |
41 // From ppb_var.h: | 27 manager_->Release(var); |
42 // Release() removes a reference to given var, deleting it if the internal | |
43 // reference count becomes 0. If the given var is not a refcounted object, | |
44 // this function will do nothing so you can always call it no matter what | |
45 // the type. | |
46 if (var.type != PP_VARTYPE_STRING) | |
47 return; | |
48 | |
49 VarMap::iterator iter = var_map_.find(var.value.as_id); | |
50 if (iter == var_map_.end()) | |
51 return; | |
52 | |
53 FakeStringVar& string_var = iter->second; | |
54 EXPECT_LT(0, string_var.ref_count) << "Releasing freed string var " | |
55 << var.value.as_id << " with value \"" | |
56 << string_var.value << "\""; | |
57 string_var.ref_count--; | |
58 } | |
59 | |
60 PP_Var FakeVarInterface::VarFromUtf8(const char* data, uint32_t len) { | |
61 Id id = next_id_++; | |
62 | |
63 FakeStringVar string_var; | |
64 string_var.value.assign(data, len); | |
65 string_var.ref_count = 1; | |
66 | |
67 var_map_[id] = string_var; | |
68 | |
69 struct PP_Var result = {PP_VARTYPE_STRING, 0, {PP_FALSE}}; | |
70 result.value.as_id = id; | |
71 return result; | |
72 } | 28 } |
73 | 29 |
74 const char* FakeVarInterface::VarToUtf8(PP_Var var, uint32_t* out_len) { | 30 const char* FakeVarInterface::VarToUtf8(PP_Var var, uint32_t* out_len) { |
75 if (var.type != PP_VARTYPE_STRING) { | 31 if (var.type != PP_VARTYPE_STRING) { |
76 *out_len = 0; | 32 *out_len = 0; |
77 return NULL; | 33 return NULL; |
78 } | 34 } |
79 | 35 |
80 VarMap::const_iterator iter = var_map_.find(var.value.as_id); | 36 FakeVarData* var_data = manager_->GetVarData(var); |
81 if (iter == var_map_.end()) { | 37 if (!var_data) { |
82 *out_len = 0; | 38 *out_len = 0; |
83 return NULL; | 39 return NULL; |
84 } | 40 } |
85 | 41 |
86 const FakeStringVar& string_var = iter->second; | 42 EXPECT_LT(0, var_data->ref_count) << "VarToUtf8 on freed " |
87 EXPECT_LT(0, string_var.ref_count) << "VarToUtf8 on freed string var " | 43 << manager_->Describe(*var_data); |
88 << var.value.as_id << " with value \"" | |
89 << string_var.value << "\""; | |
90 | 44 |
91 *out_len = string_var.value.length(); | 45 *out_len = var_data->string_value.length(); |
92 return string_var.value.c_str(); | 46 return var_data->string_value.c_str(); |
93 } | 47 } |
OLD | NEW |