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