PageRenderTime 24ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 1ms

/test/storage/serializer/deserialize.cpp

https://gitlab.com/admin-github-cloud/cynara
C++ | 199 lines | 126 code | 43 blank | 30 comment | 1 complexity | 3a3ce7432b3ebf90eb004de65afec21e MD5 | raw file
  1. /*
  2. * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /**
  17. * @file test/storage/serializer/deserialize.cpp
  18. * @author Aleksander Zdyb <a.zdyb@samsung.com>
  19. * @version 1.0
  20. * @brief Tests for Cynara::StorageDeserializer
  21. */
  22. #include <istream>
  23. #include <memory>
  24. #include <tuple>
  25. #include <gmock/gmock.h>
  26. #include <gtest/gtest.h>
  27. #include <exceptions/BucketDeserializationException.h>
  28. #include <storage/Buckets.h>
  29. #include <storage/StorageDeserializer.h>
  30. #include <types/PolicyBucket.h>
  31. MATCHER_P(PolicyBucketIdPolicyEq, expected, "") {
  32. auto bucket1 = expected.second;
  33. auto bucket2 = arg.second;
  34. return std::tie(expected.first, bucket1.id(), bucket1.defaultPolicy())
  35. == std::tie(arg.first, bucket2.id(), bucket2.defaultPolicy());
  36. }
  37. #define COMPARE_BUCKETS(id, bucket) \
  38. PolicyBucketIdPolicyEq(std::pair<PolicyBucketId, PolicyBucket>((id), (bucket)))
  39. class FakeStreamForBucketId {
  40. public:
  41. MOCK_METHOD1(streamForBucketId,
  42. std::shared_ptr<Cynara::BucketDeserializer>(const std::string &));
  43. };
  44. class EmptyBucketDeserializer : public Cynara::BucketDeserializer {
  45. public:
  46. EmptyBucketDeserializer()
  47. : Cynara::BucketDeserializer(std::make_shared<std::istringstream>("")) {}
  48. };
  49. class StorageDeserializerFixture : public ::testing::Test {
  50. public:
  51. std::shared_ptr<Cynara::BucketDeserializer> emptyBucketStream() const {
  52. return std::make_shared<EmptyBucketDeserializer>();
  53. }
  54. Cynara::StorageDeserializer::BucketStreamOpener nullStreamOpener =
  55. [this] (const std::string &) -> std::shared_ptr<Cynara::BucketDeserializer> {
  56. return emptyBucketStream();
  57. };
  58. };
  59. using namespace Cynara;
  60. TEST_F(StorageDeserializerFixture, init_default_only) {
  61. using ::testing::UnorderedElementsAre;
  62. auto ss = std::make_shared<std::istringstream>(";0");
  63. StorageDeserializer deserializer(ss, nullStreamOpener);
  64. Buckets buckets;
  65. deserializer.initBuckets(buckets);
  66. ASSERT_THAT(buckets, UnorderedElementsAre(
  67. COMPARE_BUCKETS("", PolicyBucket("", PredefinedPolicyType::DENY))
  68. ));
  69. }
  70. TEST_F(StorageDeserializerFixture, init_more) {
  71. using ::testing::UnorderedElementsAre;
  72. auto ss = std::make_shared<std::istringstream>(";0\n"
  73. "bucket2;0\n"
  74. "bucket3;0xFFFE;bucket2\n");
  75. StorageDeserializer deserializer(ss, nullStreamOpener);
  76. Buckets buckets;
  77. deserializer.initBuckets(buckets);
  78. ASSERT_THAT(buckets, UnorderedElementsAre(
  79. COMPARE_BUCKETS("", PolicyBucket("", PredefinedPolicyType::DENY)),
  80. COMPARE_BUCKETS("bucket2", PolicyBucket("bucket2", PredefinedPolicyType::DENY)),
  81. COMPARE_BUCKETS("bucket3", PolicyBucket("bucket3",
  82. PolicyResult(PredefinedPolicyType::BUCKET, "bucket2")))
  83. ));
  84. }
  85. // Add bucket and check, if it's overwritten if exists in file
  86. TEST_F(StorageDeserializerFixture, init_overwrite) {
  87. using ::testing::UnorderedElementsAre;
  88. auto ss = std::make_shared<std::istringstream>(";0x0");
  89. StorageDeserializer deserializer(ss, nullStreamOpener);
  90. Buckets buckets;
  91. // Default bucket has ALLOW policy as default
  92. buckets.insert({ "", PolicyBucket("fakeId", PredefinedPolicyType::ALLOW) });
  93. deserializer.initBuckets(buckets);
  94. // Check, if default bucket has now DENY as default policy, which would be read from stream
  95. ASSERT_THAT(buckets, UnorderedElementsAre(
  96. COMPARE_BUCKETS("", PolicyBucket("", PredefinedPolicyType::DENY))
  97. ));
  98. }
  99. TEST_F(StorageDeserializerFixture, load_buckets_plus_policies) {
  100. using ::testing::Pointee;
  101. using ::testing::Return;
  102. using ::testing::UnorderedElementsAre;
  103. Buckets buckets;
  104. buckets.insert({ "", PolicyBucket("", PredefinedPolicyType::DENY) });
  105. FakeStreamForBucketId streamOpener;
  106. auto streamOpenerFunc = std::bind(&FakeStreamForBucketId::streamForBucketId, &streamOpener,
  107. std::placeholders::_1);
  108. StorageDeserializer deserializer(nullptr, streamOpenerFunc);
  109. auto defaultBucketStream = std::make_shared<std::istringstream>("c;u;p;0;meta");
  110. auto bucketDeserializer = std::make_shared<BucketDeserializer>(defaultBucketStream);
  111. EXPECT_CALL(streamOpener, streamForBucketId(""))
  112. .WillOnce(Return(bucketDeserializer));
  113. deserializer.loadBuckets(buckets);
  114. // Check if pre-inserted bucket is still there
  115. ASSERT_THAT(buckets, UnorderedElementsAre(
  116. COMPARE_BUCKETS("", PolicyBucket("", PredefinedPolicyType::DENY))
  117. ));
  118. // Check policy was inserted into bucket
  119. ASSERT_THAT(buckets.at(""), UnorderedElementsAre(
  120. Pointee(Policy(PolicyKey("c", "u", "p"), PolicyResult(PredefinedPolicyType::DENY, "meta")))
  121. ));
  122. }
  123. TEST_F(StorageDeserializerFixture, load_buckets) {
  124. using ::testing::Return;
  125. // Pre-insert some buckets
  126. Buckets buckets;
  127. buckets.insert({ "", PolicyBucket("", PredefinedPolicyType::DENY) });
  128. buckets.insert({ "bucket1", PolicyBucket("bucket1", PredefinedPolicyType::DENY) });
  129. buckets.insert({ "bucket2", PolicyBucket("bucket2", PredefinedPolicyType::DENY) });
  130. FakeStreamForBucketId streamOpener;
  131. auto streamOpenerFunc = std::bind(&FakeStreamForBucketId::streamForBucketId, &streamOpener,
  132. std::placeholders::_1);
  133. StorageDeserializer deserializer(nullptr, streamOpenerFunc);
  134. // Check, if streamOpener was called for each bucket
  135. EXPECT_CALL(streamOpener, streamForBucketId(""))
  136. .WillOnce(Return(emptyBucketStream()));
  137. EXPECT_CALL(streamOpener, streamForBucketId("bucket1"))
  138. .WillOnce(Return(emptyBucketStream()));
  139. EXPECT_CALL(streamOpener, streamForBucketId("bucket2"))
  140. .WillOnce(Return(emptyBucketStream()));
  141. deserializer.loadBuckets(buckets);
  142. }
  143. TEST_F(StorageDeserializerFixture, load_buckets_io_error) {
  144. using ::testing::Return;
  145. // Pre-insert some buckets
  146. Buckets buckets;
  147. buckets.insert({ "", PolicyBucket("", PredefinedPolicyType::DENY) });
  148. FakeStreamForBucketId streamOpener;
  149. auto streamOpenerFunc = std::bind(&FakeStreamForBucketId::streamForBucketId, &streamOpener,
  150. std::placeholders::_1);
  151. StorageDeserializer deserializer(nullptr, streamOpenerFunc);
  152. // Check, if streamOpener was called for each bucket
  153. EXPECT_CALL(streamOpener, streamForBucketId(""))
  154. .WillOnce(Return(nullptr));
  155. ASSERT_THROW(deserializer.loadBuckets(buckets), BucketDeserializationException);
  156. }