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
