Home | History | Annotate | Download | only in src
      1 // Copyright 2016 The Weave Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/access_black_list_manager_impl.h"
      6 
      7 #include <gmock/gmock.h>
      8 #include <gtest/gtest.h>
      9 #include <weave/provider/test/mock_config_store.h>
     10 #include <weave/test/unittest_utils.h>
     11 
     12 #include "src/test/mock_clock.h"
     13 #include "src/bind_lambda.h"
     14 
     15 using testing::_;
     16 using testing::Return;
     17 using testing::StrictMock;
     18 
     19 namespace weave {
     20 
     21 class AccessBlackListManagerImplTest : public testing::Test {
     22  protected:
     23   void SetUp() {
     24     std::string to_load = R"([{
     25       "user": "BQID",
     26       "app": "BwQF",
     27       "expiration": 1410000000
     28     }, {
     29       "user": "AQID",
     30       "app": "AwQF",
     31       "expiration": 1419999999
     32     }])";
     33 
     34     EXPECT_CALL(config_store_, LoadSettings("black_list"))
     35         .WillOnce(Return(to_load));
     36 
     37     EXPECT_CALL(config_store_, SaveSettings("black_list", _, _))
     38         .WillOnce(testing::WithArgs<1, 2>(testing::Invoke(
     39             [](const std::string& json, const DoneCallback& callback) {
     40               std::string to_save = R"([{
     41                 "user": "AQID",
     42                 "app": "AwQF",
     43                 "expiration": 1419999999
     44               }])";
     45               EXPECT_JSON_EQ(to_save, *test::CreateValue(json));
     46               if (!callback.is_null())
     47                 callback.Run(nullptr);
     48             })));
     49 
     50     EXPECT_CALL(clock_, Now())
     51         .WillRepeatedly(Return(base::Time::FromTimeT(1412121212)));
     52     manager_.reset(new AccessBlackListManagerImpl{&config_store_, 10, &clock_});
     53   }
     54   StrictMock<test::MockClock> clock_;
     55   StrictMock<provider::test::MockConfigStore> config_store_{false};
     56   std::unique_ptr<AccessBlackListManagerImpl> manager_;
     57 };
     58 
     59 TEST_F(AccessBlackListManagerImplTest, Init) {
     60   EXPECT_EQ(1u, manager_->GetSize());
     61   EXPECT_EQ(10u, manager_->GetCapacity());
     62   EXPECT_EQ((std::vector<AccessBlackListManagerImpl::Entry>{{
     63                 {1, 2, 3}, {3, 4, 5}, base::Time::FromTimeT(1419999999),
     64             }}),
     65             manager_->GetEntries());
     66 }
     67 
     68 TEST_F(AccessBlackListManagerImplTest, Block) {
     69   EXPECT_CALL(config_store_, SaveSettings("black_list", _, _))
     70       .WillOnce(testing::WithArgs<1, 2>(testing::Invoke(
     71           [](const std::string& json, const DoneCallback& callback) {
     72             std::string to_save = R"([{
     73                 "user": "AQID",
     74                 "app": "AwQF",
     75                 "expiration": 1419999999
     76               }, {
     77                 "app": "CAgI",
     78                 "user": "BwcH",
     79                 "expiration": 1419990000
     80               }])";
     81             EXPECT_JSON_EQ(to_save, *test::CreateValue(json));
     82             if (!callback.is_null())
     83               callback.Run(nullptr);
     84           })));
     85   manager_->Block({7, 7, 7}, {8, 8, 8}, base::Time::FromTimeT(1419990000), {});
     86 }
     87 
     88 TEST_F(AccessBlackListManagerImplTest, BlockExpired) {
     89   manager_->Block({}, {}, base::Time::FromTimeT(1400000000),
     90                   base::Bind([](ErrorPtr error) {
     91                     EXPECT_TRUE(error->HasError("aleady_expired"));
     92                   }));
     93 }
     94 
     95 TEST_F(AccessBlackListManagerImplTest, BlockListIsFull) {
     96   EXPECT_CALL(config_store_, SaveSettings("black_list", _, _))
     97       .WillRepeatedly(testing::WithArgs<1, 2>(testing::Invoke(
     98           [](const std::string& json, const DoneCallback& callback) {
     99             if (!callback.is_null())
    100               callback.Run(nullptr);
    101           })));
    102   for (size_t i = manager_->GetSize(); i < manager_->GetCapacity(); ++i) {
    103     manager_->Block(
    104         {99, static_cast<uint8_t>(i / 256), static_cast<uint8_t>(i % 256)},
    105         {8, 8, 8}, base::Time::FromTimeT(1419990000), {});
    106     EXPECT_EQ(i + 1, manager_->GetSize());
    107   }
    108   manager_->Block({99}, {8, 8, 8}, base::Time::FromTimeT(1419990000),
    109                   base::Bind([](ErrorPtr error) {
    110                     EXPECT_TRUE(error->HasError("blacklist_is_full"));
    111                   }));
    112 }
    113 
    114 TEST_F(AccessBlackListManagerImplTest, Unblock) {
    115   EXPECT_CALL(config_store_, SaveSettings("black_list", _, _))
    116       .WillOnce(testing::WithArgs<1, 2>(testing::Invoke(
    117           [](const std::string& json, const DoneCallback& callback) {
    118             EXPECT_JSON_EQ("[]", *test::CreateValue(json));
    119             if (!callback.is_null())
    120               callback.Run(nullptr);
    121           })));
    122   manager_->Unblock({1, 2, 3}, {3, 4, 5}, {});
    123 }
    124 
    125 TEST_F(AccessBlackListManagerImplTest, UnblockNotFound) {
    126   manager_->Unblock({5, 2, 3}, {5, 4, 5}, base::Bind([](ErrorPtr error) {
    127                       EXPECT_TRUE(error->HasError("entry_not_found"));
    128                     }));
    129 }
    130 
    131 TEST_F(AccessBlackListManagerImplTest, IsBlockedFalse) {
    132   EXPECT_FALSE(manager_->IsBlocked({7, 7, 7}, {8, 8, 8}));
    133 }
    134 
    135 class AccessBlackListManagerImplIsBlockedTest
    136     : public AccessBlackListManagerImplTest,
    137       public testing::WithParamInterface<
    138           std::tuple<std::vector<uint8_t>, std::vector<uint8_t>>> {
    139  public:
    140   void SetUp() override {
    141     AccessBlackListManagerImplTest::SetUp();
    142     EXPECT_CALL(config_store_, SaveSettings("black_list", _, _))
    143         .WillOnce(testing::WithArgs<2>(
    144             testing::Invoke([](const DoneCallback& callback) {
    145               if (!callback.is_null())
    146                 callback.Run(nullptr);
    147             })));
    148     manager_->Block(std::get<0>(GetParam()), std::get<1>(GetParam()),
    149                     base::Time::FromTimeT(1419990000), {});
    150   }
    151 };
    152 
    153 TEST_P(AccessBlackListManagerImplIsBlockedTest, IsBlocked) {
    154   EXPECT_TRUE(manager_->IsBlocked({7, 7, 7}, {8, 8, 8}));
    155 }
    156 
    157 INSTANTIATE_TEST_CASE_P(
    158     Filters,
    159     AccessBlackListManagerImplIsBlockedTest,
    160     testing::Combine(testing::Values(std::vector<uint8_t>{},
    161                                      std::vector<uint8_t>{7, 7, 7}),
    162                      testing::Values(std::vector<uint8_t>{},
    163                                      std::vector<uint8_t>{8, 8, 8})));
    164 
    165 }  // namespace weave
    166