/tests/krabstests/test_parser.cpp

https://github.com/Microsoft/krabsetw · C++ · 169 lines · 123 code · 37 blank · 9 comment · 0 complexity · fa7bbc57f76062faeb8a54b509bc31a5 MD5 · raw file

  1. // Copyright (c) Microsoft. All rights reserved.
  2. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
  3. #include "CppUnitTest.h"
  4. #include <krabs.hpp>
  5. using namespace Microsoft::VisualStudio::CppUnitTestFramework;
  6. namespace krabstests
  7. {
  8. TEST_CLASS(test_parser)
  9. {
  10. public:
  11. TEST_METHOD(should_return_correct_count_of_props_when_enumerating)
  12. {
  13. krabs::guid powershell(L"{A0C1853B-5C40-4B15-8766-3CF1C58F985A}");
  14. krabs::testing::record_builder builder(powershell, krabs::id(7942), krabs::version(1));
  15. auto record = builder.pack_incomplete();
  16. krabs::schema schema(record, schema_locator_);
  17. krabs::parser parser(schema);
  18. // The number 8 here comes from the definition of the event in ETW -- we don't have control
  19. // of this.
  20. auto props = parser.properties();
  21. Assert::AreEqual((size_t)std::distance(props.begin(), props.end()), (size_t)8);
  22. }
  23. #if NDEBUG
  24. TEST_METHOD(parse_should_not_throw_when_requesting_wrong_property_type_in_release)
  25. {
  26. krabs::guid powershell(L"{A0C1853B-5C40-4B15-8766-3CF1C58F985A}");
  27. krabs::testing::record_builder builder(powershell, krabs::id(7937), krabs::version(1));
  28. auto record = builder.pack_incomplete();
  29. krabs::schema schema(record, schema_locator_);
  30. krabs::parser parser(schema);
  31. // note, this would be a corrupted result
  32. parser.parse<std::string>(L"ContextInfo");
  33. }
  34. TEST_METHOD(try_parse_should_not_throw_when_requesting_wrong_property_type_in_release)
  35. {
  36. krabs::guid powershell(L"{A0C1853B-5C40-4B15-8766-3CF1C58F985A}");
  37. krabs::testing::record_builder builder(powershell, krabs::id(7937), krabs::version(1));
  38. auto record = builder.pack_incomplete();
  39. krabs::schema schema(record, schema_locator_);
  40. krabs::parser parser(schema);
  41. // note, this would be a corrupted result
  42. std::string result;
  43. Assert::IsTrue(parser.try_parse(L"ContextInfo", result));
  44. }
  45. TEST_METHOD(parse_should_throw_when_requesting_property_with_type_size_mismatch_in_release)
  46. {
  47. krabs::guid powershell(L"{A0C1853B-5C40-4B15-8766-3CF1C58F985A}");
  48. krabs::testing::record_builder builder(powershell, krabs::id(7937), krabs::version(1));
  49. auto record = builder.pack_incomplete();
  50. krabs::schema schema(record, schema_locator_);
  51. krabs::parser parser(schema);
  52. Assert::ExpectException<std::runtime_error>([&]() { parser.parse<int>(L"ContextInfo"); });
  53. }
  54. TEST_METHOD(try_parse_should_return_false_when_requesting_property_with_type_size_mismatch_in_release)
  55. {
  56. krabs::guid powershell(L"{A0C1853B-5C40-4B15-8766-3CF1C58F985A}");
  57. krabs::testing::record_builder builder(powershell, krabs::id(7937), krabs::version(1));
  58. auto record = builder.pack_incomplete();
  59. krabs::schema schema(record, schema_locator_);
  60. krabs::parser parser(schema);
  61. int result = 0;
  62. Assert::IsFalse(parser.try_parse(L"ContextInfo", result));
  63. }
  64. #else
  65. TEST_METHOD(parse_should_throw_type_mismatch_when_requesting_property_with_wrong_type_in_debug)
  66. {
  67. krabs::guid powershell(L"{A0C1853B-5C40-4B15-8766-3CF1C58F985A}");
  68. krabs::testing::record_builder builder(powershell, krabs::id(7937), krabs::version(1));
  69. auto record = builder.pack_incomplete();
  70. krabs::schema schema(record, schema_locator_);
  71. krabs::parser parser(schema);
  72. Assert::ExpectException<krabs::type_mismatch_assert>([&]() { parser.parse<std::string>(L"ContextInfo"); });
  73. }
  74. TEST_METHOD(try_parse_should_throw_mismatch_when_requesting_property_of_wrong_type_in_debug)
  75. {
  76. krabs::guid powershell(L"{A0C1853B-5C40-4B15-8766-3CF1C58F985A}");
  77. krabs::testing::record_builder builder(powershell, krabs::id(7937), krabs::version(1));
  78. auto record = builder.pack_incomplete();
  79. krabs::schema schema(record, schema_locator_);
  80. krabs::parser parser(schema);
  81. std::string result;
  82. Assert::ExpectException<krabs::type_mismatch_assert>([&]() { parser.try_parse(L"ContextInfo", result); });
  83. }
  84. TEST_METHOD(parse_binary_should_return_field_bytes)
  85. {
  86. krabs::guid powershell(L"{A0C1853B-5C40-4B15-8766-3CF1C58F985A}");
  87. krabs::testing::record_builder builder(powershell, krabs::id(7937), krabs::version(1));
  88. builder.add_properties()(L"ContextInfo", L"Testing");
  89. auto record = builder.pack_incomplete();
  90. krabs::schema_locator schema_locator;
  91. krabs::schema schema(record, schema_locator);
  92. krabs::parser parser(schema);
  93. // note: binary doesn't type check
  94. auto data = parser.parse<krabs::binary>(L"ContextInfo");
  95. Assert::AreEqual((size_t)16, data.bytes().size());
  96. Assert::AreEqual((BYTE)'T', data.bytes()[0]);
  97. }
  98. #endif
  99. TEST_METHOD(parse_unicode_string_should_work_when_unicode_string_property_is_last_and_not_null_terminated)
  100. {
  101. std::wstring expectedUrl(L"https://www.foo.com/api/v1/health/check");
  102. krabs::guid httpsys(L"{dd5ef90a-6398-47a4-ad34-4dcecdef795f}");
  103. // httpsys: parse event
  104. krabs::testing::record_builder builder(httpsys, krabs::id(2), 0U, 12, true);
  105. builder.add_properties()
  106. (L"Url", expectedUrl);
  107. auto record = builder.pack_incomplete();
  108. krabs::schema schema(record, schema_locator_);
  109. krabs::parser parser(schema);
  110. auto url = parser.parse<std::wstring>(L"Url");
  111. Assert::AreEqual(expectedUrl, url);
  112. }
  113. TEST_METHOD(parse_unicode_string_should_work_when_unicode_string_property_is_last_and_not_null_terminated_when_previous_properties_were_parsed)
  114. {
  115. std::wstring expectedUrl;
  116. krabs::guid httpsys(L"{dd5ef90a-6398-47a4-ad34-4dcecdef795f}");
  117. // httpsys: parse event
  118. krabs::testing::record_builder builder(httpsys, krabs::id(2), 0U, 12, true);
  119. builder.add_properties()
  120. (L"Url", expectedUrl);
  121. auto record = builder.pack_incomplete();
  122. krabs::schema schema(record, schema_locator_);
  123. krabs::parser parser(schema);
  124. auto requestobj = parser.parse<krabs::binary>(L"RequestObj");
  125. auto httpverb = parser.parse<krabs::binary>(L"HttpVerb");
  126. auto url = parser.parse<std::wstring>(L"Url");
  127. Assert::AreEqual(expectedUrl, url);
  128. }
  129. private:
  130. krabs::schema_locator schema_locator_;
  131. };
  132. }