ThreadServiceTest.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "stdafx.h"
  6. #pragma warning(disable:26434) // Function definition hides non-virtual function in base class
  7. #pragma warning(disable:26439) // Implicit noexcept
  8. #pragma warning(disable:26451) // Arithmetic overflow
  9. #pragma warning(disable:26495) // Uninitialized member variable
  10. #include "catch.hpp"
  11. #pragma warning(disable:6387) // suppressing preFAST which raises warning for passing null to the JsRT APIs
  12. namespace ThreadServiceTests
  13. {
  14. struct ThreadPoolCallbackContext
  15. {
  16. JsBackgroundWorkItemCallback callback;
  17. void * callbackData;
  18. };
  19. static bool sawCallback = false;
  20. void CALLBACK ThreadPoolCallback(PTP_CALLBACK_INSTANCE /* Instance */, void * Context)
  21. {
  22. ThreadPoolCallbackContext * c = (ThreadPoolCallbackContext *)Context;
  23. c->callback(c->callbackData);
  24. delete c;
  25. }
  26. bool CALLBACK SubmitBackgroundWorkToThreadPool(JsBackgroundWorkItemCallback callback, void * callbackData)
  27. {
  28. REQUIRE(callback != nullptr);
  29. REQUIRE(callbackData != nullptr);
  30. sawCallback = true;
  31. ThreadPoolCallbackContext * c = new ThreadPoolCallbackContext();
  32. c->callback = callback;
  33. c->callbackData = callbackData;
  34. BOOL success = TrySubmitThreadpoolCallback(ThreadPoolCallback, c, nullptr);
  35. REQUIRE(!!success);
  36. return true;
  37. }
  38. bool CALLBACK FailBackgroundWorkRequest(JsBackgroundWorkItemCallback callback, void * callbackData)
  39. {
  40. REQUIRE(callback != nullptr);
  41. REQUIRE(callbackData != nullptr);
  42. sawCallback = true;
  43. // Always fail the request and force work in-thread
  44. return false;
  45. }
  46. void Test(JsThreadServiceCallback threadService)
  47. {
  48. sawCallback = false;
  49. JsRuntimeHandle runtime = JS_INVALID_RUNTIME_HANDLE;
  50. JsContextRef context = JS_INVALID_REFERENCE;
  51. REQUIRE(JsCreateRuntime(JsRuntimeAttributeAllowScriptInterrupt, threadService, &runtime) == JsNoError);
  52. REQUIRE(JsCreateContext(runtime, &context) == JsNoError);
  53. REQUIRE(JsSetCurrentContext(context) == JsNoError);
  54. LPCWSTR script = nullptr;
  55. REQUIRE(FileLoadHelpers::LoadScriptFromFile("Splay.js", script) == S_OK);
  56. REQUIRE(script != nullptr);
  57. REQUIRE(JsRunScript(script, JS_SOURCE_CONTEXT_NONE, _u(""), nullptr) == JsNoError);
  58. REQUIRE(JsSetCurrentContext(JS_INVALID_REFERENCE) == JsNoError);
  59. REQUIRE(JsDisposeRuntime(runtime) == JsNoError);
  60. // Ensure that at least one callback happened
  61. CHECK(sawCallback);
  62. }
  63. TEST_CASE("ThreadServiceTest_ThreadPoolTest", "[ThreadServiceTest]")
  64. {
  65. Test(SubmitBackgroundWorkToThreadPool);
  66. }
  67. TEST_CASE("ThreadServiceTest_AlwaysDenyRequestTest", "[ThreadServiceTest]")
  68. {
  69. Test(FailBackgroundWorkRequest);
  70. }
  71. }