8157453: Convert DependencyContext_test to GTest
authorjwilhelm
Fri, 20 May 2016 16:45:00 +0200
changeset 42055 98554e5a088e
parent 42054 498d02c046db
child 42056 9296564b8c8b
8157453: Convert DependencyContext_test to GTest Reviewed-by: dholmes, rehn, kzhaldyb
hotspot/src/share/vm/code/dependencyContext.cpp
hotspot/src/share/vm/code/dependencyContext.hpp
hotspot/src/share/vm/utilities/internalVMTests.cpp
hotspot/test/native/code/test_dependencyContext.cpp
--- a/hotspot/src/share/vm/code/dependencyContext.cpp	Wed May 11 23:33:24 2016 +0200
+++ b/hotspot/src/share/vm/code/dependencyContext.cpp	Fri May 20 16:45:00 2016 +0200
@@ -272,79 +272,3 @@
 int nmethodBucket::decrement() {
   return Atomic::add(-1, (volatile int *)&_count);
 }
-
-/////////////// Unit tests ///////////////
-
-#ifndef PRODUCT
-
-class TestDependencyContext {
- public:
-  nmethod* _nmethods[3];
-
-  intptr_t _dependency_context;
-
-  DependencyContext dependencies() {
-    DependencyContext depContext(&_dependency_context);
-    return depContext;
-  }
-
-  TestDependencyContext() : _dependency_context(DependencyContext::EMPTY) {
-    CodeCache_lock->lock_without_safepoint_check();
-
-    _nmethods[0] = reinterpret_cast<nmethod*>(0x8 * 0);
-    _nmethods[1] = reinterpret_cast<nmethod*>(0x8 * 1);
-    _nmethods[2] = reinterpret_cast<nmethod*>(0x8 * 2);
-
-    dependencies().add_dependent_nmethod(_nmethods[2]);
-    dependencies().add_dependent_nmethod(_nmethods[1]);
-    dependencies().add_dependent_nmethod(_nmethods[0]);
-  }
-
-  ~TestDependencyContext() {
-    dependencies().wipe();
-    CodeCache_lock->unlock();
-  }
-
-  static void testRemoveDependentNmethod(int id, bool delete_immediately) {
-    TestDependencyContext c;
-    DependencyContext depContext = c.dependencies();
-    assert(!has_stale_entries(depContext), "check");
-
-    nmethod* nm = c._nmethods[id];
-    depContext.remove_dependent_nmethod(nm, delete_immediately);
-
-    if (!delete_immediately) {
-      assert(has_stale_entries(depContext), "check");
-      assert(depContext.is_dependent_nmethod(nm), "check");
-      depContext.expunge_stale_entries();
-    }
-
-    assert(!has_stale_entries(depContext), "check");
-    assert(!depContext.is_dependent_nmethod(nm), "check");
-  }
-
-  static void testRemoveDependentNmethod() {
-    testRemoveDependentNmethod(0, false);
-    testRemoveDependentNmethod(1, false);
-    testRemoveDependentNmethod(2, false);
-
-    testRemoveDependentNmethod(0, true);
-    testRemoveDependentNmethod(1, true);
-    testRemoveDependentNmethod(2, true);
-  }
-
-  static void test() {
-    testRemoveDependentNmethod();
-  }
-
-  static bool has_stale_entries(DependencyContext ctx) {
-    assert(ctx.has_stale_entries() == ctx.find_stale_entries(), "check");
-    return ctx.has_stale_entries();
-  }
-};
-
-void TestDependencyContext_test() {
-  TestDependencyContext::test();
-}
-
-#endif // PRODUCT
--- a/hotspot/src/share/vm/code/dependencyContext.hpp	Wed May 11 23:33:24 2016 +0200
+++ b/hotspot/src/share/vm/code/dependencyContext.hpp	Fri May 20 16:45:00 2016 +0200
@@ -29,6 +29,7 @@
 #include "oops/oop.hpp"
 #include "runtime/handles.hpp"
 #include "runtime/perfData.hpp"
