SettingsRepositoryTest.cs
1 // Copyright (c) Microsoft Corporation 2 // The Microsoft Corporation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Collections.Generic; 6 using System.Threading.Tasks; 7 8 using Microsoft.PowerToys.Settings.UI.Library; 9 using Microsoft.PowerToys.Settings.UI.UnitTests.Mocks; 10 using Microsoft.VisualStudio.TestTools.UnitTesting; 11 12 namespace CommonLibTest 13 { 14 [TestClass] 15 public class SettingsRepositoryTest 16 { 17 private static Task<SettingsRepository<GeneralSettings>> GetSettingsRepository(SettingsUtils settingsUtils) 18 { 19 return Task.Run(() => 20 { 21 return SettingsRepository<GeneralSettings>.GetInstance(settingsUtils); 22 }); 23 } 24 25 [TestMethod] 26 public void SettingsRepositoryInstanceWhenCalledMustReturnSameObject() 27 { 28 // The singleton class Settings Repository must always have a single instance 29 var mockSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils<GeneralSettings>(); 30 31 // Arrange and Act 32 SettingsRepository<GeneralSettings> firstInstance = SettingsRepository<GeneralSettings>.GetInstance(mockSettingsUtils.Object); 33 SettingsRepository<GeneralSettings> secondInstance = SettingsRepository<GeneralSettings>.GetInstance(mockSettingsUtils.Object); 34 35 // Assert 36 Assert.IsTrue(object.ReferenceEquals(firstInstance, secondInstance)); 37 } 38 39 [TestMethod] 40 public void SettingsRepositoryInstanceMustBeTheSameAcrossThreads() 41 { 42 // Multiple tasks try to access and initialize the settings repository class, however they must all access the same settings Repository object. 43 44 // Arrange 45 var mockSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils<GeneralSettings>(); 46 List<Task<SettingsRepository<GeneralSettings>>> settingsRepoTasks = new List<Task<SettingsRepository<GeneralSettings>>>(); 47 int numberOfTasks = 100; 48 49 for (int i = 0; i < numberOfTasks; i++) 50 { 51 settingsRepoTasks.Add(GetSettingsRepository(mockSettingsUtils.Object)); 52 } 53 54 // Act 55 Task.WaitAll(settingsRepoTasks.ToArray()); 56 57 // Assert 58 for (int i = 0; i < numberOfTasks - 1; i++) 59 { 60 Assert.IsTrue(object.ReferenceEquals(settingsRepoTasks[i].Result, settingsRepoTasks[i + 1].Result)); 61 } 62 } 63 } 64 }