/ src / settings-ui / Settings.UI.UnitTests / ModelsTests / SettingsRepositoryTest.cs
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  }