Home | History | Annotate | Download | only in permissions
      1 // Copyright 2013 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/pickle.h"
      6 #include "base/values.h"
      7 #include "chrome/common/extensions/extension_messages.h"
      8 #include "extensions/common/permissions/manifest_permission.h"
      9 #include "extensions/common/permissions/manifest_permission_set.h"
     10 #include "ipc/ipc_message.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 namespace extensions {
     14 
     15 class MockManifestPermission : public ManifestPermission {
     16  public:
     17   MockManifestPermission(const std::string& name)
     18       : name_(name) {
     19   }
     20 
     21   virtual std::string name() const OVERRIDE {
     22     return name_;
     23   }
     24 
     25   virtual std::string id() const OVERRIDE {
     26     return name();
     27   }
     28 
     29   virtual bool HasMessages() const OVERRIDE {
     30     return false;
     31   }
     32 
     33   virtual PermissionMessages GetMessages() const OVERRIDE {
     34     return PermissionMessages();
     35   }
     36 
     37   virtual bool FromValue(const base::Value* value) OVERRIDE {
     38     return false;
     39   }
     40 
     41   virtual scoped_ptr<base::Value> ToValue() const OVERRIDE {
     42     return scoped_ptr<base::Value>(base::Value::CreateNullValue());
     43   }
     44 
     45   virtual ManifestPermission* Clone() const OVERRIDE {
     46     return new MockManifestPermission(name_);
     47   }
     48 
     49   virtual ManifestPermission* Diff(const ManifestPermission* rhs)
     50       const OVERRIDE {
     51     const MockManifestPermission* other =
     52         static_cast<const MockManifestPermission*>(rhs);
     53     EXPECT_EQ(name_, other->name_);
     54     return NULL;
     55   }
     56 
     57   virtual ManifestPermission* Union(const ManifestPermission* rhs)
     58       const OVERRIDE {
     59     const MockManifestPermission* other =
     60         static_cast<const MockManifestPermission*>(rhs);
     61     EXPECT_EQ(name_, other->name_);
     62     return new MockManifestPermission(name_);
     63   }
     64 
     65   virtual ManifestPermission* Intersect(const ManifestPermission* rhs)
     66       const OVERRIDE {
     67     const MockManifestPermission* other =
     68         static_cast<const MockManifestPermission*>(rhs);
     69     EXPECT_EQ(name_, other->name_);
     70     return new MockManifestPermission(name_);
     71   }
     72 
     73   virtual bool Contains(const ManifestPermission* rhs) const OVERRIDE {
     74     const MockManifestPermission* other =
     75         static_cast<const MockManifestPermission*>(rhs);
     76     EXPECT_EQ(name_, other->name_);
     77     return true;
     78   }
     79 
     80   virtual bool Equal(const ManifestPermission* rhs) const OVERRIDE {
     81     const MockManifestPermission* other =
     82         static_cast<const MockManifestPermission*>(rhs);
     83     EXPECT_EQ(name_, other->name_);
     84     return true;
     85   }
     86 
     87   virtual void Write(IPC::Message* m) const OVERRIDE {
     88     IPC::WriteParam(m, name_);
     89   }
     90 
     91   virtual bool Read(const IPC::Message* m, PickleIterator* iter) OVERRIDE {
     92     std::string read_name;
     93     bool result = IPC::ReadParam(m, iter, &read_name);
     94     if (!result)
     95       return result;
     96     EXPECT_EQ(read_name, name_);
     97     return true;
     98   }
     99 
    100   virtual void Log(std::string* log) const OVERRIDE {
    101   }
    102 
    103  private:
    104   std::string name_;
    105 };
    106 
    107 TEST(ManifestPermissionSetTest, General) {
    108   ManifestPermissionSet set;
    109   set.insert(new MockManifestPermission("p1"));
    110   set.insert(new MockManifestPermission("p2"));
    111   set.insert(new MockManifestPermission("p3"));
    112   set.insert(new MockManifestPermission("p4"));
    113   set.insert(new MockManifestPermission("p5"));
    114 
    115   EXPECT_EQ(set.find("p1")->id(), "p1");
    116   EXPECT_TRUE(set.find("p10") == set.end());
    117 
    118   EXPECT_EQ(set.size(), 5u);
    119 
    120   EXPECT_EQ(set.erase("p1"), 1u);
    121   EXPECT_EQ(set.size(), 4u);
    122 
    123   EXPECT_EQ(set.erase("p1"), 0u);
    124   EXPECT_EQ(set.size(), 4u);
    125 }
    126 
    127 TEST(ManifestPermissionSetTest, CreateUnion) {
    128   ManifestPermissionSet permissions1;
    129   ManifestPermissionSet permissions2;
    130   ManifestPermissionSet expected_permissions;
    131   ManifestPermissionSet result;
    132 
    133   ManifestPermission* permission = new MockManifestPermission("p3");
    134 
    135   // Union with an empty set.
    136   permissions1.insert(new MockManifestPermission("p1"));
    137   permissions1.insert(new MockManifestPermission("p2"));
    138   permissions1.insert(permission->Clone());
    139   expected_permissions.insert(new MockManifestPermission("p1"));
    140   expected_permissions.insert(new MockManifestPermission("p2"));
    141   expected_permissions.insert(permission);
    142 
    143   ManifestPermissionSet::Union(permissions1, permissions2, &result);
    144 
    145   EXPECT_TRUE(permissions1.Contains(permissions2));
    146   EXPECT_TRUE(permissions1.Contains(result));
    147   EXPECT_FALSE(permissions2.Contains(permissions1));
    148   EXPECT_FALSE(permissions2.Contains(result));
    149   EXPECT_TRUE(result.Contains(permissions1));
    150   EXPECT_TRUE(result.Contains(permissions2));
    151 
    152   EXPECT_EQ(expected_permissions, result);
    153 
    154   // Now use a real second set.
    155   permissions2.insert(new MockManifestPermission("p1"));
    156   permissions2.insert(new MockManifestPermission("p2"));
    157   permissions2.insert(new MockManifestPermission("p33"));
    158   permissions2.insert(new MockManifestPermission("p4"));
    159   permissions2.insert(new MockManifestPermission("p5"));
    160 
    161   expected_permissions.insert(new MockManifestPermission("p1"));
    162   expected_permissions.insert(new MockManifestPermission("p2"));
    163   expected_permissions.insert(new MockManifestPermission("p3"));
    164   expected_permissions.insert(new MockManifestPermission("p4"));
    165   expected_permissions.insert(new MockManifestPermission("p5"));
    166   expected_permissions.insert(new MockManifestPermission("p33"));
    167 
    168   ManifestPermissionSet::Union(permissions1, permissions2, &result);
    169 
    170   {
    171     ManifestPermissionSet set1;
    172     set1.insert(new MockManifestPermission("p1"));
    173     set1.insert(new MockManifestPermission("p2"));
    174     ManifestPermissionSet set2;
    175     set2.insert(new MockManifestPermission("p3"));
    176 
    177     EXPECT_FALSE(set1.Contains(set2));
    178     EXPECT_FALSE(set2.Contains(set1));
    179   }
    180 
    181   EXPECT_FALSE(permissions1.Contains(permissions2));
    182   EXPECT_FALSE(permissions1.Contains(result));
    183   EXPECT_FALSE(permissions2.Contains(permissions1));
    184   EXPECT_FALSE(permissions2.Contains(result));
    185   EXPECT_TRUE(result.Contains(permissions1));
    186   EXPECT_TRUE(result.Contains(permissions2));
    187 
    188   EXPECT_EQ(expected_permissions, result);
    189 }
    190 
    191 TEST(ManifestPermissionSetTest, CreateIntersection) {
    192   ManifestPermissionSet permissions1;
    193   ManifestPermissionSet permissions2;
    194   ManifestPermissionSet expected_permissions;
    195   ManifestPermissionSet result;
    196 
    197   // Intersection with an empty set.
    198   permissions1.insert(new MockManifestPermission("p1"));
    199   permissions1.insert(new MockManifestPermission("p2"));
    200   permissions1.insert(new MockManifestPermission("p3"));
    201 
    202   ManifestPermissionSet::Intersection(permissions1, permissions2, &result);
    203   EXPECT_TRUE(permissions1.Contains(result));
    204   EXPECT_TRUE(permissions2.Contains(result));
    205   EXPECT_TRUE(permissions1.Contains(permissions2));
    206   EXPECT_FALSE(permissions2.Contains(permissions1));
    207   EXPECT_FALSE(result.Contains(permissions1));
    208   EXPECT_TRUE(result.Contains(permissions2));
    209 
    210   EXPECT_TRUE(result.empty());
    211   EXPECT_EQ(expected_permissions, result);
    212 
    213   // Now use a real second set.
    214   permissions2.insert(new MockManifestPermission("p1"));
    215   permissions2.insert(new MockManifestPermission("p3"));
    216   permissions2.insert(new MockManifestPermission("p4"));
    217   permissions2.insert(new MockManifestPermission("p5"));
    218 
    219   expected_permissions.insert(new MockManifestPermission("p1"));
    220   expected_permissions.insert(new MockManifestPermission("p3"));
    221 
    222   ManifestPermissionSet::Intersection(permissions1, permissions2, &result);
    223 
    224   EXPECT_TRUE(permissions1.Contains(result));
    225   EXPECT_TRUE(permissions2.Contains(result));
    226   EXPECT_FALSE(permissions1.Contains(permissions2));
    227   EXPECT_FALSE(permissions2.Contains(permissions1));
    228   EXPECT_FALSE(result.Contains(permissions1));
    229   EXPECT_FALSE(result.Contains(permissions2));
    230 
    231   EXPECT_EQ(expected_permissions, result);
    232 }
    233 
    234 TEST(ManifestPermissionSetTest, CreateDifference) {
    235   ManifestPermissionSet permissions1;
    236   ManifestPermissionSet permissions2;
    237   ManifestPermissionSet expected_permissions;
    238   ManifestPermissionSet result;
    239 
    240   // Difference with an empty set.
    241   permissions1.insert(new MockManifestPermission("p1"));
    242   permissions1.insert(new MockManifestPermission("p2"));
    243   permissions1.insert(new MockManifestPermission("p3"));
    244 
    245   ManifestPermissionSet::Difference(permissions1, permissions2, &result);
    246 
    247   EXPECT_EQ(permissions1, result);
    248 
    249   // Now use a real second set.
    250   permissions2.insert(new MockManifestPermission("p1"));
    251   permissions2.insert(new MockManifestPermission("p2"));
    252   permissions2.insert(new MockManifestPermission("p4"));
    253   permissions2.insert(new MockManifestPermission("p5"));
    254   permissions2.insert(new MockManifestPermission("p6"));
    255 
    256   expected_permissions.insert(new MockManifestPermission("p3"));
    257 
    258   ManifestPermissionSet::Difference(permissions1, permissions2, &result);
    259 
    260   EXPECT_TRUE(permissions1.Contains(result));
    261   EXPECT_FALSE(permissions2.Contains(result));
    262 
    263   EXPECT_EQ(expected_permissions, result);
    264 
    265   // |result| = |permissions1| - |permissions2| -->
    266   //   |result| intersect |permissions2| == empty_set
    267   ManifestPermissionSet result2;
    268   ManifestPermissionSet::Intersection(result, permissions2, &result2);
    269   EXPECT_TRUE(result2.empty());
    270 }
    271 
    272 }  // namespace extensions
    273