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