This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch merge-hibernate6
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 5f74b4b823abb4054f5dd603dcb8287ebee9dda2
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Fri Sep 26 21:33:49 2025 -0500

    Making OptimisticLockingSpec scenario specific
---
 ...oovy => Hibernate5OptimisticLockingSpec.groovy} |   2 +-
 ...oovy => Hibernate6OptimisticLockingSpec.groovy} |   5 +-
 .../testing/tck/tests/OptimisticLockingSpec.groovy | 122 ++++++++++++---------
 3 files changed, 73 insertions(+), 56 deletions(-)

diff --git 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/OptimisticLockingSpec.groovy
 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/Hibernate5OptimisticLockingSpec.groovy
similarity index 97%
rename from 
grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/OptimisticLockingSpec.groovy
rename to 
grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/Hibernate5OptimisticLockingSpec.groovy
index dee2c8e0e3..004921669b 100644
--- 
a/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/OptimisticLockingSpec.groovy
+++ 
b/grails-data-hibernate5/core/src/test/groovy/grails/gorm/specs/Hibernate5OptimisticLockingSpec.groovy
@@ -27,7 +27,7 @@ import 
org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureExcep
 /**
  * @author Burt Beckwith
  */
-class OptimisticLockingSpec extends 
GrailsDataTckSpec<GrailsDataHibernate5TckManager> {
+class Hibernate5OptimisticLockingSpec extends 
GrailsDataTckSpec<GrailsDataHibernate5TckManager> {
 
     void "Test optimistic locking"() {
 
diff --git 
a/grails-data-hibernate6/core/src/test/groovy/grails/gorm/specs/OptimisticLockingSpec.groovy
 
b/grails-data-hibernate6/core/src/test/groovy/grails/gorm/specs/Hibernate6OptimisticLockingSpec.groovy
similarity index 94%
rename from 
grails-data-hibernate6/core/src/test/groovy/grails/gorm/specs/OptimisticLockingSpec.groovy
rename to 
grails-data-hibernate6/core/src/test/groovy/grails/gorm/specs/Hibernate6OptimisticLockingSpec.groovy
index d970d0726c..21667042da 100644
--- 
a/grails-data-hibernate6/core/src/test/groovy/grails/gorm/specs/OptimisticLockingSpec.groovy
+++ 
b/grails-data-hibernate6/core/src/test/groovy/grails/gorm/specs/Hibernate6OptimisticLockingSpec.groovy
@@ -20,14 +20,13 @@ package grails.gorm.specs
 
 import org.apache.grails.data.testing.tck.domains.OptLockNotVersioned
 import org.apache.grails.data.testing.tck.domains.OptLockVersioned
-import org.apache.grails.data.hibernate6.core.GrailsDataHibernate6TckManager
-import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec
+
 import 
org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException
 
 /**
  * @author Burt Beckwith
  */
-class OptimisticLockingSpec extends HibernateGormDatastoreSpec {
+class Hibernate6OptimisticLockingSpec extends HibernateGormDatastoreSpec {
 
     def setupSpec() {
         manager.addAllDomainClasses([OptLockVersioned, OptLockNotVersioned])
diff --git 
a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OptimisticLockingSpec.groovy
 
b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OptimisticLockingSpec.groovy
index 6178586166..f078a9fd91 100644
--- 
a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OptimisticLockingSpec.groovy
+++ 
b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OptimisticLockingSpec.groovy
@@ -25,22 +25,33 @@ import 
org.apache.grails.data.testing.tck.domains.OptLockNotVersioned
 import org.apache.grails.data.testing.tck.domains.OptLockVersioned
 import org.grails.datastore.mapping.core.OptimisticLockingException
 
+
 /**
  * @author Burt Beckwith
  */
+@IgnoreIf({
+    try {
+        // This class is specific to the Spring/Hibernate 5 integration. If 
it's on the classpath,
+        // it means we are running against a Hibernate datastore, which has 
its own specific
+        // optimistic locking tests. This generic TCK test should be skipped.
+        
Class.forName('org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException',
 false, Thread.currentThread().contextClassLoader)
+        return true
+    } catch (ClassNotFoundException | LinkageError ignored) {
+        return false
+    }
+})
 class OptimisticLockingSpec extends GrailsDataTckSpec {
 
-    void setupSpec() {
+    def setupSpec() {
         manager.addAllDomainClasses([OptLockVersioned, OptLockNotVersioned])
     }
 
     void "Test versioning"() {
-
         given:
         def o = new OptLockVersioned(name: 'locked')
 
         when:
-        o.save(flush: true)
+        o.save flush: true
 
         then:
         o.version == 0
@@ -49,7 +60,7 @@ class OptimisticLockingSpec extends GrailsDataTckSpec {
         manager.session.clear()
         o = OptLockVersioned.get(o.id)
         o.name = 'Fred'
-        o.save(flush: true)
+        o.save flush: true
 
         then:
         o.version == 1
@@ -63,76 +74,83 @@ class OptimisticLockingSpec extends GrailsDataTckSpec {
         o.version == 1
     }
 
-    // hibernate has a customized version of this
-    @IgnoreIf({ System.getProperty('hibernate5.gorm.suite') })
     void "Test optimistic locking"() {
 
         given:
         def o = new OptLockVersioned(name: 'locked').save(flush: true)
         manager.session.clear()
+        manager.transactionManager.commit manager.transactionStatus
+        manager.transactionStatus = null
 
         when:
-        o = OptLockVersioned.get(o.id)
-
-        Thread.start {
-            OptLockVersioned.withNewSession { s ->
-                def reloaded = OptLockVersioned.get(o.id)
-                assert reloaded
-                reloaded.name += ' in new session'
-                reloaded.save(flush: true)
+        OptLockVersioned.withTransaction {
+            try {
+                o = OptLockVersioned.get(o.id)
+
+                Thread.start {
+                    OptLockVersioned.withTransaction { s ->
+                        def reloaded = OptLockVersioned.get(o.id)
+                        assert reloaded
+                        assert reloaded != o
+                        reloaded.name += ' in new session'
+                        reloaded.save(flush: true)
+                        assert reloaded.version == 1
+                        assert o.version == 0
+                    }
+
+                }.join()
+
+                o.name += ' in main session'
+                o.save(flush: true)
+
+                manager.session.clear()
+                o = OptLockVersioned.get(o.id)
+            } catch (Throwable e) {
+                System.getProperties().each { key, value ->
+                    println "${key}: ${value}"
+                }
+                throw e
             }
-        }.join()
-        sleep(2000) // heisenbug
-
-        o.name += ' in main session'
-        def ex
-        try {
-            o.save(flush: true)
-        }
-        catch (e) {
-            ex = e
-            e.printStackTrace()
         }
-
-        manager.session.clear()
-        o = OptLockVersioned.get(o.id)
-
         then:
-        ex instanceof OptimisticLockingException
-        o.version == 1
-        o.name == 'locked in new session'
+        thrown OptimisticLockingException
     }
 
     void "Test optimistic locking disabled with 'version false'"() {
-
         given:
         def o = new OptLockNotVersioned(name: 'locked').save(flush: true)
         manager.session.clear()
+        manager.transactionManager.commit manager.transactionStatus
+        manager.transactionStatus = null
 
         when:
-        o = OptLockNotVersioned.get(o.id)
+        def ex
+        OptLockNotVersioned.withTransaction {
+            o = OptLockNotVersioned.get(o.id)
+
+            Thread.start {
+                OptLockNotVersioned.withTransaction { s ->
+                    def reloaded = OptLockNotVersioned.get(o.id)
+                    reloaded.name += ' in new session'
+                    reloaded.save(flush: true)
+                }
+
+            }.join()
+
+            o.name += ' in main session'
 
-        Thread.start {
-            OptLockNotVersioned.withNewSession { s ->
-                def reloaded = OptLockNotVersioned.get(o.id)
-                reloaded.name += ' in new session'
-                reloaded.save(flush: true)
+            try {
+                o.save(flush: true)
+            }
+            catch (e) {
+                ex = e
+                e.printStackTrace()
             }
-        }.join()
-        sleep(2000) // heisenbug
 
-        o.name += ' in main session'
-        def ex
-        try {
-            o.save(flush: true)
-        }
-        catch (e) {
-            ex = e
-            e.printStackTrace()
-        }
+            manager.session.clear()
+            o = OptLockNotVersioned.get(o.id)
 
-        manager.session.clear()
-        o = OptLockNotVersioned.get(o.id)
+        }
 
         then:
         ex == null

Reply via email to