summaryrefslogtreecommitdiffstats
path: root/runtime/class_loader_context_test.cc
diff options
context:
space:
mode:
authorAndreas Gampe <agampe@google.com>2017-09-02 16:53:03 -0700
committerAndreas Gampe <agampe@google.com>2017-09-04 14:23:40 -0700
commit7252738e5c8aa439e2c98e4b887c5eab20cd38c5 (patch)
treedcc9bd905ca2035a91c9ede198f88cc48d9be169 /runtime/class_loader_context_test.cc
parent788b8b27bc3e70ca210537c34d691c8d1fd5aea4 (diff)
downloadart-7252738e5c8aa439e2c98e4b887c5eab20cd38c5.tar.gz
art-7252738e5c8aa439e2c98e4b887c5eab20cd38c5.tar.bz2
art-7252738e5c8aa439e2c98e4b887c5eab20cd38c5.zip
ART: Don't prepend '/' if classpath_dir is empty
When no classpath_dir is given, do not prepend '/' to a relative dex location. Add tests. Bug: 65318303 Test: m test-art-host-gtest-class_loader_context_test Test: m test-art-host Change-Id: Ib374815ce3fa9d67694f3a23037cd3b8eea35173
Diffstat (limited to 'runtime/class_loader_context_test.cc')
-rw-r--r--runtime/class_loader_context_test.cc110
1 files changed, 107 insertions, 3 deletions
diff --git a/runtime/class_loader_context_test.cc b/runtime/class_loader_context_test.cc
index 458f9f3345..930160f2b4 100644
--- a/runtime/class_loader_context_test.cc
+++ b/runtime/class_loader_context_test.cc
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+#include "class_loader_context.h"
+
#include <gtest/gtest.h>
#include <stdlib.h>
+#include "android-base/strings.h"
#include "base/dchecked_vector.h"
#include "base/stl_util.h"
@@ -72,10 +75,21 @@ class ClassLoaderContextTest : public CommonRuntimeTest {
context, index, ClassLoaderContext::kDelegateLastClassLoader, test_name);
}
+ enum class LocationCheck {
+ kEquals,
+ kEndsWith
+ };
+ enum class BaseLocationCheck {
+ kEquals,
+ kEndsWith
+ };
+
void VerifyOpenDexFiles(
ClassLoaderContext* context,
size_t index,
- std::vector<std::vector<std::unique_ptr<const DexFile>>*>& all_dex_files) {
+ std::vector<std::vector<std::unique_ptr<const DexFile>>*>& all_dex_files,
+ LocationCheck mode = LocationCheck::kEquals,
+ BaseLocationCheck base_mode = BaseLocationCheck::kEquals) {
ASSERT_TRUE(context != nullptr);
ASSERT_TRUE(context->dex_files_open_attempted_);
ASSERT_TRUE(context->dex_files_open_result_);
@@ -98,7 +112,16 @@ class ClassLoaderContextTest : public CommonRuntimeTest {
expected_location.assign(expected_real_location.get());
expected_location += DexFile::GetMultiDexSuffix(expected_dex_file->GetLocation());
- ASSERT_EQ(expected_location, opened_dex_file->GetLocation());
+ switch (mode) {
+ case LocationCheck::kEquals:
+ ASSERT_EQ(expected_dex_file->GetLocation(), opened_dex_file->GetLocation());
+ break;
+ case LocationCheck::kEndsWith:
+ ASSERT_TRUE(android::base::EndsWith(expected_dex_file->GetLocation(),
+ opened_dex_file->GetLocation().c_str()))
+ << opened_dex_file->GetLocation() << " vs " << expected_dex_file->GetLocation();
+ break;
+ }
ASSERT_EQ(expected_dex_file->GetLocationChecksum(), opened_dex_file->GetLocationChecksum());
std::string class_path_location = info.classpath[k];
@@ -106,7 +129,17 @@ class ClassLoaderContextTest : public CommonRuntimeTest {
realpath(class_path_location.c_str(), nullptr));
ASSERT_TRUE(class_path_location_real != nullptr);
class_path_location.assign(class_path_location_real.get());
- ASSERT_EQ(class_path_location, opened_dex_file->GetBaseLocation());
+ switch (base_mode) {
+ case BaseLocationCheck::kEquals:
+ ASSERT_EQ(class_path_location, opened_dex_file->GetBaseLocation());
+ break;
+
+ case BaseLocationCheck::kEndsWith:
+ ASSERT_TRUE(android::base::EndsWith(opened_dex_file->GetBaseLocation(),
+ class_path_location.c_str()))
+ << info.classpath[k] << " vs " << opened_dex_file->GetBaseLocation();
+ break;
+ }
}
}
}
@@ -304,6 +337,77 @@ TEST_F(ClassLoaderContextTest, OpenValidDexFilesSymLink) {
VerifyOpenDexFiles(context.get(), 0, all_dex_files0);
}
+static std::string CreateRelativeString(const std::string& in, const char* cwd) {
+ if (!android::base::StartsWith(in, cwd)) {
+ LOG(FATAL) << in << " " << cwd;
+ }
+ return in.substr(strlen(cwd) + 1);
+}
+
+TEST_F(ClassLoaderContextTest, OpenValidDexFilesRelative) {
+ char cwd_buf[4096];
+ if (getcwd(cwd_buf, arraysize(cwd_buf)) == nullptr) {
+ PLOG(FATAL) << "Could not get working directory";
+ }
+ std::string multidex_name = CreateRelativeString(GetTestDexFileName("MultiDex"), cwd_buf);
+ std::vector<std::unique_ptr<const DexFile>> multidex_files = OpenTestDexFiles("MultiDex");
+ std::string myclass_dex_name = CreateRelativeString(GetTestDexFileName("MyClass"), cwd_buf);
+ std::vector<std::unique_ptr<const DexFile>> myclass_dex_files = OpenTestDexFiles("MyClass");
+ std::string dex_name = CreateRelativeString(GetTestDexFileName("Main"), cwd_buf);
+ std::vector<std::unique_ptr<const DexFile>> dex_files = OpenTestDexFiles("Main");
+
+
+ std::unique_ptr<ClassLoaderContext> context =
+ ClassLoaderContext::Create(
+ "PCL[" + multidex_name + ":" + myclass_dex_name + "];" +
+ "DLC[" + dex_name + "]");
+
+ ASSERT_TRUE(context->OpenDexFiles(InstructionSet::kArm, /*classpath_dir*/ ""));
+
+ VerifyContextSize(context.get(), 2);
+ std::vector<std::vector<std::unique_ptr<const DexFile>>*> all_dex_files0;
+ all_dex_files0.push_back(&multidex_files);
+ all_dex_files0.push_back(&myclass_dex_files);
+ std::vector<std::vector<std::unique_ptr<const DexFile>>*> all_dex_files1;
+ all_dex_files1.push_back(&dex_files);
+
+ VerifyOpenDexFiles(context.get(), 0, all_dex_files0, LocationCheck::kEndsWith);
+ VerifyOpenDexFiles(context.get(), 1, all_dex_files1, LocationCheck::kEndsWith);
+}
+
+TEST_F(ClassLoaderContextTest, OpenValidDexFilesClasspathDir) {
+ char cwd_buf[4096];
+ if (getcwd(cwd_buf, arraysize(cwd_buf)) == nullptr) {
+ PLOG(FATAL) << "Could not get working directory";
+ }
+ std::string multidex_name = CreateRelativeString(GetTestDexFileName("MultiDex"), cwd_buf);
+ std::vector<std::unique_ptr<const DexFile>> multidex_files = OpenTestDexFiles("MultiDex");
+ std::string myclass_dex_name = CreateRelativeString(GetTestDexFileName("MyClass"), cwd_buf);
+ std::vector<std::unique_ptr<const DexFile>> myclass_dex_files = OpenTestDexFiles("MyClass");
+ std::string dex_name = CreateRelativeString(GetTestDexFileName("Main"), cwd_buf);
+ std::vector<std::unique_ptr<const DexFile>> dex_files = OpenTestDexFiles("Main");
+
+
+ std::unique_ptr<ClassLoaderContext> context =
+ ClassLoaderContext::Create(
+ "PCL[" + multidex_name + ":" + myclass_dex_name + "];" +
+ "DLC[" + dex_name + "]");
+
+ ASSERT_TRUE(context->OpenDexFiles(InstructionSet::kArm, cwd_buf));
+
+ VerifyContextSize(context.get(), 2);
+ std::vector<std::vector<std::unique_ptr<const DexFile>>*> all_dex_files0;
+ all_dex_files0.push_back(&multidex_files);
+ all_dex_files0.push_back(&myclass_dex_files);
+ std::vector<std::vector<std::unique_ptr<const DexFile>>*> all_dex_files1;
+ all_dex_files1.push_back(&dex_files);
+
+ VerifyOpenDexFiles(
+ context.get(), 0, all_dex_files0, LocationCheck::kEquals, BaseLocationCheck::kEndsWith);
+ VerifyOpenDexFiles(
+ context.get(), 1, all_dex_files1, LocationCheck::kEquals, BaseLocationCheck::kEndsWith);
+}
+
TEST_F(ClassLoaderContextTest, OpenInvalidDexFilesMix) {
std::string dex_name = GetTestDexFileName("Main");
std::unique_ptr<ClassLoaderContext> context =