| 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 |