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..9bc907cbe323079efdbe302d2ab0baa3f80c8f8c |
--- /dev/null |
+++ b/native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc |
@@ -0,0 +1,125 @@ |
+// 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 with id " << var_data.id << |
+ " with value \"" << var_data.string_value << "\""; |
+ break; |
+ case PP_VARTYPE_ARRAY: |
+ rtn << "Array of size " << var_data.array_value.size() |
+ << " with id " << var_data.id; |
+ break; |
+ case PP_VARTYPE_ARRAY_BUFFER: |
+ rtn << "ArrayBuffer of size " << var_data.buffer_value.length |
+ << " with id " << var_data.id; |
+ break; |
+ default: |
+ rtn << "resource of type " << var_data.type |
+ << " with id " << var_data.id; |
+ break; |
+ } |
+ return rtn.str(); |
+} |
+ |
+void FakeVarManager::DestroyVarData(FakeVarData* var_data) { |
+ // Release each PP_Var in the array |
+ |
+ switch (var_data->type) { |
+ case PP_VARTYPE_ARRAY: { |
+ std::vector<PP_Var>& vector = var_data->array_value; |
+ for (std::vector<PP_Var>::iterator it = vector.begin(); |
+ it != vector.end(); ++it) { |
+ Release(*it); |
+ } |
+ vector.clear(); |
+ break; |
+ } |
+ case PP_VARTYPE_ARRAY_BUFFER: |
+ free(var_data->buffer_value.ptr); |
+ var_data->buffer_value.ptr = NULL; |
+ var_data->buffer_value.length = 0; |
+ 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) |
+ DestroyVarData(var_data); |
+} |