Implement listing Policies in Storage 50/31050/7
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Sat, 29 Nov 2014 23:46:28 +0000 (00:46 +0100)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Mon, 15 Dec 2014 14:37:32 +0000 (15:37 +0100)
Implement listPolicies() in Storage and InMemoryStorageBackend.
UnitTests for Storage::listPolicies() were added.

Change-Id: I113c3c0f9b5c1d1d5cbed44e3d23d5d7e489a227

src/common/types/PolicyBucket.cpp
src/common/types/PolicyBucket.h
src/storage/InMemoryStorageBackend.cpp
src/storage/InMemoryStorageBackend.h
src/storage/Storage.cpp
src/storage/Storage.h
src/storage/StorageBackend.h
test/storage/storage/fakestoragebackend.h
test/storage/storage/policies.cpp

index 622bc05..052ac35 100644 (file)
@@ -89,6 +89,16 @@ void PolicyBucket::deletePolicy(std::function<bool(PolicyPtr)> predicate) {
     }
 }
 
+PolicyBucket::Policies PolicyBucket::listPolicies(const PolicyKey &filter) const {
+    PolicyBucket::Policies policies;
+    for (auto iter = m_policyCollection.begin(); iter != m_policyCollection.end(); ++iter) {
+        auto &policyPtr = iter->second;
+        if (policyPtr->key().matchFilter(filter))
+            policies.push_back(*policyPtr);
+    }
+    return policies;
+}
+
 PolicyMap PolicyBucket::makePolicyMap(const PolicyCollection &policies) {
     PolicyMap result;
     for (const auto &policy : policies) {
index df57d0f..262c7d3 100644 (file)
@@ -28,6 +28,7 @@
 #include <algorithm>
 #include <memory>
 #include <string>
+#include <vector>
 
 #include <exceptions/NotImplementedException.h>
 #include <types/pointers.h>
@@ -47,6 +48,7 @@ public:
 
     typedef PolicyCollection::value_type value_type;
     typedef const_policy_iterator const_iterator;
+    typedef std::vector<Policy> Policies;
 
     // TODO: Review usefulness of ctors
     //delete default constructor in order to prevent creation of buckets with no id
@@ -62,6 +64,7 @@ public:
     PolicyBucket filtered(const PolicyKey &key) const;
     void insertPolicy(PolicyPtr policy);
     void deletePolicy(const PolicyKey &key);
+    Policies listPolicies(const PolicyKey &filter) const;
 
     // TODO: Try to change interface, so this method is not needed
     void deletePolicy(std::function<bool(PolicyPtr)> predicate);
index a2366e8..bc3d01a 100644 (file)
@@ -201,6 +201,16 @@ void InMemoryStorageBackend::deleteLinking(const PolicyBucketId &bucketId) {
     }
 }
 
+PolicyBucket::Policies InMemoryStorageBackend::listPolicies(const PolicyBucketId &bucketId,
+                                                            const PolicyKey &filter) const {
+    try {
+        auto &bucket = buckets().at(bucketId);
+        return bucket.listPolicies(filter);
+    } catch (const std::out_of_range &) {
+        throw BucketNotExistsException(bucketId);
+    }
+}
+
 void InMemoryStorageBackend::openFileStream(std::shared_ptr<std::ifstream> stream,
                                             const std::string &filename) {
     // TODO: Consider adding exceptions to streams and handling them:
index d03dd6c..07f7fcd 100644 (file)
@@ -58,6 +58,8 @@ public:
     virtual bool hasBucket(const PolicyBucketId &bucketId);
     virtual void deletePolicy(const PolicyBucketId &bucketId, const PolicyKey &key);
     virtual void deleteLinking(const PolicyBucketId &bucketId);
+    virtual PolicyBucket::Policies listPolicies(const PolicyBucketId &bucketId,
+                                                const PolicyKey &filter) const;
 
 protected:
     InMemoryStorageBackend() {}
@@ -80,6 +82,9 @@ protected:
     virtual Buckets &buckets(void) {
         return m_buckets;
     }
+    virtual const Buckets &buckets(void) const {
+        return m_buckets;
+    }
 };
 
 } /* namespace Cynara */
