/ src / common / UnitTests-CommonUtils / OsDetect.Tests.cpp
OsDetect.Tests.cpp
  1  #include "pch.h"
  2  #include "TestHelpers.h"
  3  #include <os-detect.h>
  4  
  5  using namespace Microsoft::VisualStudio::CppUnitTestFramework;
  6  
  7  namespace UnitTestsCommonUtils
  8  {
  9      TEST_CLASS(OsDetectTests)
 10      {
 11      public:
 12          // IsAPIContractVxAvailable tests
 13          TEST_METHOD(IsAPIContractV8Available_ReturnsBoolean)
 14          {
 15              // This test verifies the function runs without crashing
 16              // The actual result depends on the OS version
 17              bool result = IsAPIContractV8Available();
 18              // Result is either true or false, both are valid
 19              Assert::IsTrue(result == true || result == false);
 20          }
 21  
 22          TEST_METHOD(IsAPIContractVxAvailable_V1_ReturnsTrue)
 23          {
 24              // API contract v1 should be available on any modern Windows
 25              bool result = IsAPIContractVxAvailable<1>();
 26              Assert::IsTrue(result);
 27          }
 28  
 29          TEST_METHOD(IsAPIContractVxAvailable_V5_ReturnsBooleanConsistently)
 30          {
 31              // Call multiple times to verify caching works correctly
 32              bool result1 = IsAPIContractVxAvailable<5>();
 33              bool result2 = IsAPIContractVxAvailable<5>();
 34              bool result3 = IsAPIContractVxAvailable<5>();
 35              Assert::AreEqual(result1, result2);
 36              Assert::AreEqual(result2, result3);
 37          }
 38  
 39          TEST_METHOD(IsAPIContractVxAvailable_V10_ReturnsBoolean)
 40          {
 41              bool result = IsAPIContractVxAvailable<10>();
 42              // Result depends on Windows version, but should not crash
 43              Assert::IsTrue(result == true || result == false);
 44          }
 45  
 46          TEST_METHOD(IsAPIContractVxAvailable_V15_ReturnsBoolean)
 47          {
 48              bool result = IsAPIContractVxAvailable<15>();
 49              // Higher API versions, may or may not be available
 50              Assert::IsTrue(result == true || result == false);
 51          }
 52  
 53          // Is19H1OrHigher tests
 54          TEST_METHOD(Is19H1OrHigher_ReturnsBoolean)
 55          {
 56              bool result = Is19H1OrHigher();
 57              // Result depends on OS version, but should not crash
 58              Assert::IsTrue(result == true || result == false);
 59          }
 60  
 61          TEST_METHOD(Is19H1OrHigher_ReturnsSameAsV8Contract)
 62          {
 63              // Is19H1OrHigher is implemented as IsAPIContractV8Available
 64              bool is19H1 = Is19H1OrHigher();
 65              bool isV8 = IsAPIContractV8Available();
 66              Assert::AreEqual(is19H1, isV8);
 67          }
 68  
 69          TEST_METHOD(Is19H1OrHigher_ConsistentAcrossMultipleCalls)
 70          {
 71              bool result1 = Is19H1OrHigher();
 72              bool result2 = Is19H1OrHigher();
 73              bool result3 = Is19H1OrHigher();
 74              Assert::AreEqual(result1, result2);
 75              Assert::AreEqual(result2, result3);
 76          }
 77  
 78          // Static caching behavior tests
 79          TEST_METHOD(StaticCaching_DifferentContractVersions_IndependentResults)
 80          {
 81              // Each template instantiation has its own static variable
 82              bool v1 = IsAPIContractVxAvailable<1>();
 83              (void)v1; // Suppress unused variable warning
 84  
 85              // v1 should be true on any modern Windows
 86              Assert::IsTrue(v1);
 87          }
 88  
 89          // Performance test (optional - verifies caching)
 90          TEST_METHOD(Performance_MultipleCallsAreFast)
 91          {
 92              // The static caching should make subsequent calls very fast
 93              auto start = std::chrono::high_resolution_clock::now();
 94  
 95              for (int i = 0; i < 10000; ++i)
 96              {
 97                  Is19H1OrHigher();
 98              }
 99  
100              auto end = std::chrono::high_resolution_clock::now();
101              auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
102  
103              // 10000 calls should complete in well under 1 second due to caching
104              Assert::IsTrue(duration.count() < 1000);
105          }
106      };
107  }