Home | History | Annotate | Download | only in policy_hack
      1 // Copyright (c) 2012 The Chromium 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 "base/basictypes.h"
      6 #include "base/bind.h"
      7 #include "base/message_loop/message_loop.h"
      8 #include "base/run_loop.h"
      9 #include "base/synchronization/waitable_event.h"
     10 #include "remoting/host/dns_blackhole_checker.h"
     11 #include "remoting/host/policy_hack/fake_policy_watcher.h"
     12 #include "remoting/host/policy_hack/mock_policy_callback.h"
     13 #include "remoting/host/policy_hack/policy_watcher.h"
     14 #include "testing/gmock/include/gmock/gmock.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 namespace remoting {
     18 namespace policy_hack {
     19 
     20 class PolicyWatcherTest : public testing::Test {
     21  public:
     22   PolicyWatcherTest() {
     23   }
     24 
     25   virtual void SetUp() OVERRIDE {
     26     message_loop_proxy_ = base::MessageLoopProxy::current();
     27     policy_callback_ = base::Bind(&MockPolicyCallback::OnPolicyUpdate,
     28                                   base::Unretained(&mock_policy_callback_));
     29     policy_watcher_.reset(new FakePolicyWatcher(message_loop_proxy_));
     30     nat_true_.SetBoolean(PolicyWatcher::kNatPolicyName, true);
     31     nat_false_.SetBoolean(PolicyWatcher::kNatPolicyName, false);
     32     nat_one_.SetInteger(PolicyWatcher::kNatPolicyName, 1);
     33     domain_empty_.SetString(PolicyWatcher::kHostDomainPolicyName,
     34                             std::string());
     35     domain_full_.SetString(PolicyWatcher::kHostDomainPolicyName, kHostDomain);
     36     SetDefaults(nat_true_others_default_);
     37     nat_true_others_default_.SetBoolean(PolicyWatcher::kNatPolicyName, true);
     38     SetDefaults(nat_false_others_default_);
     39     nat_false_others_default_.SetBoolean(PolicyWatcher::kNatPolicyName, false);
     40     SetDefaults(domain_empty_others_default_);
     41     domain_empty_others_default_.SetString(PolicyWatcher::kHostDomainPolicyName,
     42                                            std::string());
     43     SetDefaults(domain_full_others_default_);
     44     domain_full_others_default_.SetString(PolicyWatcher::kHostDomainPolicyName,
     45                                           kHostDomain);
     46     nat_true_domain_empty_.SetBoolean(PolicyWatcher::kNatPolicyName, true);
     47     nat_true_domain_empty_.SetString(PolicyWatcher::kHostDomainPolicyName,
     48                                      std::string());
     49     nat_true_domain_full_.SetBoolean(PolicyWatcher::kNatPolicyName, true);
     50     nat_true_domain_full_.SetString(PolicyWatcher::kHostDomainPolicyName,
     51                                    kHostDomain);
     52     nat_false_domain_empty_.SetBoolean(PolicyWatcher::kNatPolicyName, false);
     53     nat_false_domain_empty_.SetString(PolicyWatcher::kHostDomainPolicyName,
     54                                       std::string());
     55     nat_false_domain_full_.SetBoolean(PolicyWatcher::kNatPolicyName, false);
     56     nat_false_domain_full_.SetString(PolicyWatcher::kHostDomainPolicyName,
     57                                     kHostDomain);
     58     SetDefaults(nat_true_domain_empty_others_default_);
     59     nat_true_domain_empty_others_default_.SetBoolean(
     60         PolicyWatcher::kNatPolicyName, true);
     61     nat_true_domain_empty_others_default_.SetString(
     62         PolicyWatcher::kHostDomainPolicyName, std::string());
     63     unknown_policies_.SetString("UnknownPolicyOne", std::string());
     64     unknown_policies_.SetString("UnknownPolicyTwo", std::string());
     65 
     66     const char kOverrideNatTraversalToFalse[] =
     67       "{ \"RemoteAccessHostFirewallTraversal\": false }";
     68     nat_true_and_overridden_.SetBoolean(PolicyWatcher::kNatPolicyName, true);
     69     nat_true_and_overridden_.SetString(
     70         PolicyWatcher::kHostDebugOverridePoliciesName,
     71         kOverrideNatTraversalToFalse);
     72     pairing_true_.SetBoolean(PolicyWatcher::kHostAllowClientPairing, true);
     73     pairing_false_.SetBoolean(PolicyWatcher::kHostAllowClientPairing, false);
     74     gnubby_auth_true_.SetBoolean(PolicyWatcher::kHostAllowGnubbyAuthPolicyName,
     75                                  true);
     76     gnubby_auth_false_.SetBoolean(PolicyWatcher::kHostAllowGnubbyAuthPolicyName,
     77                                  false);
     78     relay_true_.SetBoolean(PolicyWatcher::kRelayPolicyName, true);
     79     relay_false_.SetBoolean(PolicyWatcher::kRelayPolicyName, false);
     80     port_range_full_.SetString(PolicyWatcher::kUdpPortRangePolicyName,
     81                                kPortRange);
     82     port_range_empty_.SetString(PolicyWatcher::kUdpPortRangePolicyName,
     83                                 std::string());
     84 
     85 #if !defined(NDEBUG)
     86     SetDefaults(nat_false_overridden_others_default_);
     87     nat_false_overridden_others_default_.SetBoolean(
     88         PolicyWatcher::kNatPolicyName, false);
     89     nat_false_overridden_others_default_.SetString(
     90         PolicyWatcher::kHostDebugOverridePoliciesName,
     91         kOverrideNatTraversalToFalse);
     92 #endif
     93   }
     94 
     95  protected:
     96   void StartWatching() {
     97     policy_watcher_->StartWatching(policy_callback_);
     98     base::RunLoop().RunUntilIdle();
     99   }
    100 
    101   void StopWatching() {
    102     base::WaitableEvent stop_event(false, false);
    103     policy_watcher_->StopWatching(&stop_event);
    104     base::RunLoop().RunUntilIdle();
    105     EXPECT_EQ(true, stop_event.IsSignaled());
    106   }
    107 
    108   static const char* kHostDomain;
    109   static const char* kPortRange;
    110   base::MessageLoop message_loop_;
    111   scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
    112   MockPolicyCallback mock_policy_callback_;
    113   PolicyWatcher::PolicyCallback policy_callback_;
    114   scoped_ptr<FakePolicyWatcher> policy_watcher_;
    115   base::DictionaryValue empty_;
    116   base::DictionaryValue nat_true_;
    117   base::DictionaryValue nat_false_;
    118   base::DictionaryValue nat_one_;
    119   base::DictionaryValue domain_empty_;
    120   base::DictionaryValue domain_full_;
    121   base::DictionaryValue nat_true_others_default_;
    122   base::DictionaryValue nat_false_others_default_;
    123   base::DictionaryValue domain_empty_others_default_;
    124   base::DictionaryValue domain_full_others_default_;
    125   base::DictionaryValue nat_true_domain_empty_;
    126   base::DictionaryValue nat_true_domain_full_;
    127   base::DictionaryValue nat_false_domain_empty_;
    128   base::DictionaryValue nat_false_domain_full_;
    129   base::DictionaryValue nat_true_domain_empty_others_default_;
    130   base::DictionaryValue unknown_policies_;
    131   base::DictionaryValue nat_true_and_overridden_;
    132   base::DictionaryValue nat_false_overridden_others_default_;
    133   base::DictionaryValue pairing_true_;
    134   base::DictionaryValue pairing_false_;
    135   base::DictionaryValue gnubby_auth_true_;
    136   base::DictionaryValue gnubby_auth_false_;
    137   base::DictionaryValue relay_true_;
    138   base::DictionaryValue relay_false_;
    139   base::DictionaryValue port_range_full_;
    140   base::DictionaryValue port_range_empty_;
    141 
    142  private:
    143   void SetDefaults(base::DictionaryValue& dict) {
    144     dict.SetBoolean(PolicyWatcher::kNatPolicyName, true);
    145     dict.SetBoolean(PolicyWatcher::kRelayPolicyName, true);
    146     dict.SetString(PolicyWatcher::kUdpPortRangePolicyName, "");
    147     dict.SetBoolean(PolicyWatcher::kHostRequireTwoFactorPolicyName, false);
    148     dict.SetString(PolicyWatcher::kHostDomainPolicyName, std::string());
    149     dict.SetBoolean(PolicyWatcher::kHostMatchUsernamePolicyName, false);
    150     dict.SetString(PolicyWatcher::kHostTalkGadgetPrefixPolicyName,
    151                    kDefaultHostTalkGadgetPrefix);
    152     dict.SetBoolean(PolicyWatcher::kHostRequireCurtainPolicyName, false);
    153     dict.SetString(PolicyWatcher::kHostTokenUrlPolicyName, std::string());
    154     dict.SetString(PolicyWatcher::kHostTokenValidationUrlPolicyName,
    155                    std::string());
    156     dict.SetString(PolicyWatcher::kHostTokenValidationCertIssuerPolicyName,
    157                    std::string());
    158     dict.SetBoolean(PolicyWatcher::kHostAllowClientPairing, true);
    159     dict.SetBoolean(PolicyWatcher::kHostAllowGnubbyAuthPolicyName, true);
    160 #if !defined(NDEBUG)
    161     dict.SetString(PolicyWatcher::kHostDebugOverridePoliciesName, "");
    162 #endif
    163   }
    164 };
    165 
    166 const char* PolicyWatcherTest::kHostDomain = "google.com";
    167 const char* PolicyWatcherTest::kPortRange = "12400-12409";
    168 
    169 MATCHER_P(IsPolicies, dict, "") {
    170   return arg->Equals(dict);
    171 }
    172 
    173 TEST_F(PolicyWatcherTest, None) {
    174   EXPECT_CALL(mock_policy_callback_,
    175               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    176 
    177   StartWatching();
    178   policy_watcher_->SetPolicies(&empty_);
    179   StopWatching();
    180 }
    181 
    182 TEST_F(PolicyWatcherTest, NatTrue) {
    183   EXPECT_CALL(mock_policy_callback_,
    184               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    185 
    186   StartWatching();
    187   policy_watcher_->SetPolicies(&nat_true_);
    188   StopWatching();
    189 }
    190 
    191 TEST_F(PolicyWatcherTest, NatFalse) {
    192   EXPECT_CALL(mock_policy_callback_,
    193               OnPolicyUpdatePtr(IsPolicies(&nat_false_others_default_)));
    194 
    195   StartWatching();
    196   policy_watcher_->SetPolicies(&nat_false_);
    197   StopWatching();
    198 }
    199 
    200 TEST_F(PolicyWatcherTest, NatOne) {
    201   EXPECT_CALL(mock_policy_callback_,
    202               OnPolicyUpdatePtr(IsPolicies(&nat_false_others_default_)));
    203 
    204   StartWatching();
    205   policy_watcher_->SetPolicies(&nat_one_);
    206   StopWatching();
    207 }
    208 
    209 TEST_F(PolicyWatcherTest, DomainEmpty) {
    210   EXPECT_CALL(mock_policy_callback_,
    211               OnPolicyUpdatePtr(IsPolicies(&domain_empty_others_default_)));
    212 
    213   StartWatching();
    214   policy_watcher_->SetPolicies(&domain_empty_);
    215   StopWatching();
    216 }
    217 
    218 TEST_F(PolicyWatcherTest, DomainFull) {
    219   EXPECT_CALL(mock_policy_callback_,
    220               OnPolicyUpdatePtr(IsPolicies(&domain_full_others_default_)));
    221 
    222   StartWatching();
    223   policy_watcher_->SetPolicies(&domain_full_);
    224   StopWatching();
    225 }
    226 
    227 TEST_F(PolicyWatcherTest, NatNoneThenTrue) {
    228   EXPECT_CALL(mock_policy_callback_,
    229               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    230 
    231   StartWatching();
    232   policy_watcher_->SetPolicies(&empty_);
    233   policy_watcher_->SetPolicies(&nat_true_);
    234   StopWatching();
    235 }
    236 
    237 TEST_F(PolicyWatcherTest, NatNoneThenTrueThenTrue) {
    238   EXPECT_CALL(mock_policy_callback_,
    239               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    240 
    241   StartWatching();
    242   policy_watcher_->SetPolicies(&empty_);
    243   policy_watcher_->SetPolicies(&nat_true_);
    244   policy_watcher_->SetPolicies(&nat_true_);
    245   StopWatching();
    246 }
    247 
    248 TEST_F(PolicyWatcherTest, NatNoneThenTrueThenTrueThenFalse) {
    249   testing::InSequence sequence;
    250   EXPECT_CALL(mock_policy_callback_,
    251               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    252   EXPECT_CALL(mock_policy_callback_,
    253               OnPolicyUpdatePtr(IsPolicies(&nat_false_)));
    254 
    255   StartWatching();
    256   policy_watcher_->SetPolicies(&empty_);
    257   policy_watcher_->SetPolicies(&nat_true_);
    258   policy_watcher_->SetPolicies(&nat_true_);
    259   policy_watcher_->SetPolicies(&nat_false_);
    260   StopWatching();
    261 }
    262 
    263 TEST_F(PolicyWatcherTest, NatNoneThenFalse) {
    264   testing::InSequence sequence;
    265   EXPECT_CALL(mock_policy_callback_,
    266               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    267   EXPECT_CALL(mock_policy_callback_,
    268               OnPolicyUpdatePtr(IsPolicies(&nat_false_)));
    269 
    270   StartWatching();
    271   policy_watcher_->SetPolicies(&empty_);
    272   policy_watcher_->SetPolicies(&nat_false_);
    273   StopWatching();
    274 }
    275 
    276 TEST_F(PolicyWatcherTest, NatNoneThenFalseThenTrue) {
    277   testing::InSequence sequence;
    278   EXPECT_CALL(mock_policy_callback_,
    279               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    280   EXPECT_CALL(mock_policy_callback_,
    281               OnPolicyUpdatePtr(IsPolicies(&nat_false_)));
    282   EXPECT_CALL(mock_policy_callback_,
    283               OnPolicyUpdatePtr(IsPolicies(&nat_true_)));
    284 
    285   StartWatching();
    286   policy_watcher_->SetPolicies(&empty_);
    287   policy_watcher_->SetPolicies(&nat_false_);
    288   policy_watcher_->SetPolicies(&nat_true_);
    289   StopWatching();
    290 }
    291 
    292 TEST_F(PolicyWatcherTest, ChangeOneRepeatedlyThenTwo) {
    293   testing::InSequence sequence;
    294   EXPECT_CALL(mock_policy_callback_,
    295               OnPolicyUpdatePtr(IsPolicies(
    296                   &nat_true_domain_empty_others_default_)));
    297   EXPECT_CALL(mock_policy_callback_,
    298               OnPolicyUpdatePtr(IsPolicies(&domain_full_)));
    299   EXPECT_CALL(mock_policy_callback_,
    300               OnPolicyUpdatePtr(IsPolicies(&nat_false_)));
    301   EXPECT_CALL(mock_policy_callback_,
    302               OnPolicyUpdatePtr(IsPolicies(&domain_empty_)));
    303   EXPECT_CALL(mock_policy_callback_,
    304               OnPolicyUpdatePtr(IsPolicies(&nat_true_domain_full_)));
    305 
    306   StartWatching();
    307   policy_watcher_->SetPolicies(&nat_true_domain_empty_);
    308   policy_watcher_->SetPolicies(&nat_true_domain_full_);
    309   policy_watcher_->SetPolicies(&nat_false_domain_full_);
    310   policy_watcher_->SetPolicies(&nat_false_domain_empty_);
    311   policy_watcher_->SetPolicies(&nat_true_domain_full_);
    312   StopWatching();
    313 }
    314 
    315 TEST_F(PolicyWatcherTest, FilterUnknownPolicies) {
    316   testing::InSequence sequence;
    317   EXPECT_CALL(mock_policy_callback_,
    318               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    319 
    320   StartWatching();
    321   policy_watcher_->SetPolicies(&empty_);
    322   policy_watcher_->SetPolicies(&unknown_policies_);
    323   policy_watcher_->SetPolicies(&empty_);
    324   StopWatching();
    325 }
    326 
    327 TEST_F(PolicyWatcherTest, DebugOverrideNatPolicy) {
    328 #if !defined(NDEBUG)
    329   EXPECT_CALL(mock_policy_callback_,
    330       OnPolicyUpdatePtr(IsPolicies(&nat_false_overridden_others_default_)));
    331 #else
    332   EXPECT_CALL(mock_policy_callback_,
    333       OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    334 #endif
    335 
    336   StartWatching();
    337   policy_watcher_->SetPolicies(&nat_true_and_overridden_);
    338   StopWatching();
    339 }
    340 
    341 TEST_F(PolicyWatcherTest, PairingFalseThenTrue) {
    342   testing::InSequence sequence;
    343   EXPECT_CALL(mock_policy_callback_,
    344               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    345   EXPECT_CALL(mock_policy_callback_,
    346               OnPolicyUpdatePtr(IsPolicies(&pairing_false_)));
    347   EXPECT_CALL(mock_policy_callback_,
    348               OnPolicyUpdatePtr(IsPolicies(&pairing_true_)));
    349 
    350   StartWatching();
    351   policy_watcher_->SetPolicies(&empty_);
    352   policy_watcher_->SetPolicies(&pairing_false_);
    353   policy_watcher_->SetPolicies(&pairing_true_);
    354   StopWatching();
    355 }
    356 
    357 TEST_F(PolicyWatcherTest, GnubbyAuth) {
    358   testing::InSequence sequence;
    359   EXPECT_CALL(mock_policy_callback_,
    360               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    361   EXPECT_CALL(mock_policy_callback_,
    362               OnPolicyUpdatePtr(IsPolicies(&gnubby_auth_false_)));
    363   EXPECT_CALL(mock_policy_callback_,
    364               OnPolicyUpdatePtr(IsPolicies(&gnubby_auth_true_)));
    365 
    366   StartWatching();
    367   policy_watcher_->SetPolicies(&empty_);
    368   policy_watcher_->SetPolicies(&gnubby_auth_false_);
    369   policy_watcher_->SetPolicies(&gnubby_auth_true_);
    370   StopWatching();
    371 }
    372 
    373 TEST_F(PolicyWatcherTest, Relay) {
    374   testing::InSequence sequence;
    375   EXPECT_CALL(mock_policy_callback_,
    376               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    377   EXPECT_CALL(mock_policy_callback_,
    378               OnPolicyUpdatePtr(IsPolicies(&relay_false_)));
    379   EXPECT_CALL(mock_policy_callback_,
    380               OnPolicyUpdatePtr(IsPolicies(&relay_true_)));
    381 
    382   StartWatching();
    383   policy_watcher_->SetPolicies(&empty_);
    384   policy_watcher_->SetPolicies(&relay_false_);
    385   policy_watcher_->SetPolicies(&relay_true_);
    386   StopWatching();
    387 }
    388 
    389 TEST_F(PolicyWatcherTest, UdpPortRange) {
    390   testing::InSequence sequence;
    391   EXPECT_CALL(mock_policy_callback_,
    392               OnPolicyUpdatePtr(IsPolicies(&nat_true_others_default_)));
    393   EXPECT_CALL(mock_policy_callback_,
    394               OnPolicyUpdatePtr(IsPolicies(&port_range_full_)));
    395   EXPECT_CALL(mock_policy_callback_,
    396               OnPolicyUpdatePtr(IsPolicies(&port_range_empty_)));
    397 
    398   StartWatching();
    399   policy_watcher_->SetPolicies(&empty_);
    400   policy_watcher_->SetPolicies(&port_range_full_);
    401   policy_watcher_->SetPolicies(&port_range_empty_);
    402   StopWatching();
    403 }
    404 
    405 }  // namespace policy_hack
    406 }  // namespace remoting
    407