Make the RuntimeTest use Runtime instances instead of its constituents.

Change-Id: I1005f279259917ff07d24e3bcd3643992ec8e3bd
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index 2025b71..41fa5b1 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -11,11 +11,11 @@
 class ClassLinkerTest : public RuntimeTest {
  protected:
   void AssertNonExistantClass(const StringPiece& descriptor) {
-    EXPECT_TRUE(class_linker_.get()->FindSystemClass(descriptor) == NULL);
+    EXPECT_TRUE(class_linker_->FindSystemClass(descriptor) == NULL);
   }
 
   void AssertPrimitiveClass(const StringPiece& descriptor) {
-    Class* primitive = class_linker_.get()->FindSystemClass(descriptor);
+    Class* primitive = class_linker_->FindSystemClass(descriptor);
     ASSERT_TRUE(primitive != NULL);
     ASSERT_TRUE(primitive->GetClass() != NULL);
     ASSERT_EQ(primitive->GetClass(), primitive->GetClass()->GetClass());
@@ -44,14 +44,14 @@
   void AssertArrayClass(const StringPiece& array_descriptor,
                         int32_t array_rank,
                         const StringPiece& component_type) {
-    Class* array = class_linker_.get()->FindSystemClass(array_descriptor);
+    Class* array = class_linker_->FindSystemClass(array_descriptor);
     ASSERT_TRUE(array != NULL);
     ASSERT_TRUE(array->GetClass() != NULL);
     ASSERT_EQ(array->GetClass(), array->GetClass()->GetClass());
     EXPECT_TRUE(array->GetClass()->GetSuperClass() != NULL);
     ASSERT_EQ(array_descriptor, array->GetDescriptor());
     EXPECT_TRUE(array->GetSuperClass() != NULL);
-    EXPECT_EQ(class_linker_.get()->FindSystemClass("Ljava/lang/Object;"), array->GetSuperClass());
+    EXPECT_EQ(class_linker_->FindSystemClass("Ljava/lang/Object;"), array->GetSuperClass());
     EXPECT_TRUE(array->HasSuperClass());
     ASSERT_TRUE(array->GetComponentType() != NULL);
     ASSERT_TRUE(array->GetComponentType()->GetDescriptor() != NULL);
@@ -75,29 +75,29 @@
 };
 
 TEST_F(ClassLinkerTest, FindClassNonexistent) {
-  Class* result1 = class_linker_.get()->FindSystemClass("NoSuchClass;");
+  Class* result1 = class_linker_->FindSystemClass("NoSuchClass;");
   EXPECT_TRUE(result1 == NULL);
-  Class* result2 = class_linker_.get()->FindSystemClass("LNoSuchClass;");
+  Class* result2 = class_linker_->FindSystemClass("LNoSuchClass;");
   EXPECT_TRUE(result2 == NULL);
 }
 
 TEST_F(ClassLinkerTest, FindClassNested) {
   scoped_ptr<DexFile> nested_dex(OpenDexFileBase64(kNestedDex));
-  class_linker_.get()->RegisterDexFile(nested_dex.get());
+  class_linker_->RegisterDexFile(nested_dex.get());
 
-  Class* outer = class_linker_.get()->FindClass("LNested;", NULL, nested_dex.get());
+  Class* outer = class_linker_->FindClass("LNested;", NULL, nested_dex.get());
   ASSERT_TRUE(outer != NULL);
   EXPECT_EQ(0U, outer->NumVirtualMethods());
   EXPECT_EQ(1U, outer->NumDirectMethods());
 
-  Class* inner = class_linker_.get()->FindClass("LNested$Inner;", NULL, nested_dex.get());
+  Class* inner = class_linker_->FindClass("LNested$Inner;", NULL, nested_dex.get());
   ASSERT_TRUE(inner != NULL);
   EXPECT_EQ(0U, inner->NumVirtualMethods());
   EXPECT_EQ(1U, inner->NumDirectMethods());
 }
 
 TEST_F(ClassLinkerTest, FindClass) {
-  ClassLinker* linker = class_linker_.get();
+  ClassLinker* linker = class_linker_;
 
   StringPiece expected = "BCDFIJSZV";
   for (int ch = 0; ch < 255; ch++) {
@@ -176,7 +176,7 @@
 }
 
 TEST_F(ClassLinkerTest, ProtoCompare) {
-  ClassLinker* linker = class_linker_.get();
+  ClassLinker* linker = class_linker_;
 
   scoped_ptr<DexFile> proto_dex_file(OpenDexFileBase64(kProtoCompareDex));
   linker->RegisterDexFile(proto_dex_file.get());
@@ -230,7 +230,7 @@
 }
 
 TEST_F(ClassLinkerTest, ProtoCompare2) {
-  ClassLinker* linker = class_linker_.get();
+  ClassLinker* linker = class_linker_;
 
   scoped_ptr<DexFile> proto1_dex_file(OpenDexFileBase64(kProtoCompareDex));
   linker->RegisterDexFile(proto1_dex_file.get());
diff --git a/src/common_test.h b/src/common_test.h
index e7b4f30..237939b 100644
--- a/src/common_test.h
+++ b/src/common_test.h
@@ -173,25 +173,19 @@
 class RuntimeTest : public testing::Test {
  protected:
   virtual void SetUp() {
-    ASSERT_TRUE(Thread::Init());
-    ASSERT_TRUE(Thread::Attach() != NULL);
-    ASSERT_TRUE(Heap::Init());
-
     java_lang_dex_file_.reset(OpenDexFileBase64(kJavaLangDex));
 
     std::vector<DexFile*> boot_class_path;
     boot_class_path.push_back(java_lang_dex_file_.get());
 
-    class_linker_.reset(ClassLinker::Create(boot_class_path));
-    CHECK(class_linker_ != NULL);
-  }
-
-  virtual void TearDown() {
-    Heap::Destroy();
+    runtime_.reset(Runtime::Create(boot_class_path));
+    ASSERT_TRUE(runtime_ != NULL);
+    class_linker_ = runtime_->GetClassLinker();
   }
 
   scoped_ptr<DexFile> java_lang_dex_file_;
-  scoped_ptr<ClassLinker> class_linker_;
+  scoped_ptr<Runtime> runtime_;
+  ClassLinker* class_linker_;
 };
 
 }  // namespace art
diff --git a/src/jni_compiler_test.cc b/src/jni_compiler_test.cc
index 4d5e7da..225ca5c 100644
--- a/src/jni_compiler_test.cc
+++ b/src/jni_compiler_test.cc
@@ -18,11 +18,6 @@
  protected:
   virtual void SetUp() {
     RuntimeTest::SetUp();
-    // Create runtime and attach thread
-    std::vector<DexFile*> boot_class_path;
-    boot_class_path.push_back(java_lang_dex_file_.get());
-    runtime_ = Runtime::Create(boot_class_path);
-    CHECK(runtime_->AttachCurrentThread());
     // Create thunk code that performs the native to managed transition
     thunk_code_size_ = 4096;
     thunk_ = mmap(NULL, thunk_code_size_, PROT_READ | PROT_WRITE | PROT_EXEC,
@@ -97,7 +92,6 @@
     return result;
   }
 
-  Runtime* runtime_;
   void* thunk_;
   size_t thunk_code_size_;
   jint (*thunk_entry1_)(const void*, Method*, jobject, jint, jint, jint);
@@ -185,8 +179,8 @@
 
 TEST_F(JniCompilerTest, CompileAndRunNoArgMethod) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindVirtualMethod("foo");
 
   Assembler jni_asm;
@@ -210,8 +204,8 @@
 
 TEST_F(JniCompilerTest, CompileAndRunIntMethod) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindVirtualMethod("fooI");
 
   Assembler jni_asm;
@@ -237,8 +231,8 @@
 
 TEST_F(JniCompilerTest, CompileAndRunIntIntMethod) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindVirtualMethod("fooII");
 
   Assembler jni_asm;
@@ -267,8 +261,8 @@
 
 TEST_F(JniCompilerTest, CompileAndRunDoubleDoubleMethod) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindVirtualMethod("fooDD");
 
   Assembler jni_asm;
@@ -296,8 +290,8 @@
 
 TEST_F(JniCompilerTest, CompileAndRunIntObjectObjectMethod) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindVirtualMethod("fooIOO");
 
   Assembler jni_asm;
@@ -351,8 +345,8 @@
 
 TEST_F(JniCompilerTest, CompileAndRunStaticIntObjectObjectMethod) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindDirectMethod("fooSIOO");
 
   Assembler jni_asm;
@@ -403,8 +397,8 @@
 
 TEST_F(JniCompilerTest, CompileAndRunStaticSynchronizedIntObjectObjectMethod) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindDirectMethod("fooSSIOO");
 
   Assembler jni_asm;
@@ -461,8 +455,8 @@
 }
 TEST_F(JniCompilerTest, SuspendCountAcknolewdgement) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindVirtualMethod("fooI");
 
   Assembler jni_asm;
@@ -502,8 +496,8 @@
 }
 TEST_F(JniCompilerTest, ExceptionHandling) {
   scoped_ptr<DexFile> dex(OpenDexFileBase64(kMyClassNativesDex));
-  class_linker_.get()->RegisterDexFile(dex.get());
-  Class* klass = class_linker_.get()->FindClass("LMyClass;", NULL, dex.get());
+  class_linker_->RegisterDexFile(dex.get());
+  Class* klass = class_linker_->FindClass("LMyClass;", NULL, dex.get());
   Method* method = klass->FindVirtualMethod("foo");
 
   Assembler jni_asm;
diff --git a/src/runtime.h b/src/runtime.h
index da773a3..b57f1cf 100644
--- a/src/runtime.h
+++ b/src/runtime.h
@@ -39,6 +39,10 @@
 
   ~Runtime();
 
+  ClassLinker* GetClassLinker() {
+    return class_linker_;
+  }
+
  private:
   static void PlatformAbort(const char*, int);
 
diff --git a/src/thread.cc b/src/thread.cc
index 56eeb7f..c2483c0 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -156,7 +156,10 @@
   // Make sure that all threads have exited and unregistered when we
   // reach this point. This means that all daemon threads had been
   // shutdown cleanly.
-  CHECK_EQ(list_.size(), 0U);
+  CHECK_EQ(list_.size(), 1U);
+  // TODO: wait for all other threads to unregister
+  CHECK_EQ(list_.front(), Thread::Current());
+  // TODO: detach the current thread
   delete lock_;
   lock_ = NULL;
 }