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

Unified Diff: native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc

Issue 137853023: [NaCl SDK] nacl_io: Add new fakes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 months 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 side-by-side diff with in-line comments
Download patch
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?
+}

Powered by Google App Engine
This is Rietveld 408576698