[Analysis] fix race in registering services in test

This commit is contained in:
Ilya Kirillov
2022-07-01 16:34:26 +02:00
parent 21fcb9ccc0
commit 445c0deb61
@@ -55,24 +55,25 @@ abstract class AnalysisApiTestConfigurator {
} }
} }
private object ApplicationServiceRegistrar { object ApplicationServiceRegistrar {
fun register(application: MockApplication, registrars: List<AnalysisApiTestServiceRegistrar>, testServices: TestServices) { fun register(application: MockApplication, registrars: List<AnalysisApiTestServiceRegistrar>, testServices: TestServices) {
val lock = application.lock
for (registrar in registrars) { for (registrar in registrars) {
val registered = application.lock.readLock().withLock { if (lock.readLock().withLock { application.isRegistrarRegistered(registrar) }) {
application.serviceRegistered[registrar::class] == true
}
if (registered) {
continue continue
} }
application.lock.writeLock().withLock { lock.writeLock().withLock {
if (application.isRegistrarRegistered(registrar)) return@withLock
registrar.registerApplicationServices(application, testServices) registrar.registerApplicationServices(application, testServices)
application.serviceRegistered[registrar::class] = true application.serviceRegistered[registrar::class] = true
} }
} }
} }
private fun Application.isRegistrarRegistered(registrar: AnalysisApiTestServiceRegistrar): Boolean =
serviceRegistered[registrar::class] == true
private val Application.lock private val Application.lock
by NotNullableUserDataProperty<Application, ReadWriteLock>( by NotNullableUserDataProperty<Application, ReadWriteLock>(
Key("TestApplicationServicesRegistrarLock"), Key("TestApplicationServicesRegistrarLock"),