+#include "runtime/safepoint.hpp"
 
 class nmethod;
 class DepChange;
--- a/hotspot/src/share/vm/utilities/internalVMTests.cpp	Wed May 11 23:33:24 2016 +0200
+++ b/hotspot/src/share/vm/utilities/internalVMTests.cpp	Fri May 20 16:45:00 2016 +0200
@@ -41,7 +41,6 @@
 
 void InternalVMTests::run() {
   tty->print_cr("Running internal VM tests");
-  run_unit_test(TestDependencyContext_test);
   run_unit_test(test_semaphore);
   run_unit_test(TestOS_test);
   run_unit_test(TestReservedSpace_test);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/code/test_dependencyContext.cpp	Fri May 20 16:45:00 2016 +0200
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "code/dependencyContext.hpp"
+#include "unittest.hpp"
+
+class TestDependencyContext {
+ public:
+  nmethod* _nmethods[3];
+
+  intptr_t _dependency_context;
+
+  DependencyContext dependencies() {
+    DependencyContext depContext(&_dependency_context);
+    return depContext;
+  }
+
+  TestDependencyContext() : _dependency_context(DependencyContext::EMPTY) {
+    CodeCache_lock->lock_without_safepoint_check();
+
+    _nmethods[0] = reinterpret_cast<nmethod*>(0x8 * 0);
+    _nmethods[1] = reinterpret_cast<nmethod*>(0x8 * 1);
+    _nmethods[2] = reinterpret_cast<nmethod*>(0x8 * 2);
+
+    dependencies().add_dependent_nmethod(_nmethods[2]);
+    dependencies().add_dependent_nmethod(_nmethods[1]);
+    dependencies().add_dependent_nmethod(_nmethods[0]);
+  }
+
+  ~TestDependencyContext() {
+    dependencies().wipe();
+    CodeCache_lock->unlock();
+  }
+
+  static bool has_stale_entries(DependencyContext ctx) {
+    return ctx.has_stale_entries();
+  }
+
+#ifndef PRODUCT
+  static bool find_stale_entries(DependencyContext ctx) {
+    return ctx.find_stale_entries();
+  }
+#endif
+};
+
+static void test_remove_dependent_nmethod(int id, bool delete_immediately) {
+  TestDependencyContext c;
+  DependencyContext depContext = c.dependencies();
+  NOT_PRODUCT(ASSERT_FALSE(TestDependencyContext::find_stale_entries(depContext)));
+  ASSERT_FALSE(TestDependencyContext::has_stale_entries(depContext));
+
+  nmethod* nm = c._nmethods[id];
+  depContext.remove_dependent_nmethod(nm, delete_immediately);
+
+  if (!delete_immediately) {
+    NOT_PRODUCT(ASSERT_TRUE(TestDependencyContext::find_stale_entries(depContext)));
+    ASSERT_TRUE(TestDependencyContext::has_stale_entries(depContext));
+    NOT_PRODUCT(ASSERT_TRUE(depContext.is_dependent_nmethod(nm)));
+    depContext.expunge_stale_entries();
+  }
+
+  NOT_PRODUCT(ASSERT_FALSE(TestDependencyContext::find_stale_entries(depContext)));
+  ASSERT_FALSE(TestDependencyContext::has_stale_entries(depContext));
+  NOT_PRODUCT(ASSERT_FALSE(depContext.is_dependent_nmethod(nm)));
+}
+
+TEST(code, dependency_context) {
+  test_remove_dependent_nmethod(0, false);
+  test_remove_dependent_nmethod(1, false);
+  test_remove_dependent_nmethod(2, false);
+
+  test_remove_dependent_nmethod(0, true);
+  test_remove_dependent_nmethod(1, true);
+  test_remove_dependent_nmethod(2, true);
+}