Index: native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc |
diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc b/native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..45b54ba6ff0d9a47ffb3b650955645866393e447 |
--- /dev/null |
+++ b/native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc |
@@ -0,0 +1,114 @@ |
+// Copyright (c) 2014 The Chromium 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 "fake_var_manager.h" |
+ |
+#include "gtest/gtest.h" |
+ |
+FakeVarManager::FakeVarManager() : debug(false), next_id_(1) {} |
+ |
+FakeVarManager::~FakeVarManager() { |
+ // The ref counts for all vars should be zero. |
+ for (VarMap::const_iterator iter = var_map_.begin(); iter != var_map_.end(); |
+ ++iter) { |
+ const FakeVarData& var_data = iter->second; |
+ EXPECT_EQ(0, var_data.ref_count) << "Non-zero refcount on " |
+ << Describe(var_data); |
+ } |
+} |
+ |
+FakeVarData* FakeVarManager::CreateVarData() { |
+ Id id = next_id_++; |
+ FakeVarData data; |
+ data.id = id; |
+ data.ref_count = 1; |
+ var_map_[id] = data; |
+ return &var_map_[id]; |
+} |
+ |
+void FakeVarManager::AddRef(PP_Var var) { |
+ // From ppb_var.h: |
+ // AddRef() adds a reference to the given var. If this is not a refcounted |
+ // object, this function will do nothing so you can always call it no matter |
+ // what the type. |
+ |
+ FakeVarData* var_data = GetVarData(var); |
+ if (!var_data) |
+ return; |
+ |
+ EXPECT_GT(var_data->ref_count, 0) |
+ << "AddRefing freed " << Describe(*var_data); |
+ var_data->ref_count++; |
+ if (debug) |
+ printf("AddRef of %s [new refcount=%d]\n", |
+ Describe(*var_data).c_str(), |
+ var_data->ref_count); |
+} |
+ |
+std::string FakeVarManager::Describe(const FakeVarData& var_data) { |
+ std::stringstream rtn; |
+ switch (var_data.type) { |
+ case PP_VARTYPE_STRING: |
+ rtn << "string resource " << var_data.id << |
+ " with value \"" << var_data.string_value << "\""; |
+ break; |
+ case PP_VARTYPE_ARRAY: |
+ rtn << "array resource with id " << var_data.id; |
+ break; |
+ default: |
binji
2014/01/17 01:31:14
array buffer?
Sam Clegg
2014/01/17 22:40:11
Done.
|
+ rtn << "resource " << var_data.id << " of type " << var_data.type; |
+ break; |
+ } |
+ return rtn.str(); |
+} |
+ |
+void FakeVarManager::Destroy(PP_Var var) { |
+ // Release each PP_Var in the array |
+ switch (var.type) { |
+ case PP_VARTYPE_ARRAY: { |
+ std::vector<PP_Var>& vector = GetVarData(var)->array_value; |
binji
2014/01/17 01:31:14
NULL check?
|
+ for (std::vector<PP_Var>::iterator it = vector.begin(); |
+ it != vector.end(); ++it) { |
+ Release(*it); |
+ } |
+ vector.clear(); |
+ break; |
+ } |
+ default: |
+ break; |
+ } |
+} |
+ |
+FakeVarData* FakeVarManager::GetVarData(PP_Var var) { |
+ VarMap::iterator iter = var_map_.find(var.value.as_id); |
+ if (iter == var_map_.end()) |
+ return NULL; |
+ return &iter->second; |
+} |
+ |
+void FakeVarManager::Release(PP_Var var) { |
+ // From ppb_var.h: |
+ // Release() removes a reference to given var, deleting it if the internal |
+ // reference count becomes 0. If the given var is not a refcounted object, |
+ // this function will do nothing so you can always call it no matter what |
+ // the type. |
+ FakeVarData* var_data = GetVarData(var); |
+ if (!var_data) { |
+ if (debug) |
+ printf("Releasing simple var\n"); |
+ return; |
+ } |
+ |
+ EXPECT_GT(var_data->ref_count, 0) |
+ << "Releasing freed " << Describe(*var_data); |
+ |
+ var_data->ref_count--; |
+ if (debug) |
+ printf("Released %s [new refcount=%d]\n", |
+ Describe(*var_data).c_str(), |
+ var_data->ref_count); |
+ |
+ if (var_data->ref_count == 0) |
+ Destroy(var); |
binji
2014/01/17 01:31:14
erase item in var_map_
Sam Clegg
2014/01/17 22:40:11
I was thinking of leaving the var_map alone until
binji
2014/01/17 22:59:17
OK, sounds good. Maybe add a comment for that?
|
+} |