Update AccessBlackListManager interface

Added callback into Unblock method as this method also will save data.
Added IsBlocked method.
Added short explanation of how rules will work.

BUG:25777658
BUG:25776798
Change-Id: I69b4575be261a0d54435bf07d95e6ac11290a1c7
Reviewed-on: https://weave-review.googlesource.com/2275
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/src/access_api_handler.cc b/src/access_api_handler.cc
index e03a548..9fa6df2 100644
--- a/src/access_api_handler.cc
+++ b/src/access_api_handler.cc
@@ -178,13 +178,9 @@
     return;
   }
 
-  if (!manager_->Unblock(user_id, app_id, &error)) {
-    command->Abort(error.get(), nullptr);
-    return;
-  }
-
-  UpdateState();
-  command->Complete({}, nullptr);
+  manager_->Unblock(user_id, app_id,
+                    base::Bind(&AccessApiHandler::OnCommandDone,
+                               weak_ptr_factory_.GetWeakPtr(), cmd));
 }
 
 void AccessApiHandler::List(const std::weak_ptr<Command>& cmd) {
diff --git a/src/access_api_handler_unittest.cc b/src/access_api_handler_unittest.cc
index 44c83e2..a142735 100644
--- a/src/access_api_handler_unittest.cc
+++ b/src/access_api_handler_unittest.cc
@@ -29,9 +29,12 @@
                     const base::Time&,
                     const DoneCallback&));
   MOCK_METHOD3(Unblock,
-               bool(const std::vector<uint8_t>&,
+               void(const std::vector<uint8_t>&,
                     const std::vector<uint8_t>&,
-                    ErrorPtr*));
+                    const DoneCallback&));
+  MOCK_CONST_METHOD2(IsBlocked,
+                     bool(const std::vector<uint8_t>&,
+                          const std::vector<uint8_t>&));
   MOCK_CONST_METHOD0(GetEntries, std::vector<Entry>());
   MOCK_CONST_METHOD0(GetSize, size_t());
   MOCK_CONST_METHOD0(GetCapacity, size_t());
@@ -203,7 +206,8 @@
 TEST_F(AccessApiHandlerTest, Unblock) {
   EXPECT_CALL(access_manager_, Unblock(std::vector<uint8_t>{1, 2, 3},
                                        std::vector<uint8_t>{3, 4, 5}, _))
-      .WillOnce(Return(true));
+      .WillOnce(WithArgs<2>(
+          Invoke([](const DoneCallback& callback) { callback.Run(nullptr); })));
   EXPECT_CALL(access_manager_, GetSize()).WillRepeatedly(Return(4));
 
   AddCommand(R"({
diff --git a/src/access_black_list_manager.h b/src/access_black_list_manager.h
index ed30839..b56226a 100644
--- a/src/access_black_list_manager.h
+++ b/src/access_black_list_manager.h
@@ -14,8 +14,14 @@
 class AccessBlackListManager {
  public:
   struct Entry {
+    // user_id is empty, app_id is empty: block everything.
+    // user_id is not empty, app_id is empty: block if user_id matches.
+    // user_id is empty, app_id is not empty: block if app_id matches.
+    // user_id is not empty, app_id is not empty: block if both match.
     std::vector<uint8_t> user_id;
     std::vector<uint8_t> app_id;
+
+    // Time after which to discard the rule.
     base::Time expiration;
   };
   virtual ~AccessBlackListManager() = default;
@@ -24,14 +30,27 @@
                      const std::vector<uint8_t>& app_id,
                      const base::Time& expiration,
                      const DoneCallback& callback) = 0;
-  virtual bool Unblock(const std::vector<uint8_t>& user_id,
+  virtual void Unblock(const std::vector<uint8_t>& user_id,
                        const std::vector<uint8_t>& app_id,
-                       ErrorPtr* error) = 0;
+                       const DoneCallback& callback) = 0;
+  virtual bool IsBlocked(const std::vector<uint8_t>& user_id,
+                         const std::vector<uint8_t>& app_id) const = 0;
   virtual std::vector<Entry> GetEntries() const = 0;
   virtual size_t GetSize() const = 0;
   virtual size_t GetCapacity() const = 0;
 };
 
+inline bool operator==(const AccessBlackListManager::Entry& l,
+                       const AccessBlackListManager::Entry& r) {
+  return l.user_id == r.user_id && l.app_id == r.app_id &&
+         l.expiration == r.expiration;
+}
+
+inline bool operator!=(const AccessBlackListManager::Entry& l,
+                       const AccessBlackListManager::Entry& r) {
+  return !(l == r);
+}
+
 }  // namespace weave
 
 #endif  // LIBWEAVE_SRC_ACCESS_BLACK_LIST_H_