[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) {
val lock = application.lock
for (registrar in registrars) {
val registered = application.lock.readLock().withLock {
application.serviceRegistered[registrar::class] == true
}
if (registered) {
if (lock.readLock().withLock { application.isRegistrarRegistered(registrar) }) {
continue
}
application.lock.writeLock().withLock {
lock.writeLock().withLock {
if (application.isRegistrarRegistered(registrar)) return@withLock
registrar.registerApplicationServices(application, testServices)
application.serviceRegistered[registrar::class] = true
}
}
}
private fun Application.isRegistrarRegistered(registrar: AnalysisApiTestServiceRegistrar): Boolean =
serviceRegistered[registrar::class] == true
private val Application.lock
by NotNullableUserDataProperty<Application, ReadWriteLock>(
Key("TestApplicationServicesRegistrarLock"),