暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

AdaptivePerformanceTest.cs 47KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using NUnit.Framework;
  6. using UnityEditor.AdaptivePerformance.Simulator.Editor;
  7. using UnityEngine;
  8. using UnityEngine.AdaptivePerformance;
  9. using UnityEngine.AdaptivePerformance.Provider;
  10. using UnityEngine.TestTools;
  11. namespace UnityEditor.AdaptivePerformance.Tests
  12. {
  13. public class AdaptivePerformanceSimulation : ManagementTestSetup
  14. {
  15. [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
  16. static void Setup()
  17. {
  18. if (!AdaptivePerformanceGeneralSettings.Instance || !AdaptivePerformanceGeneralSettings.Instance.Manager || !AdaptivePerformanceGeneralSettings.Instance.Manager.isInitializationComplete)
  19. return;
  20. IAdaptivePerformanceSettings settings = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetSettings();
  21. if (settings == null)
  22. return;
  23. settings.automaticPerformanceMode = false;
  24. settings.logging = false;
  25. }
  26. [OneTimeSetUp]
  27. public void SetupAdaptivePerformanceManagerTest()
  28. {
  29. var ap = Holder.Instance;
  30. ap.DevelopmentSettings.Logging = false;
  31. ap.DevicePerformanceControl.AutomaticPerformanceControl = false;
  32. }
  33. [OneTimeTearDown]
  34. public void TeardownAdaptivePerformanceManagerTest()
  35. {
  36. base.TearDownTest();
  37. }
  38. [SetUp]
  39. public void Initialization()
  40. {
  41. if(!adaptivePerformanceGeneralSettings.IsProviderInitialized)
  42. Holder.Instance.InitializeAdaptivePerformance();
  43. if(!adaptivePerformanceGeneralSettings.IsProviderStarted)
  44. Holder.Instance.StartAdaptivePerformance();
  45. }
  46. [UnityTest]
  47. public IEnumerator Applies_Cpu_Level()
  48. {
  49. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  50. var ap = Holder.Instance;
  51. subsystem.AcceptsPerformanceLevel = true;
  52. var level = ap.DevicePerformanceControl.MaxCpuPerformanceLevel;
  53. ap.DevicePerformanceControl.CpuLevel = level;
  54. yield return null;
  55. Assert.AreEqual(level, ap.DevicePerformanceControl.CpuLevel);
  56. Assert.AreEqual(level, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  57. }
  58. [UnityTest]
  59. public IEnumerator Applies_Gpu_Level()
  60. {
  61. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  62. var ap = Holder.Instance;
  63. subsystem.AcceptsPerformanceLevel = true;
  64. var level = ap.DevicePerformanceControl.MaxGpuPerformanceLevel;
  65. ap.DevicePerformanceControl.GpuLevel = level;
  66. yield return null;
  67. Assert.AreEqual(level, ap.DevicePerformanceControl.GpuLevel);
  68. Assert.AreEqual(level, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  69. }
  70. [UnityTest]
  71. public IEnumerator Unknown_GpuLevel_In_Throttling_State()
  72. {
  73. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  74. var ap = Holder.Instance;
  75. subsystem.AcceptsPerformanceLevel = false;
  76. ap.DevicePerformanceControl.GpuLevel = ap.DevicePerformanceControl.MaxCpuPerformanceLevel;
  77. yield return null;
  78. Assert.AreEqual(PerformanceControlMode.System, ap.DevicePerformanceControl.PerformanceControlMode);
  79. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  80. }
  81. [UnityTest]
  82. public IEnumerator Unknown_CpuLevel_In_Throttling_State()
  83. {
  84. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  85. var ap = Holder.Instance;
  86. subsystem.AcceptsPerformanceLevel = false;
  87. ap.DevicePerformanceControl.CpuLevel = ap.DevicePerformanceControl.MaxCpuPerformanceLevel;
  88. yield return null;
  89. Assert.AreEqual(PerformanceControlMode.System, ap.DevicePerformanceControl.PerformanceControlMode);
  90. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  91. }
  92. [UnityTest]
  93. public IEnumerator Ignores_Invalid_Cpu_Level()
  94. {
  95. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  96. var ap = Holder.Instance;
  97. subsystem.AcceptsPerformanceLevel = true;
  98. subsystem.WarningLevel = WarningLevel.NoWarning;
  99. ap.DevicePerformanceControl.CpuLevel = 100;
  100. yield return null;
  101. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  102. }
  103. [UnityTest]
  104. public IEnumerator Ignores_Invalid_Gpu_Level()
  105. {
  106. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  107. var ap = Holder.Instance;
  108. subsystem.AcceptsPerformanceLevel = true;
  109. subsystem.WarningLevel = WarningLevel.NoWarning;
  110. ap.DevicePerformanceControl.GpuLevel = -2;
  111. yield return null;
  112. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  113. }
  114. [UnityTest]
  115. public IEnumerator TemperatureChangeEvent_Values_Are_Applied()
  116. {
  117. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  118. var ap = Holder.Instance;
  119. subsystem.TemperatureLevel = 0.0f;
  120. subsystem.TemperatureTrend = 1.0f;
  121. yield return null;
  122. Assert.AreEqual(0.0f, ap.ThermalStatus.ThermalMetrics.TemperatureLevel);
  123. Assert.AreEqual(1.0f, ap.ThermalStatus.ThermalMetrics.TemperatureTrend);
  124. }
  125. [UnityTest]
  126. public IEnumerator WarningLevel_Is_Applied()
  127. {
  128. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  129. var ap = Holder.Instance;
  130. subsystem.WarningLevel = WarningLevel.ThrottlingImminent;
  131. yield return null;
  132. Assert.AreEqual(WarningLevel.ThrottlingImminent, ap.ThermalStatus.ThermalMetrics.WarningLevel);
  133. subsystem.WarningLevel = WarningLevel.Throttling;
  134. yield return null;
  135. Assert.AreEqual(WarningLevel.Throttling, ap.ThermalStatus.ThermalMetrics.WarningLevel);
  136. subsystem.WarningLevel = WarningLevel.NoWarning;
  137. yield return null;
  138. Assert.AreEqual(WarningLevel.NoWarning, ap.ThermalStatus.ThermalMetrics.WarningLevel);
  139. }
  140. [UnityTest]
  141. public IEnumerator Provider_FrameTimes_Work()
  142. {
  143. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  144. var ap = Holder.Instance;
  145. subsystem.NextGpuFrameTime = 0.033f;
  146. subsystem.NextCpuFrameTime = 0.015f;
  147. subsystem.NextOverallFrameTime = 0.042f;
  148. yield return null;
  149. var ft = ap.PerformanceStatus.FrameTiming;
  150. Assert.IsTrue(Mathf.Abs(ft.CurrentFrameTime - subsystem.NextOverallFrameTime) < 0.001f);
  151. Assert.IsTrue(Mathf.Abs(ft.CurrentCpuFrameTime - subsystem.NextCpuFrameTime) < 0.001f);
  152. Assert.IsTrue(Mathf.Abs(ft.CurrentGpuFrameTime - subsystem.NextGpuFrameTime) < 0.001f);
  153. }
  154. [UnityTest]
  155. public IEnumerator GpuBound_When_GpuTime_Is_High()
  156. {
  157. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  158. var ap = Holder.Instance;
  159. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  160. {
  161. subsystem.NextGpuFrameTime = 0.040f;
  162. subsystem.NextCpuFrameTime = 0.015f;
  163. subsystem.NextOverallFrameTime = 0.042f;
  164. yield return null;
  165. }
  166. Assert.AreEqual(PerformanceBottleneck.GPU, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  167. }
  168. [UnityTest]
  169. public IEnumerator CpuBound_When_CpuTime_Is_High()
  170. {
  171. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  172. var ap = Holder.Instance;
  173. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  174. {
  175. subsystem.NextGpuFrameTime = 0.033f;
  176. subsystem.NextCpuFrameTime = 0.038f;
  177. subsystem.NextOverallFrameTime = 0.042f;
  178. yield return null;
  179. }
  180. Assert.AreEqual(PerformanceBottleneck.CPU, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  181. }
  182. [UnityTest]
  183. public IEnumerator Unknown_Bottleneck_When_GpuTime_And_CpuTime_Are_Equal()
  184. {
  185. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  186. var ap = Holder.Instance;
  187. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  188. {
  189. subsystem.NextGpuFrameTime = 0.033f;
  190. subsystem.NextCpuFrameTime = subsystem.NextGpuFrameTime;
  191. subsystem.NextOverallFrameTime = 0.042f;
  192. yield return null;
  193. }
  194. Assert.AreEqual(PerformanceBottleneck.Unknown, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  195. }
  196. [UnityTest]
  197. public IEnumerator Bottleneck_TargetFrameRate_Works()
  198. {
  199. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  200. var ap = Holder.Instance;
  201. // There is a bug in the editor where target framerate can be 0 and the test will fail and we skip the test. -1 is default in Editor and is not supported either.
  202. if (AdaptivePerformanceManager.EffectiveTargetFrameRate() <= 0)
  203. {
  204. Assert.AreEqual(null, null);
  205. yield break;
  206. }
  207. // very low frame numbers, to avoid failing test
  208. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  209. {
  210. subsystem.NextCpuFrameTime = 0.0001f;
  211. subsystem.NextGpuFrameTime = 0.0002f;
  212. subsystem.NextOverallFrameTime = 0.001f;
  213. yield return null;
  214. }
  215. Assert.AreEqual(PerformanceBottleneck.TargetFrameRate, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  216. }
  217. [UnityTest]
  218. public IEnumerator PerformanceBottleneckChangeEvent_Works()
  219. {
  220. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  221. var ap = Holder.Instance;
  222. int eventCounter = 0;
  223. var bottleneck = PerformanceBottleneck.Unknown;
  224. // Change to Undefined bottleneck so we can have one change (as often it's defined due to the other tests)
  225. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  226. {
  227. subsystem.NextCpuFrameTime = 0.4f;
  228. subsystem.NextGpuFrameTime = 0.4f;
  229. subsystem.NextOverallFrameTime = 0.9f;
  230. yield return null;
  231. }
  232. PerformanceBottleneckChangeHandler eventHandler = delegate (PerformanceBottleneckChangeEventArgs args)
  233. {
  234. ++eventCounter;
  235. bottleneck = args.PerformanceBottleneck;
  236. };
  237. ap.PerformanceStatus.PerformanceBottleneckChangeEvent += eventHandler;
  238. // very high frame numbers, to avoid failing test on very slow machines (where targetframe rate is very high
  239. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  240. {
  241. subsystem.NextCpuFrameTime = 0.1f;
  242. subsystem.NextGpuFrameTime = 0.9f;
  243. subsystem.NextOverallFrameTime = 0.9f;
  244. yield return null;
  245. }
  246. Assert.AreEqual(PerformanceBottleneck.GPU, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  247. Assert.AreEqual(PerformanceBottleneck.GPU, bottleneck);
  248. Assert.AreEqual(1, eventCounter);
  249. }
  250. [UnityTest]
  251. public IEnumerator PerformanceLevelChangeEvent_Works()
  252. {
  253. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  254. subsystem.AcceptsPerformanceLevel = true; // boost mode disables performance level acceptance and those tests can run before this.
  255. var ap = Holder.Instance;
  256. var ctrl = ap.DevicePerformanceControl;
  257. ctrl.AutomaticPerformanceControl = false;
  258. var ps = ap.PerformanceStatus;
  259. ctrl.CpuLevel = 1;
  260. ctrl.GpuLevel = 2;
  261. yield return null;
  262. Assert.AreEqual(1, ps.PerformanceMetrics.CurrentCpuLevel);
  263. Assert.AreEqual(2, ps.PerformanceMetrics.CurrentGpuLevel);
  264. var eventArgs = new PerformanceLevelChangeEventArgs();
  265. PerformanceLevelChangeHandler eventHandler = delegate (PerformanceLevelChangeEventArgs args)
  266. {
  267. eventArgs = args;
  268. };
  269. ps.PerformanceLevelChangeEvent += eventHandler;
  270. ctrl.CpuLevel = 4;
  271. ctrl.GpuLevel = 0;
  272. yield return null;
  273. Assert.AreEqual(4, ps.PerformanceMetrics.CurrentCpuLevel);
  274. Assert.AreEqual(4, eventArgs.CpuLevel);
  275. Assert.AreEqual(0, ps.PerformanceMetrics.CurrentGpuLevel);
  276. Assert.AreEqual(0, eventArgs.GpuLevel);
  277. Assert.AreEqual(3, eventArgs.CpuLevelDelta);
  278. Assert.AreEqual(-2, eventArgs.GpuLevelDelta);
  279. Assert.AreEqual(false, eventArgs.ManualOverride);
  280. Assert.AreEqual(PerformanceControlMode.Manual, eventArgs.PerformanceControlMode);
  281. }
  282. [UnityTest]
  283. public IEnumerator ThermalEvent_Works()
  284. {
  285. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  286. var ap = Holder.Instance;
  287. var thermals = ap.ThermalStatus;
  288. var metrics = new ThermalMetrics();
  289. ThermalEventHandler eventHandler = delegate (ThermalMetrics args)
  290. {
  291. metrics = args;
  292. };
  293. thermals.ThermalEvent += eventHandler;
  294. subsystem.TemperatureLevel = 0.3f;
  295. subsystem.TemperatureTrend = 0.5f;
  296. yield return null;
  297. Assert.AreEqual(0.3f, metrics.TemperatureLevel, 0.0001f);
  298. Assert.AreEqual(0.5f, metrics.TemperatureTrend, 0.0001f);
  299. }
  300. [UnityTest]
  301. public IEnumerator PerformanceLevels_Are_Reapplied_After_Timeout()
  302. {
  303. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  304. var ap = Holder.Instance;
  305. subsystem.AcceptsPerformanceLevel = true;
  306. int gpuLevel = 0;
  307. int cpuLevel = 0;
  308. ap.DevicePerformanceControl.CpuLevel = gpuLevel;
  309. ap.DevicePerformanceControl.GpuLevel = cpuLevel;
  310. yield return null;
  311. // Samsung Subsystem would do this when "timeout" happens (setLevels changes levels back to default after 10min)
  312. subsystem.GpuPerformanceLevel = Constants.UnknownPerformanceLevel;
  313. subsystem.CpuPerformanceLevel = Constants.UnknownPerformanceLevel;
  314. yield return null;
  315. // AdaptivePerformance is supposed to reapply the last settings
  316. Assert.AreEqual(cpuLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  317. Assert.AreEqual(gpuLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  318. }
  319. [UnityTest]
  320. public IEnumerator PerformanceBoostChangeEvent_Works()
  321. {
  322. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  323. var ap = Holder.Instance;
  324. var ctrl = ap.DevicePerformanceControl;
  325. var ps = ap.PerformanceStatus;
  326. ctrl.CpuPerformanceBoost = true;
  327. ctrl.GpuPerformanceBoost = true;
  328. yield return null;
  329. Assert.AreEqual(false, ps.PerformanceMetrics.CpuPerformanceBoost);
  330. Assert.AreEqual(false, ps.PerformanceMetrics.GpuPerformanceBoost);
  331. yield return null;
  332. Assert.AreEqual(true, ps.PerformanceMetrics.CpuPerformanceBoost);
  333. Assert.AreEqual(true, ps.PerformanceMetrics.GpuPerformanceBoost);
  334. var eventArgs = new PerformanceBoostChangeEventArgs();
  335. PerformanceBoostChangeHandler eventHandler = delegate (PerformanceBoostChangeEventArgs args)
  336. {
  337. eventArgs = args;
  338. };
  339. ps.PerformanceBoostChangeEvent += eventHandler;
  340. yield return null;
  341. // Samsung Subsystem would do this when "timeout" happens (enableBoost changes to no boost after 15 sec)
  342. subsystem.GpuPerformanceBoost = false;
  343. subsystem.CpuPerformanceBoost = false;
  344. Assert.AreEqual(true, ps.PerformanceMetrics.CpuPerformanceBoost);
  345. Assert.AreEqual(false, eventArgs.CpuBoost);
  346. Assert.AreEqual(true, ps.PerformanceMetrics.GpuPerformanceBoost);
  347. Assert.AreEqual(false, eventArgs.GpuBoost);
  348. yield return null;
  349. Assert.AreEqual(false, ps.PerformanceMetrics.CpuPerformanceBoost);
  350. Assert.AreEqual(false, eventArgs.CpuBoost);
  351. Assert.AreEqual(false, ps.PerformanceMetrics.GpuPerformanceBoost);
  352. Assert.AreEqual(false, eventArgs.GpuBoost);
  353. }
  354. [UnityTest]
  355. public IEnumerator PerformanceBoost_Disables_PerformanceLevels()
  356. {
  357. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  358. var ap = Holder.Instance;
  359. var ctrl = ap.DevicePerformanceControl;
  360. var ps = ap.PerformanceStatus;
  361. ctrl.CpuPerformanceBoost = true;
  362. ctrl.GpuPerformanceBoost = true;
  363. yield return null;
  364. Assert.AreEqual(false, ps.PerformanceMetrics.CpuPerformanceBoost);
  365. Assert.AreEqual(false, ps.PerformanceMetrics.GpuPerformanceBoost);
  366. yield return null;
  367. Assert.AreEqual(true, ps.PerformanceMetrics.CpuPerformanceBoost);
  368. Assert.AreEqual(true, ps.PerformanceMetrics.GpuPerformanceBoost);
  369. ap.DevicePerformanceControl.CpuLevel = 3;
  370. ap.DevicePerformanceControl.GpuLevel = 2;
  371. yield return null;
  372. // AdaptivePerformance is supposed to not apply levels when bost mode is activated
  373. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  374. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  375. }
  376. [UnityTest]
  377. public IEnumerator PerformanceBoost_Is_Off_After_Timeout()
  378. {
  379. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  380. var ap = Holder.Instance;
  381. ap.DevicePerformanceControl.GpuPerformanceBoost = true;
  382. ap.DevicePerformanceControl.CpuPerformanceBoost = true;
  383. yield return null;
  384. // Samsung Subsystem would do this when "timeout" happens (enableBoost changes to no boost after 15 sec)
  385. subsystem.GpuPerformanceBoost = false;
  386. subsystem.CpuPerformanceBoost = false;
  387. yield return null;
  388. // AdaptivePerformance is supposed to reapply the last settings
  389. Assert.AreEqual(false, ap.PerformanceStatus.PerformanceMetrics.CpuPerformanceBoost);
  390. Assert.AreEqual(false, ap.PerformanceStatus.PerformanceMetrics.GpuPerformanceBoost);
  391. }
  392. [UnityTest]
  393. public IEnumerator Feature_ClusterInfo_Is_Supported()
  394. {
  395. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  396. var ap = Holder.Instance;
  397. var clusterInfo = ap.SupportedFeature(Feature.ClusterInfo);
  398. var bigcores = ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.BigCore;
  399. var mediumcores = ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.MediumCore;
  400. var tinycores = ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.LittleCore;
  401. yield return null;
  402. ClusterInfo newClusterInfo = new ClusterInfo
  403. {
  404. BigCore = 5,
  405. MediumCore = 4,
  406. LittleCore = -1
  407. };
  408. subsystem.SetClusterInfo(newClusterInfo);
  409. yield return null;
  410. Assert.AreEqual(true, clusterInfo);
  411. Assert.AreEqual(bigcores, 1);
  412. Assert.AreEqual(mediumcores, 3);
  413. Assert.AreEqual(tinycores, 4);
  414. Assert.AreEqual(ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.BigCore, 5);
  415. Assert.AreEqual(ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.MediumCore, 4);
  416. Assert.AreEqual(ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.LittleCore, -1);
  417. }
  418. /// <summary>
  419. /// Verifies the Scalers available in the assembly (e.g. created as sub-types from <see cref="AdaptivePerformanceScaler "/>
  420. /// are all registered and available as Scalers in the <see cref="AdaptivePerformanceIndexer"/>.
  421. /// </summary>
  422. [UnityTest]
  423. public IEnumerator All_Scalers_Available()
  424. {
  425. var ap = Holder.Instance;
  426. var apIndexer = ap.Indexer;
  427. var ti = typeof(AdaptivePerformanceScaler);
  428. var assemblyScalers = AppDomain.CurrentDomain.GetAssemblies()
  429. .SelectMany(i => i.GetTypes())
  430. .Count(i => ti.IsAssignableFrom(i) && !i.IsAbstract);
  431. var indexedScalers = new List<AdaptivePerformanceScaler>();
  432. apIndexer.GetAllRegisteredScalers(ref indexedScalers);
  433. yield return null;
  434. Assert.AreEqual(assemblyScalers, indexedScalers.Count);
  435. }
  436. [Test]
  437. public void Lifecycle_Running_Works()
  438. {
  439. Assert.IsTrue(Holder.Instance.Active);
  440. Assert.IsNotNull(Holder.Instance.Indexer);
  441. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  442. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderStarted);
  443. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  444. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  445. Assert.IsNotNull(activeLoader);
  446. Assert.IsTrue(activeLoader.Initialized);
  447. Assert.IsTrue(activeLoader.Running);
  448. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  449. Assert.IsNotNull(subsystem);
  450. Assert.IsTrue(subsystem.Initialized);
  451. Assert.IsTrue(subsystem.running);
  452. }
  453. [UnityTest]
  454. public IEnumerator Lifecycle_Initialization_When_Running_NoChange()
  455. {
  456. // attempting to initialize when AP is already running should result in no change
  457. var originalIndexer = Holder.Instance.Indexer;
  458. Holder.Instance.InitializeAdaptivePerformance();
  459. yield return null;
  460. Assert.IsTrue(Holder.Instance.Active);
  461. Assert.IsNotNull(Holder.Instance.Indexer);
  462. Assert.AreSame(originalIndexer, Holder.Instance.Indexer);
  463. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  464. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderStarted);
  465. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  466. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  467. Assert.IsNotNull(activeLoader);
  468. Assert.IsTrue(activeLoader.Initialized);
  469. Assert.IsTrue(activeLoader.Running);
  470. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  471. Assert.IsNotNull(subsystem);
  472. Assert.IsTrue(subsystem.Initialized);
  473. Assert.IsTrue(subsystem.running);
  474. }
  475. [UnityTest]
  476. public IEnumerator Lifecycle_Start_When_Running_NoChange()
  477. {
  478. // attempting to start when AP is already running should result in no change
  479. Holder.Instance.StartAdaptivePerformance();
  480. yield return null;
  481. Assert.IsTrue(Holder.Instance.Active);
  482. Assert.IsNotNull(Holder.Instance.Indexer);
  483. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  484. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderStarted);
  485. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  486. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  487. Assert.IsNotNull(activeLoader);
  488. Assert.IsTrue(activeLoader.Initialized);
  489. Assert.IsTrue(activeLoader.Running);
  490. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  491. Assert.IsNotNull(subsystem);
  492. Assert.IsTrue(subsystem.Initialized);
  493. Assert.IsTrue(subsystem.running);
  494. }
  495. [UnityTest]
  496. public IEnumerator Lifecycle_Stop_When_Running_Works()
  497. {
  498. Holder.Instance.StopAdaptivePerformance();
  499. yield return null;
  500. Assert.IsFalse(Holder.Instance.Active);
  501. Assert.IsNotNull(Holder.Instance.Indexer);
  502. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  503. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  504. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  505. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  506. Assert.IsNotNull(activeLoader);
  507. Assert.IsTrue(activeLoader.Initialized);
  508. Assert.IsFalse(activeLoader.Running);
  509. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  510. Assert.IsNotNull(subsystem);
  511. Assert.IsTrue(subsystem.Initialized);
  512. Assert.IsFalse(subsystem.running);
  513. }
  514. [UnityTest]
  515. public IEnumerator Lifecycle_Deinitialize_When_Running_Works()
  516. {
  517. var previousActiveLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  518. var previousSubsystem = previousActiveLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  519. Holder.Instance.DeinitializeAdaptivePerformance();
  520. yield return null;
  521. Assert.IsFalse(Holder.Instance.Active);
  522. Assert.IsNull(Holder.Instance.Indexer);
  523. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  524. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  525. Assert.IsFalse(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  526. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  527. Assert.IsNull(activeLoader);
  528. // check previous active loader and subsystem if shut down
  529. Assert.IsFalse(previousActiveLoader.Initialized);
  530. Assert.IsFalse(previousActiveLoader.Running);
  531. Assert.IsFalse(previousSubsystem.Initialized);
  532. Assert.IsFalse(previousSubsystem.running);
  533. }
  534. [UnityTest]
  535. public IEnumerator Lifecycle_Stop_Deinitialize_Works()
  536. {
  537. Holder.Instance.StopAdaptivePerformance();
  538. yield return null;
  539. Assert.IsFalse(Holder.Instance.Active);
  540. Assert.IsNotNull(Holder.Instance.Indexer);
  541. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  542. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  543. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  544. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  545. Assert.IsNotNull(activeLoader);
  546. Assert.IsTrue(activeLoader.Initialized);
  547. Assert.IsFalse(activeLoader.Running);
  548. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  549. Assert.IsNotNull(subsystem);
  550. Assert.IsTrue(subsystem.Initialized);
  551. Assert.IsFalse(subsystem.running);
  552. Holder.Instance.DeinitializeAdaptivePerformance();
  553. yield return null;
  554. Assert.IsFalse(Holder.Instance.Active);
  555. Assert.IsNull(Holder.Instance.Indexer);
  556. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  557. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  558. Assert.IsFalse(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  559. Assert.IsNull(adaptivePerformanceGeneralSettings.Manager.activeLoader);
  560. // check previous active loader and subsystem if shut down
  561. Assert.IsFalse(activeLoader.Initialized);
  562. Assert.IsFalse(activeLoader.Running);
  563. Assert.IsFalse(subsystem.Initialized);
  564. Assert.IsFalse(subsystem.running);
  565. }
  566. [UnityTest]
  567. public IEnumerator Lifecycle_Stop_Start_Works()
  568. {
  569. var originalIndexer = Holder.Instance.Indexer;
  570. var originalLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  571. var originalSubsystem = originalLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  572. Holder.Instance.StopAdaptivePerformance();
  573. yield return null;
  574. Assert.IsFalse(Holder.Instance.Active);
  575. Assert.IsNotNull(Holder.Instance.Indexer);
  576. Assert.AreSame(originalIndexer, Holder.Instance.Indexer);
  577. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  578. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  579. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  580. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  581. Assert.IsNotNull(activeLoader);
  582. Assert.AreSame(originalLoader, activeLoader);
  583. Assert.IsTrue(activeLoader.Initialized);
  584. Assert.IsFalse(activeLoader.Running);
  585. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  586. Assert.IsNotNull(subsystem);
  587. Assert.AreSame(originalSubsystem, subsystem);
  588. Assert.IsTrue(subsystem.Initialized);
  589. Assert.IsFalse(subsystem.running);
  590. Holder.Instance.StartAdaptivePerformance();
  591. yield return null;
  592. Assert.IsTrue(Holder.Instance.Active);
  593. Assert.IsNotNull(Holder.Instance.Indexer);
  594. Assert.AreSame(originalIndexer, Holder.Instance.Indexer);
  595. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  596. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderStarted);
  597. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  598. activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  599. Assert.IsNotNull(activeLoader);
  600. Assert.AreSame(originalLoader, activeLoader);
  601. Assert.IsTrue(activeLoader.Initialized);
  602. Assert.IsTrue(activeLoader.Running);
  603. subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  604. Assert.IsNotNull(subsystem);
  605. Assert.AreSame(originalSubsystem, subsystem);
  606. Assert.IsTrue(subsystem.Initialized);
  607. Assert.IsTrue(subsystem.running);
  608. }
  609. [UnityTest]
  610. public IEnumerator Lifecycle_Entire_Workflow_Works()
  611. {
  612. var originalIndexer = Holder.Instance.Indexer;
  613. var originalLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  614. var originalSubsystem = originalLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  615. Holder.Instance.StopAdaptivePerformance();
  616. yield return null;
  617. Assert.IsFalse(Holder.Instance.Active);
  618. Assert.IsNotNull(Holder.Instance.Indexer);
  619. Assert.AreSame(originalIndexer, Holder.Instance.Indexer);
  620. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  621. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  622. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  623. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  624. Assert.IsNotNull(activeLoader);
  625. Assert.AreSame(originalLoader, activeLoader);
  626. Assert.IsTrue(activeLoader.Initialized);
  627. Assert.IsFalse(activeLoader.Running);
  628. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  629. Assert.IsNotNull(subsystem);
  630. Assert.AreSame(originalSubsystem, subsystem);
  631. Assert.IsTrue(subsystem.Initialized);
  632. Assert.IsFalse(subsystem.running);
  633. Holder.Instance.DeinitializeAdaptivePerformance();
  634. yield return null;
  635. Assert.IsFalse(Holder.Instance.Active);
  636. Assert.IsNull(Holder.Instance.Indexer);
  637. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  638. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  639. Assert.IsFalse(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  640. Assert.IsNull(adaptivePerformanceGeneralSettings.Manager.activeLoader);
  641. // check previous active loader and subsystem if shut down
  642. Assert.IsFalse(activeLoader.Initialized);
  643. Assert.IsFalse(activeLoader.Running);
  644. Assert.IsFalse(subsystem.Initialized);
  645. Assert.IsFalse(subsystem.running);
  646. Holder.Instance.InitializeAdaptivePerformance();
  647. yield return null;
  648. var newIndexer = Holder.Instance.Indexer;
  649. Assert.IsFalse(Holder.Instance.Active);
  650. Assert.IsNotNull(Holder.Instance.Indexer);
  651. Assert.AreNotSame(originalIndexer, newIndexer);
  652. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  653. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  654. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  655. var newLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  656. Assert.IsNotNull(newLoader);
  657. Assert.AreSame(originalLoader, newLoader);
  658. Assert.IsTrue(newLoader.Initialized);
  659. Assert.IsFalse(newLoader.Running);
  660. var newSubsystem = newLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  661. Assert.IsNotNull(newSubsystem);
  662. Assert.AreNotSame(originalSubsystem, newSubsystem);
  663. Assert.IsTrue(newSubsystem.Initialized);
  664. Assert.IsFalse(newSubsystem.running);
  665. Holder.Instance.StartAdaptivePerformance();
  666. yield return null;
  667. Assert.IsTrue(Holder.Instance.Active);
  668. Assert.IsNotNull(Holder.Instance.Indexer);
  669. Assert.AreSame(newIndexer, Holder.Instance.Indexer);
  670. Assert.AreNotSame(originalIndexer, Holder.Instance.Indexer);
  671. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  672. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderStarted);
  673. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  674. Assert.AreNotSame(originalSubsystem, adaptivePerformanceGeneralSettings.Manager.activeLoader.GetDefaultSubsystem());
  675. activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  676. Assert.IsNotNull(activeLoader);
  677. Assert.AreSame(newLoader, activeLoader);
  678. Assert.AreSame(originalLoader, activeLoader);
  679. Assert.IsTrue(activeLoader.Initialized);
  680. Assert.IsTrue(activeLoader.Running);
  681. subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  682. Assert.IsNotNull(subsystem);
  683. Assert.AreSame(newSubsystem, subsystem);
  684. Assert.AreNotSame(originalSubsystem, subsystem);
  685. Assert.IsTrue(subsystem.Initialized);
  686. Assert.IsTrue(subsystem.running);
  687. }
  688. [UnityTest]
  689. public IEnumerator Lifecycle_Deinitialize_Start_NotAllowed()
  690. {
  691. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  692. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  693. Holder.Instance.DeinitializeAdaptivePerformance();
  694. yield return null;
  695. Holder.Instance.StartAdaptivePerformance();
  696. yield return null;
  697. // should not be running b/c initialization was not called first
  698. Assert.IsFalse(Holder.Instance.Active);
  699. Assert.IsNull(Holder.Instance.Indexer);
  700. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  701. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  702. Assert.IsFalse(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  703. Assert.IsNull(adaptivePerformanceGeneralSettings.Manager.activeLoader);
  704. // check previous active loader and subsystem if shut down
  705. Assert.IsFalse(activeLoader.Initialized);
  706. Assert.IsFalse(activeLoader.Running);
  707. Assert.IsFalse(subsystem.Initialized);
  708. Assert.IsFalse(subsystem.running);
  709. }
  710. [UnityTest]
  711. public IEnumerator Lifecycle_Deinitialize_Stop_NowAllowed()
  712. {
  713. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  714. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  715. Holder.Instance.DeinitializeAdaptivePerformance();
  716. yield return null;
  717. Holder.Instance.StopAdaptivePerformance();
  718. yield return null;
  719. // should still be torn down
  720. Assert.IsFalse(Holder.Instance.Active);
  721. Assert.IsNull(Holder.Instance.Indexer);
  722. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  723. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  724. Assert.IsFalse(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  725. Assert.IsNull(adaptivePerformanceGeneralSettings.Manager.activeLoader);
  726. // check previous active loader and subsystem if shut down
  727. Assert.IsFalse(activeLoader.Initialized);
  728. Assert.IsFalse(activeLoader.Running);
  729. Assert.IsFalse(subsystem.Initialized);
  730. Assert.IsFalse(subsystem.running);
  731. }
  732. [UnityTest]
  733. public IEnumerator Lifecycle_Double_Initialization_NoChange()
  734. {
  735. // attempting to double initialization should result in no change
  736. var originalIndexer = Holder.Instance.Indexer;
  737. var originalLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  738. var originalSubsystem = originalLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  739. Holder.Instance.DeinitializeAdaptivePerformance();
  740. yield return null;
  741. Holder.Instance.InitializeAdaptivePerformance();
  742. yield return null;
  743. var newIndexer = Holder.Instance.Indexer;
  744. Assert.IsNotNull(newIndexer);
  745. Assert.AreNotSame(originalIndexer, newIndexer);
  746. var newLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  747. Assert.IsNotNull(newLoader);
  748. Assert.AreSame(originalLoader, newLoader);
  749. var newSubsystem = newLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  750. Assert.IsNotNull(newSubsystem);
  751. Assert.AreNotSame(originalSubsystem, newSubsystem);
  752. Holder.Instance.InitializeAdaptivePerformance();
  753. yield return null;
  754. Assert.IsFalse(Holder.Instance.Active);
  755. Assert.IsNotNull(Holder.Instance.Indexer);
  756. Assert.AreSame(newIndexer, Holder.Instance.Indexer);
  757. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  758. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  759. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  760. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  761. Assert.IsNotNull(activeLoader);
  762. Assert.AreSame(newLoader, activeLoader);
  763. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  764. Assert.IsNotNull(subsystem);
  765. Assert.AreSame(newSubsystem, subsystem);
  766. }
  767. [UnityTest]
  768. public IEnumerator Lifecycle_Double_Start_NoChange()
  769. {
  770. // attempting to double start should result in no change
  771. var originalIndexer = Holder.Instance.Indexer;
  772. var originalLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  773. var originalSubsystem = originalLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  774. Holder.Instance.DeinitializeAdaptivePerformance();
  775. yield return null;
  776. Holder.Instance.InitializeAdaptivePerformance();
  777. yield return null;
  778. Holder.Instance.StartAdaptivePerformance();
  779. yield return null;
  780. var newIndexer = Holder.Instance.Indexer;
  781. Assert.IsNotNull(newIndexer);
  782. Assert.AreNotSame(originalIndexer, newIndexer);
  783. var newLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  784. Assert.IsNotNull(newLoader);
  785. Assert.AreSame(originalLoader, newLoader);
  786. var newSubsystem = newLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  787. Assert.IsNotNull(newSubsystem);
  788. Assert.AreNotSame(originalSubsystem, newSubsystem);
  789. Holder.Instance.StartAdaptivePerformance();
  790. yield return null;
  791. Assert.IsTrue(Holder.Instance.Active);
  792. Assert.IsNotNull(Holder.Instance.Indexer);
  793. Assert.AreSame(newIndexer, Holder.Instance.Indexer);
  794. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  795. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderStarted);
  796. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  797. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  798. Assert.IsNotNull(activeLoader);
  799. Assert.AreSame(newLoader, activeLoader);
  800. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  801. Assert.IsNotNull(subsystem);
  802. Assert.AreSame(newSubsystem, subsystem);
  803. }
  804. [UnityTest]
  805. public IEnumerator Lifecycle_Double_Stop_NoChange()
  806. {
  807. // attempting to double stop should result in no change
  808. var originalIndexer = Holder.Instance.Indexer;
  809. var originalLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  810. var originalSubsystem = originalLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  811. Holder.Instance.StopAdaptivePerformance();
  812. yield return null;
  813. Holder.Instance.StopAdaptivePerformance();
  814. yield return null;
  815. Assert.IsFalse(Holder.Instance.Active);
  816. Assert.IsNotNull(Holder.Instance.Indexer);
  817. Assert.AreSame(originalIndexer, Holder.Instance.Indexer);
  818. Assert.IsTrue(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  819. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  820. Assert.IsTrue(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  821. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  822. Assert.IsNotNull(activeLoader);
  823. Assert.AreSame(originalLoader, activeLoader);
  824. var subsystem = activeLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  825. Assert.IsNotNull(subsystem);
  826. Assert.AreSame(originalSubsystem, subsystem);
  827. }
  828. [UnityTest]
  829. public IEnumerator Lifecycle_Double_Deinitialize_NoChange()
  830. {
  831. // attempting to double deinitialize should result in no change
  832. var previousActiveLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  833. var previousSubsystem = previousActiveLoader.GetDefaultSubsystem() as AdaptivePerformanceSubsystem;
  834. Holder.Instance.DeinitializeAdaptivePerformance();
  835. yield return null;
  836. Holder.Instance.DeinitializeAdaptivePerformance();
  837. yield return null;
  838. Assert.IsFalse(Holder.Instance.Active);
  839. Assert.IsNull(Holder.Instance.Indexer);
  840. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderInitialized);
  841. Assert.IsFalse(adaptivePerformanceGeneralSettings.IsProviderStarted);
  842. Assert.IsFalse(adaptivePerformanceGeneralSettings.Manager.isInitializationComplete);
  843. var activeLoader = adaptivePerformanceGeneralSettings.Manager.activeLoader;
  844. Assert.IsNull(activeLoader);
  845. // check previous active loader and subsystem if shut down
  846. Assert.IsFalse(previousActiveLoader.Initialized);
  847. Assert.IsFalse(previousActiveLoader.Running);
  848. Assert.IsFalse(previousSubsystem.Initialized);
  849. Assert.IsFalse(previousSubsystem.running);
  850. }
  851. }
  852. }