accessmaptests.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*##############################################################################
  2. Copyright (C) 2021 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifdef _USE_CPPUNIT
  14. #include "AccessMapGenerator.hpp"
  15. #include "EsdlAccessMapGenerator.hpp"
  16. #include "unittests.hpp"
  17. class EsdlAccessMapGeneratorTests : public CppUnit::TestFixture
  18. {
  19. constexpr static const char* primaryScope = "primary";
  20. class MockReporter : public EsdlDefReporter
  21. {
  22. protected:
  23. virtual void reportSelf(Flags flag, const char* component, const char* level, const char* msg) const override {}
  24. };
  25. EsdlAccessMapScopeMapper scopeMapper;
  26. EsdlAccessMapLevelMapper levelMapper;
  27. Owned<EsdlDefReporter> esdlReporter;
  28. CPPUNIT_TEST_SUITE( EsdlAccessMapGeneratorTests );
  29. CPPUNIT_TEST(testVariable_DollarBrace);
  30. CPPUNIT_TEST(testVariable_BraceDollar);
  31. CPPUNIT_TEST(testVariable_Dollar);
  32. CPPUNIT_TEST(testVariable_Brace);
  33. CPPUNIT_TEST_SUITE_END();
  34. public:
  35. using AccessMap = MapStringTo<SecAccessFlags>;
  36. #define GENERATOR \
  37. Owned<AccessMap> accessMap(new AccessMap()); \
  38. EsdlAccessMapReporter reporter(*accessMap, esdlReporter.getLink()); \
  39. EsdlAccessMapGenerator generator(scopeMapper, levelMapper, reporter)
  40. #define GENERATE(test) \
  41. if (!generator.generateMap()) \
  42. { \
  43. fprintf(stdout, "\nTest(%s) map generation failure\n", test); \
  44. CPPUNIT_ASSERT(false); \
  45. }
  46. void testVariable_DollarBrace()
  47. {
  48. GENERATOR;
  49. generator.setVariable("foo", "Bar");
  50. generator.insertScope(primaryScope, "Allow${foo}:Read");
  51. GENERATE("variable-${}");
  52. evaluateAccessMap("variable-${}", *accessMap, {{"AllowBar", SecAccess_Read}});
  53. }
  54. void testVariable_BraceDollar()
  55. {
  56. GENERATOR;
  57. generator.setVariable("foo", "Bar");
  58. generator.insertScope(primaryScope, "Allow{$foo}:Read");
  59. GENERATE("variable-{$}");
  60. evaluateAccessMap("variable-{$}", *accessMap, {{"AllowBar", SecAccess_Read}});
  61. }
  62. void testVariable_Dollar()
  63. {
  64. GENERATOR;
  65. generator.setVariable("foo", "Bar");
  66. generator.insertScope(primaryScope, "Allow$foo:Read");
  67. GENERATE("variable-${}");
  68. evaluateAccessMap("variable-${}", *accessMap, {{"Allow$foo", SecAccess_Read}});
  69. }
  70. void testVariable_Brace()
  71. {
  72. GENERATOR;
  73. generator.setVariable("foo", "Bar");
  74. generator.insertScope(primaryScope, "Allow{foo}:Read");
  75. GENERATE("variable-{$}");
  76. evaluateAccessMap("variable-{$}", *accessMap, {{"Allow{foo}", SecAccess_Read}});
  77. }
  78. EsdlAccessMapGeneratorTests()
  79. : scopeMapper({ primaryScope })
  80. , esdlReporter(new MockReporter())
  81. {
  82. }
  83. void evaluateAccessMap(const char* test, AccessMap& actual, const std::map<std::string, SecAccessFlags>& expected)
  84. {
  85. bool pass = true;
  86. if (actual.ordinality() != expected.size())
  87. {
  88. fprintf(stdout, "\nTest(%s) expected %zu map entries but got %u.\n", test, expected.size(), actual.ordinality());
  89. pass = false;
  90. }
  91. std::set<std::string> matchedKeys;
  92. HashIterator it(actual);
  93. ForEach(it)
  94. {
  95. IMapping& cur = it.query();
  96. const char* key = (const char*)cur.getKey();
  97. SecAccessFlags actualFlags = (actual.getValue(key) ? *actual.getValue(key) : SecAccess_Unavailable);
  98. if (expected.count(key) == 0)
  99. {
  100. fprintf(stdout, "\nTest(%s) unexpected %s:%s\n", test, key, getSecAccessFlagName(actualFlags));
  101. pass = false;
  102. }
  103. else
  104. {
  105. SecAccessFlags expectedFlags = expected.find(key)->second;
  106. if (actualFlags != expectedFlags)
  107. {
  108. fprintf(stdout, "\nTest(%s) feature %s expected flags %s but got %s.\n", test, key, getSecAccessFlagName(expectedFlags), getSecAccessFlagName(actualFlags));
  109. pass = false;
  110. }
  111. matchedKeys.insert(key);
  112. }
  113. }
  114. if (matchedKeys.size() != expected.size())
  115. {
  116. for (auto& e : expected)
  117. {
  118. if (matchedKeys.find(e.first) == matchedKeys.end())
  119. {
  120. fprintf(stdout, "\nTest(%s) expected %s:%s", test, e.first.c_str(), getSecAccessFlagName(e.second));
  121. pass = false;
  122. }
  123. }
  124. }
  125. CPPUNIT_ASSERT(pass);
  126. }
  127. };
  128. CPPUNIT_TEST_SUITE_REGISTRATION( EsdlAccessMapGeneratorTests );
  129. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( EsdlAccessMapGeneratorTests, "esdlaccessmapgeneratortests" );
  130. #endif // _USE_CPPUNIT