index aa9bc93..fafb374 100644 (file)
@@ -154,6 +154,11 @@ void Storage::deletePolicies(const std::map<PolicyBucketId, std::vector<PolicyKe
     }
 }
 
+PolicyBucket::Policies Storage::listPolicies(const PolicyBucketId &bucketId,
+                                             const PolicyKey &filter) const {
+    return m_backend.listPolicies(bucketId, filter);
+}
+
 void Storage::load(void) {
     m_backend.load();
 }
index c89ea40..838bdb7 100644 (file)
@@ -53,6 +53,9 @@ public:
     void addOrUpdateBucket(const PolicyBucketId &bucketId, const PolicyResult &defaultBucketPolicy);
     void deleteBucket(const PolicyBucketId &bucketId);
 
+    PolicyBucket::Policies listPolicies(const PolicyBucketId &bucketId,
+                                        const PolicyKey &filter) const;
+
     void load(void);
     void save(void);
 
index 4ef66c2..5bb4e61 100644 (file)
@@ -52,7 +52,8 @@ public:
 
     virtual void deletePolicy(const PolicyBucketId &bucketId, const PolicyKey &key) = 0;
     virtual void deleteLinking(const PolicyBucketId &bucket) = 0;
-
+    virtual PolicyBucket::Policies listPolicies(const PolicyBucketId &bucketId,
+                                                const PolicyKey &filter) const = 0;
     virtual void load(void) = 0;
     virtual void save(void) = 0;
 };
index 3192e46..86bfd30 100644 (file)
@@ -42,8 +42,8 @@ public:
     MOCK_METHOD2(deletePolicy, void(const PolicyBucketId &bucketId, const PolicyKey &key));
     MOCK_METHOD1(deleteLinking, void(const PolicyBucketId &bucket));
     MOCK_METHOD2(insertPolicy, void(const PolicyBucketId &bucketId, PolicyPtr policy));
+    MOCK_CONST_METHOD2(listPolicies, PolicyBucket::Policies(const PolicyBucketId &bucketId,
+                                                            const PolicyKey &filter));
 };
 
-
-
 #endif /* FAKESTORAGEBACKEND_H_ */
index 8d72dde..8b44cdb 100644 (file)
@@ -167,3 +167,40 @@ TEST(storage, insertPointingToNonexistentBucket) {
 
     ASSERT_THROW(storage.insertPolicies(policiesToInsert), BucketNotExistsException);
 }
+
+TEST(storage, listPolicies) {
+    using ::testing::Return;
+    using PredefinedPolicyType::DENY;
+
+    FakeStorageBackend backend;
+    Storage storage(backend);
+
+    PolicyBucketId testBucket("test-bucket");
+    PolicyResult defaultPolicy(PredefinedPolicyType::DENY);
+
+    EXPECT_CALL(backend, hasBucket(testBucket)).WillOnce(Return(false));
+    EXPECT_CALL(backend, createBucket(testBucket, defaultPolicy)).WillOnce(Return());
+    storage.addOrUpdateBucket(testBucket, defaultPolicy);
+
+    PolicyKey filter = Helpers::generatePolicyKey("1");
+    EXPECT_CALL(backend, listPolicies(testBucket, filter))
+    .WillOnce(Return(PolicyBucket::Policies()));
+
+    storage.listPolicies(testBucket, filter);
+}
+
+TEST(storage, listPoliciesFromNonexistentBucket) {
+    using ::testing::Return;
+    using PredefinedPolicyType::DENY;
+
+    FakeStorageBackend backend;
+    Storage storage(backend);
+
+    PolicyBucketId testBucket("test-bucket");
+    PolicyResult defaultPolicy(PredefinedPolicyType::DENY);
+    PolicyKey filter = Helpers::generatePolicyKey("1");
+    EXPECT_CALL(backend, listPolicies(testBucket, filter))
+    .WillOnce(Return(PolicyBucket::Policies()));
+
+    storage.listPolicies(testBucket, filter);
+}