summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2012-05-21 12:43:25 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-05-21 12:43:25 -0700
commit455961ef65faa75a9b93e49f892faaa27a413d2b (patch)
tree57064d263b947e992c508b505e5a7aa2c7eea436
parentf336014c8dd20223388dc7e00875b4fd5aebdcdd (diff)
parente0607f0507fe647bd9262facfaf75146c074e933 (diff)
downloadframeworks_native-455961ef65faa75a9b93e49f892faaa27a413d2b.zip
frameworks_native-455961ef65faa75a9b93e49f892faaa27a413d2b.tar.gz
frameworks_native-455961ef65faa75a9b93e49f892faaa27a413d2b.tar.bz2
am e0607f05: am 5aed6843: Merge "fix a corruption in Vector<> when adding new items" into jb-dev
* commit 'e0607f0507fe647bd9262facfaf75146c074e933': fix a corruption in Vector<> when adding new items
-rw-r--r--libs/utils/VectorImpl.cpp2
-rw-r--r--libs/utils/tests/Android.mk1
-rw-r--r--libs/utils/tests/Vector_test.cpp75
3 files changed, 77 insertions, 1 deletions
diff --git a/libs/utils/VectorImpl.cpp b/libs/utils/VectorImpl.cpp
index 220ae3e..e78faa8 100644
--- a/libs/utils/VectorImpl.cpp
+++ b/libs/utils/VectorImpl.cpp
@@ -382,8 +382,8 @@ void* VectorImpl::_grow(size_t where, size_t amount)
}
}
} else {
+ void* array = editArrayImpl();
if (where != mCount) {
- void* array = editArrayImpl();
const void* from = reinterpret_cast<const uint8_t *>(array) + where*mItemSize;
void* to = reinterpret_cast<uint8_t *>(array) + (where+amount)*mItemSize;
_do_move_forward(to, from, mCount - where);
diff --git a/libs/utils/tests/Android.mk b/libs/utils/tests/Android.mk
index 98e4936..0a5b379 100644
--- a/libs/utils/tests/Android.mk
+++ b/libs/utils/tests/Android.mk
@@ -9,6 +9,7 @@ test_src_files := \
Looper_test.cpp \
String8_test.cpp \
Unicode_test.cpp \
+ Vector_test.cpp \
ZipFileRO_test.cpp
shared_libraries := \
diff --git a/libs/utils/tests/Vector_test.cpp b/libs/utils/tests/Vector_test.cpp
new file mode 100644
index 0000000..d29c054
--- /dev/null
+++ b/libs/utils/tests/Vector_test.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "Vector_test"
+
+#include <utils/Vector.h>
+#include <cutils/log.h>
+#include <gtest/gtest.h>
+#include <unistd.h>
+
+namespace android {
+
+class VectorTest : public testing::Test {
+protected:
+ virtual void SetUp() {
+ }
+
+ virtual void TearDown() {
+ }
+
+public:
+};
+
+
+TEST_F(VectorTest, CopyOnWrite_CopyAndAddElements) {
+
+ Vector<int> vector;
+ Vector<int> other;
+ vector.setCapacity(8);
+
+ vector.add(1);
+ vector.add(2);
+ vector.add(3);
+
+ EXPECT_EQ(vector.size(), 3);
+
+ // copy the vector
+ other = vector;
+
+ EXPECT_EQ(other.size(), 3);
+
+ // add an element to the first vector
+ vector.add(4);
+
+ // make sure the sizes are correct
+ EXPECT_EQ(vector.size(), 4);
+ EXPECT_EQ(other.size(), 3);
+
+ // add an element to the copy
+ other.add(5);
+
+ // make sure the sizes are correct
+ EXPECT_EQ(vector.size(), 4);
+ EXPECT_EQ(other.size(), 4);
+
+ // make sure the content of both vectors are correct
+ EXPECT_EQ(vector[3], 4);
+ EXPECT_EQ(other[3], 5);
+}
+
+
+} // namespace android