TestStepExtensions.getSettingsLookup is not thread safe
TestStepExtensions.getSettingsLookup uses a static dictionary that can get accessed by multiple threads concurrently, this causes issues when they all try to write to it at the same time.
The fix is easy, just use a Concurrent dictionary or lock the write operation.
Stack trace:
System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
at System.Collections.Generic.Dictionary`2.FindValue(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at OpenTap.TestStepExtensions.getSettingsLookup(TypeData targetType, ITypeData sourceType)
at OpenTap.TestStepExtensions.GetObjectSettings[T,T2,T3](T2 item, Boolean onlyEnabled, Func`3 transform, HashSet`1 itemSet, TypeData targetType)
at OpenTap.TestStepExtensions.GetObjectSettings[T,T2,T3](IEnumerable`1 objects, Boolean onlyEnabled, Func`3 transform, HashSet`1 itemSet)
at OpenTap.TestPlan.DoExecute(IEnumerable`1 resultListeners, IEnumerable`1 metaDataParameters, HashSet`1 stepsOverride)
at OpenTap.TestPlan.executeInContext(IEnumerable`1 resultListeners, IEnumerable`1 metaDataParameters, HashSet`1 stepsOverride)
at OpenTap.TestPlan.Execute(IEnumerable`1 resultListeners, IEnumerable`1 metaDataParameters, HashSet`1 stepsOverride)
at Keysight.OpenTap.Plugins.ResultListeners.UnitTests.SqlDatabaseResultStoreTests.ResultListenerSimpleTest(SqlDatabase db, Boolean open) in /home/romadsen/code/sql-and-postgresql/SqlDatabase.UnitTests/DataBaseTests.cs:line 279
at Keysight.OpenTap.Plugins.ResultListeners.UnitTests.SqlDatabaseResultStoreTests.<>c__DisplayClass9_0.<ResultListenerSimpleTestP>b__0() in /home/romadsen/code/sql-and-postgresql/SqlDatabase.UnitTests/DataBaseTests.cs:line 241
at OpenTap.TapThread.Process()
at OpenTap.ThreadManager.processQueue()
at System.Collections.Generic.Dictionary`2.FindValue(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at OpenTap.TestStepExtensions.getSettingsLookup(TypeData targetType, ITypeData sourceType)
at OpenTap.TestStepExtensions.GetObjectSettings[T,T2,T3](T2 item, Boolean onlyEnabled, Func`3 transform, HashSet`1 itemSet, TypeData targetType)
at OpenTap.TestStepExtensions.GetObjectSettings[T,T2,T3](IEnumerable`1 objects, Boolean onlyEnabled, Func`3 transform, HashSet`1 itemSet)
at OpenTap.TestPlan.DoExecute(IEnumerable`1 resultListeners, IEnumerable`1 metaDataParameters, HashSet`1 stepsOverride)
at OpenTap.TestPlan.executeInContext(IEnumerable`1 resultListeners, IEnumerable`1 metaDataParameters, HashSet`1 stepsOverride)
at OpenTap.TestPlan.Execute(IEnumerable`1 resultListeners, IEnumerable`1 metaDataParameters, HashSet`1 stepsOverride)
at Keysight.OpenTap.Plugins.ResultListeners.UnitTests.SqlDatabaseResultStoreTests.ResultListenerSimpleTest(SqlDatabase db, Boolean open) in /home/romadsen/code/sql-and-postgresql/SqlDatabase.UnitTests/DataBaseTests.cs:line 279
at Keysight.OpenTap.Plugins.ResultListeners.UnitTests.SqlDatabaseResultStoreTests.<>c__DisplayClass9_0.<ResultListenerSimpleTestP>b__0() in /home/romadsen/code/sql-and-postgresql/SqlDatabase.UnitTests/DataBaseTests.cs:line 241
at OpenTap.TapThread.Process()
at OpenTap.ThreadManager.processQueue()
Edited by Rolf Madsen