blob: fe4bc417b0e8d6e6d283e26f62de4cbd16fbd920 [file] [log] [blame]
Darin Petkova4766822011-07-07 10:42:22 -07001// Copyright (c) 2011 The Chromium OS 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
Chris Masone7aa5f902011-07-11 11:13:35 -07005#include "shill/profile.h"
6
Chris Masone6791a432011-07-12 13:23:19 -07007#include <string>
8#include <vector>
9
Darin Petkova4766822011-07-07 10:42:22 -070010#include <base/string_util.h>
11#include <gtest/gtest.h>
12
Chris Masone6791a432011-07-12 13:23:19 -070013#include "shill/mock_profile.h"
14#include "shill/mock_service.h"
Chris Masone9d779932011-08-25 16:33:41 -070015#include "shill/mock_store.h"
Chris Masone6791a432011-07-12 13:23:19 -070016#include "shill/property_store_unittest.h"
17
18using std::set;
Darin Petkova4766822011-07-07 10:42:22 -070019using std::string;
Chris Masone6791a432011-07-12 13:23:19 -070020using std::vector;
Chris Masone9d779932011-08-25 16:33:41 -070021using testing::_;
Chris Masone6791a432011-07-12 13:23:19 -070022using testing::Return;
Chris Masone9d779932011-08-25 16:33:41 -070023using testing::SetArgumentPointee;
Chris Masone6791a432011-07-12 13:23:19 -070024using testing::StrictMock;
Darin Petkova4766822011-07-07 10:42:22 -070025
26namespace shill {
27
Chris Masone6791a432011-07-12 13:23:19 -070028class ProfileTest : public PropertyStoreTest {
29 public:
30 ProfileTest()
Chris Masone2176a882011-09-14 22:29:15 -070031 : profile_(new MockProfile(control_interface(), manager(), "")) {
Chris Masone9d779932011-08-25 16:33:41 -070032 }
33
34 MockService *CreateMockService() {
Chris Masone2176a882011-09-14 22:29:15 -070035 return new StrictMock<MockService>(control_interface(),
36 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -070037 manager());
Chris Masone6791a432011-07-12 13:23:19 -070038 }
39
40 protected:
Chris Masone9d779932011-08-25 16:33:41 -070041 MockStore store_;
42 scoped_refptr<MockProfile> profile_;
Darin Petkova4766822011-07-07 10:42:22 -070043};
44
45TEST_F(ProfileTest, IsValidIdentifierToken) {
46 EXPECT_FALSE(Profile::IsValidIdentifierToken(""));
47 EXPECT_FALSE(Profile::IsValidIdentifierToken(" "));
48 EXPECT_FALSE(Profile::IsValidIdentifierToken("-"));
49 EXPECT_FALSE(Profile::IsValidIdentifierToken("~"));
50 EXPECT_FALSE(Profile::IsValidIdentifierToken("_"));
51 EXPECT_TRUE(Profile::IsValidIdentifierToken("a"));
52 EXPECT_TRUE(Profile::IsValidIdentifierToken("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
53 EXPECT_TRUE(Profile::IsValidIdentifierToken("abcdefghijklmnopqrstuvwxyz"));
54 EXPECT_TRUE(Profile::IsValidIdentifierToken("0123456789"));
55}
56
57TEST_F(ProfileTest, ParseIdentifier) {
58 Profile::Identifier identifier;
59 EXPECT_FALSE(Profile::ParseIdentifier("", &identifier));
60 EXPECT_FALSE(Profile::ParseIdentifier("~", &identifier));
61 EXPECT_FALSE(Profile::ParseIdentifier("~foo", &identifier));
62 EXPECT_FALSE(Profile::ParseIdentifier("~/", &identifier));
63 EXPECT_FALSE(Profile::ParseIdentifier("~bar/", &identifier));
64 EXPECT_FALSE(Profile::ParseIdentifier("~/zoo", &identifier));
65 EXPECT_FALSE(Profile::ParseIdentifier("~./moo", &identifier));
66 EXPECT_FALSE(Profile::ParseIdentifier("~valid/?", &identifier));
67 EXPECT_FALSE(Profile::ParseIdentifier("~no//no", &identifier));
68 EXPECT_FALSE(Profile::ParseIdentifier("~no~no", &identifier));
69
70 static const char kUser[] = "user";
71 static const char kIdentifier[] = "identifier";
72 EXPECT_TRUE(Profile::ParseIdentifier(
73 base::StringPrintf("~%s/%s", kUser, kIdentifier),
74 &identifier));
75 EXPECT_EQ(kUser, identifier.user);
76 EXPECT_EQ(kIdentifier, identifier.identifier);
77
78 EXPECT_FALSE(Profile::ParseIdentifier("!", &identifier));
79 EXPECT_FALSE(Profile::ParseIdentifier("/nope", &identifier));
80
81 static const char kIdentifier2[] = "something";
82 EXPECT_TRUE(Profile::ParseIdentifier(kIdentifier2, &identifier));
83 EXPECT_EQ("", identifier.user);
84 EXPECT_EQ(kIdentifier2, identifier.identifier);
85}
86
Chris Masone7df0c672011-07-15 10:24:54 -070087TEST_F(ProfileTest, GetFriendlyName) {
Darin Petkova4766822011-07-07 10:42:22 -070088 static const char kUser[] = "theUser";
89 static const char kIdentifier[] = "theIdentifier";
Chris Masone7df0c672011-07-15 10:24:54 -070090 Profile::Identifier id;
91 id.identifier = kIdentifier;
92 ProfileRefPtr profile(
Chris Masone2176a882011-09-14 22:29:15 -070093 new Profile(control_interface(), manager(), id, "", false));
Chris Masone7df0c672011-07-15 10:24:54 -070094 EXPECT_EQ(kIdentifier, profile->GetFriendlyName());
95 id.user = kUser;
Chris Masone2176a882011-09-14 22:29:15 -070096 profile = new Profile(control_interface(), manager(), id, "", false);
Chris Masone7df0c672011-07-15 10:24:54 -070097 EXPECT_EQ(string(kUser) + "/" + kIdentifier, profile->GetFriendlyName());
Darin Petkova4766822011-07-07 10:42:22 -070098}
99
100TEST_F(ProfileTest, GetStoragePath) {
101 static const char kUser[] = "chronos";
102 static const char kIdentifier[] = "someprofile";
Chris Masone2ae797d2011-08-23 20:41:00 -0700103 static const char kFormat[] = "/a/place/for/%s";
Darin Petkova4766822011-07-07 10:42:22 -0700104 FilePath path;
Chris Masone2ae797d2011-08-23 20:41:00 -0700105 Profile::Identifier id;
106 id.identifier = kIdentifier;
107 ProfileRefPtr profile(
Chris Masone2176a882011-09-14 22:29:15 -0700108 new Profile(control_interface(), manager(), id, "", false));
Chris Masone2ae797d2011-08-23 20:41:00 -0700109 EXPECT_FALSE(profile->GetStoragePath(&path));
110 id.user = kUser;
111 profile =
Chris Masone2176a882011-09-14 22:29:15 -0700112 new Profile(control_interface(), manager(), id, kFormat, false);
Chris Masone2ae797d2011-08-23 20:41:00 -0700113 EXPECT_TRUE(profile->GetStoragePath(&path));
114 string suffix = base::StringPrintf("/%s.profile", kIdentifier);
115 EXPECT_EQ(base::StringPrintf(kFormat, kUser) + suffix, path.value());
Darin Petkova4766822011-07-07 10:42:22 -0700116}
117
Chris Masone6791a432011-07-12 13:23:19 -0700118TEST_F(ProfileTest, ServiceManagement) {
mukesh agrawal51a7e932011-07-27 16:18:26 -0700119 string service1_name;
120 string service2_name;
Chris Masone6791a432011-07-12 13:23:19 -0700121 {
Chris Masone9d779932011-08-25 16:33:41 -0700122 ServiceRefPtr service1(CreateMockService());
123 ServiceRefPtr service2(CreateMockService());
mukesh agrawal51a7e932011-07-27 16:18:26 -0700124 service1_name = service1->UniqueName();
125 service2_name = service2->UniqueName();
Chris Masone6791a432011-07-12 13:23:19 -0700126 ASSERT_TRUE(profile_->AdoptService(service1));
127 ASSERT_TRUE(profile_->AdoptService(service2));
128 ASSERT_FALSE(profile_->AdoptService(service1));
129 }
mukesh agrawal51a7e932011-07-27 16:18:26 -0700130 ASSERT_TRUE(profile_->FindService(service1_name).get() != NULL);
131 ASSERT_TRUE(profile_->FindService(service2_name).get() != NULL);
Chris Masone6791a432011-07-12 13:23:19 -0700132
mukesh agrawal51a7e932011-07-27 16:18:26 -0700133 ASSERT_TRUE(profile_->AbandonService(service1_name));
134 ASSERT_TRUE(profile_->FindService(service1_name).get() == NULL);
135 ASSERT_TRUE(profile_->FindService(service2_name).get() != NULL);
Chris Masone6791a432011-07-12 13:23:19 -0700136
mukesh agrawal51a7e932011-07-27 16:18:26 -0700137 ASSERT_FALSE(profile_->AbandonService(service1_name));
138 ASSERT_TRUE(profile_->AbandonService(service2_name));
139 ASSERT_TRUE(profile_->FindService(service1_name).get() == NULL);
140 ASSERT_TRUE(profile_->FindService(service2_name).get() == NULL);
Chris Masone6791a432011-07-12 13:23:19 -0700141}
142
Chris Masone9d779932011-08-25 16:33:41 -0700143TEST_F(ProfileTest, Finalize) {
144 scoped_refptr<MockService> service1(CreateMockService());
145 scoped_refptr<MockService> service2(CreateMockService());
146 EXPECT_CALL(*service1.get(), Save(_)).WillOnce(Return(true));
147 EXPECT_CALL(*service2.get(), Save(_)).WillOnce(Return(true));
148
149 ASSERT_TRUE(profile_->AdoptService(service1));
150 ASSERT_TRUE(profile_->AdoptService(service2));
151
152 profile_->Finalize(&store_);
153}
154
Chris Masone6791a432011-07-12 13:23:19 -0700155TEST_F(ProfileTest, EntryEnumeration) {
Chris Masone6791a432011-07-12 13:23:19 -0700156 scoped_refptr<MockService> service1(
Chris Masone2176a882011-09-14 22:29:15 -0700157 new StrictMock<MockService>(control_interface(),
158 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -0700159 manager()));
Chris Masone6791a432011-07-12 13:23:19 -0700160 scoped_refptr<MockService> service2(
Chris Masone2176a882011-09-14 22:29:15 -0700161 new StrictMock<MockService>(control_interface(),
162 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -0700163 manager()));
mukesh agrawal51a7e932011-07-27 16:18:26 -0700164 string service1_name(service1->UniqueName());
165 string service2_name(service2->UniqueName());
166
167 EXPECT_CALL(*service1.get(), GetRpcIdentifier())
168 .WillRepeatedly(Return(service1_name));
Chris Masone6791a432011-07-12 13:23:19 -0700169 EXPECT_CALL(*service2.get(), GetRpcIdentifier())
mukesh agrawal51a7e932011-07-27 16:18:26 -0700170 .WillRepeatedly(Return(service2_name));
Chris Masone6791a432011-07-12 13:23:19 -0700171 ASSERT_TRUE(profile_->AdoptService(service1));
172 ASSERT_TRUE(profile_->AdoptService(service2));
173
174 ASSERT_EQ(profile_->EnumerateEntries().size(), 2);
175
mukesh agrawal51a7e932011-07-27 16:18:26 -0700176 ASSERT_TRUE(profile_->AbandonService(service1_name));
177 ASSERT_EQ(profile_->EnumerateEntries()[0], service2_name);
Chris Masone6791a432011-07-12 13:23:19 -0700178
mukesh agrawal51a7e932011-07-27 16:18:26 -0700179 ASSERT_FALSE(profile_->AbandonService(service1_name));
180 ASSERT_EQ(profile_->EnumerateEntries()[0], service2_name);
Chris Masone6791a432011-07-12 13:23:19 -0700181
mukesh agrawal51a7e932011-07-27 16:18:26 -0700182 ASSERT_TRUE(profile_->AbandonService(service2_name));
Chris Masone6791a432011-07-12 13:23:19 -0700183 ASSERT_EQ(profile_->EnumerateEntries().size(), 0);
184}
185
Paul Stewart7355ce12011-09-02 10:47:01 -0700186} // namespace shill