summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jni/node-inl.h7
-rw-r--r--jni/node_test.cpp36
2 files changed, 39 insertions, 4 deletions
diff --git a/jni/node-inl.h b/jni/node-inl.h
index 7986e99f7..5db14134e 100644
--- a/jni/node-inl.h
+++ b/jni/node-inl.h
@@ -143,12 +143,13 @@ class node {
}
void Rename(const std::string& name, node* new_parent) {
- CHECK(new_parent != parent_);
std::lock_guard<std::recursive_mutex> guard(*lock_);
name_ = name;
- RemoveFromParent();
- AddToParent(new_parent);
+ if (new_parent != parent_) {
+ RemoveFromParent();
+ AddToParent(new_parent);
+ }
}
const std::string& GetName() const {
diff --git a/jni/node_test.cpp b/jni/node_test.cpp
index d7e9ac061..1c7103c8f 100644
--- a/jni/node_test.cpp
+++ b/jni/node_test.cpp
@@ -74,7 +74,41 @@ TEST_F(NodeTest, TestRelease) {
ASSERT_TRUE(node->Release(2));
}
-TEST_F(NodeTest, TestRename) {
+TEST_F(NodeTest, TestRenameWithName) {
+ unique_node_ptr parent = CreateNode(nullptr, "/path");
+
+ unique_node_ptr child = CreateNode(parent.get(), "subdir");
+ ASSERT_EQ(2, GetRefCount(parent.get()));
+ ASSERT_EQ(child.get(), parent->LookupChildByName("subdir"));
+
+ child->Rename("subdir_new", parent.get());
+
+ ASSERT_EQ(2, GetRefCount(parent.get()));
+ ASSERT_EQ(nullptr, parent->LookupChildByName("subdir"));
+ ASSERT_EQ(child.get(), parent->LookupChildByName("subdir_new"));
+
+ ASSERT_EQ("/path/subdir_new", child->BuildPath());
+}
+
+TEST_F(NodeTest, TestRenameWithParent) {
+ unique_node_ptr parent1 = CreateNode(nullptr, "/path1");
+ unique_node_ptr parent2 = CreateNode(nullptr, "/path2");
+
+ unique_node_ptr child = CreateNode(parent1.get(), "subdir");
+ ASSERT_EQ(2, GetRefCount(parent1.get()));
+ ASSERT_EQ(child.get(), parent1->LookupChildByName("subdir"));
+
+ child->Rename("subdir", parent2.get());
+ ASSERT_EQ(1, GetRefCount(parent1.get()));
+ ASSERT_EQ(nullptr, parent1->LookupChildByName("subdir"));
+
+ ASSERT_EQ(2, GetRefCount(parent2.get()));
+ ASSERT_EQ(child.get(), parent2->LookupChildByName("subdir"));
+
+ ASSERT_EQ("/path2/subdir", child->BuildPath());
+}
+
+TEST_F(NodeTest, TestRenameWithNameAndParent) {
unique_node_ptr parent1 = CreateNode(nullptr, "/path1");
unique_node_ptr parent2 = CreateNode(nullptr, "/path2");