1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
16a4766822880815bafdc69778ccaccaf661536181Darin Petkov
177aa5f90848b530999d8b6788ecb40aa30871c7aeChris Masone#include "shill/profile.h"
187aa5f90848b530999d8b6788ecb40aa30871c7aeChris Masone
196791a43add38926966bd420e89541717fb2cb2b5Chris Masone#include <string>
206791a43add38926966bd420e89541717fb2cb2b5Chris Masone#include <vector>
216791a43add38926966bd420e89541717fb2cb2b5Chris Masone
2211c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h>
23a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
24a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
25a4766822880815bafdc69778ccaccaf661536181Darin Petkov#include <gtest/gtest.h>
26a4766822880815bafdc69778ccaccaf661536181Darin Petkov
273d5be0d7fb6d5dfec1e96d619bf98bde6ba55fadmukesh agrawal#include "shill/fake_store.h"
287522551440b9a287bccf2d95a42357d04ab79814Paul Stewart#include "shill/mock_manager.h"
295133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le#include "shill/mock_metrics.h"
306791a43add38926966bd420e89541717fb2cb2b5Chris Masone#include "shill/mock_profile.h"
316791a43add38926966bd420e89541717fb2cb2b5Chris Masone#include "shill/mock_service.h"
329d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone#include "shill/mock_store.h"
336791a43add38926966bd420e89541717fb2cb2b5Chris Masone#include "shill/property_store_unittest.h"
346515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone#include "shill/service_under_test.h"
3504147470fdeaaf9ab7588bd3a7988d74aa990068mukesh agrawal#include "shill/store_factory.h"
366791a43add38926966bd420e89541717fb2cb2b5Chris Masone
370e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
386791a43add38926966bd420e89541717fb2cb2b5Chris Masoneusing std::set;
39a4766822880815bafdc69778ccaccaf661536181Darin Petkovusing std::string;
406791a43add38926966bd420e89541717fb2cb2b5Chris Masoneusing std::vector;
419d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masoneusing testing::_;
426515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masoneusing testing::Invoke;
437522551440b9a287bccf2d95a42357d04ab79814Paul Stewartusing testing::Mock;
446791a43add38926966bd420e89541717fb2cb2b5Chris Masoneusing testing::Return;
459d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masoneusing testing::SetArgumentPointee;
466791a43add38926966bd420e89541717fb2cb2b5Chris Masoneusing testing::StrictMock;
47a4766822880815bafdc69778ccaccaf661536181Darin Petkov
48a4766822880815bafdc69778ccaccaf661536181Darin Petkovnamespace shill {
49a4766822880815bafdc69778ccaccaf661536181Darin Petkov
506791a43add38926966bd420e89541717fb2cb2b5Chris Masoneclass ProfileTest : public PropertyStoreTest {
516791a43add38926966bd420e89541717fb2cb2b5Chris Masone public:
52cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  ProfileTest() : mock_metrics_(new MockMetrics(nullptr)) {
536515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone    Profile::Identifier id("rather", "irrelevant");
54d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal    profile_ = new Profile(
55d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal        control_interface(), metrics(), manager(), id, FilePath(), false);
563d5be0d7fb6d5dfec1e96d619bf98bde6ba55fadmukesh agrawal
573d5be0d7fb6d5dfec1e96d619bf98bde6ba55fadmukesh agrawal    // Install a FakeStore by default. In tests that actually care
583d5be0d7fb6d5dfec1e96d619bf98bde6ba55fadmukesh agrawal    // about the interaction between Profile and StoreInterface, we'll
593d5be0d7fb6d5dfec1e96d619bf98bde6ba55fadmukesh agrawal    // replace this with a MockStore.
60b8f04f56133060fada6a65f0494c05b78eee6b88mukesh agrawal    profile_->set_storage(new FakeStore());
619d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone  }
629d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone
633b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  MockService* CreateMockService() {
642176a88f197d802924d2a83d368e3efab7a6be4bChris Masone    return new StrictMock<MockService>(control_interface(),
652176a88f197d802924d2a83d368e3efab7a6be4bChris Masone                                       dispatcher(),
663426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                                       metrics(),
679d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone                                       manager());
686791a43add38926966bd420e89541717fb2cb2b5Chris Masone  }
696791a43add38926966bd420e89541717fb2cb2b5Chris Masone
703b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  bool ProfileInitStorage(const Profile::Identifier& id,
715dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                          Profile::InitStorageOption storage_option,
725dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                          bool save,
735dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                          Error::Type error_type) {
743d5be0d7fb6d5dfec1e96d619bf98bde6ba55fadmukesh agrawal    // Note: this code uses neither FakeStore, nor MockStore. Instead,
753d5be0d7fb6d5dfec1e96d619bf98bde6ba55fadmukesh agrawal    // it exercises a real StoreInterface implemenation.
765dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart    Error error;
775dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart    ProfileRefPtr profile(
785133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le        new Profile(control_interface(), mock_metrics_.get(), manager(), id,
79d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal                    FilePath(storage_path()), false));
80c80c460b90378124cc945b0b1f619d86949000a7mukesh agrawal    bool ret = profile->InitStorage(storage_option, &error);
815dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart    EXPECT_EQ(error_type, error.type());
825dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart    if (ret && save) {
835dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart      EXPECT_TRUE(profile->Save());
845dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart    }
855dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart    return ret;
865dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  }
875dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
886791a43add38926966bd420e89541717fb2cb2b5Chris Masone protected:
89d419b6dc297755e8f0546b2f780851b49aab1fc7Ben Chan  std::unique_ptr<MockMetrics> mock_metrics_;
906515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ProfileRefPtr profile_;
91a4766822880815bafdc69778ccaccaf661536181Darin Petkov};
92a4766822880815bafdc69778ccaccaf661536181Darin Petkov
937522551440b9a287bccf2d95a42357d04ab79814Paul StewartTEST_F(ProfileTest, DeleteEntry) {
94d419b6dc297755e8f0546b2f780851b49aab1fc7Ben Chan  std::unique_ptr<MockManager> manager(new StrictMock<MockManager>(
95bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal      control_interface(), dispatcher(), metrics()));
967522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  profile_->manager_ = manager.get();
977522551440b9a287bccf2d95a42357d04ab79814Paul Stewart
983b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  MockStore* storage(new StrictMock<MockStore>());
997522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  profile_->storage_.reset(storage);  // Passes ownership
1007522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  const string kEntryName("entry_name");
1017522551440b9a287bccf2d95a42357d04ab79814Paul Stewart
1027522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  // If entry does not appear in storage, DeleteEntry() should return an error.
1037522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  EXPECT_CALL(*storage, ContainsGroup(kEntryName))
1047522551440b9a287bccf2d95a42357d04ab79814Paul Stewart      .WillOnce(Return(false));
1057522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  {
1067522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    Error error;
1077522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    profile_->DeleteEntry(kEntryName, &error);
1087522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    EXPECT_EQ(Error::kNotFound, error.type());
1097522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  }
1107522551440b9a287bccf2d95a42357d04ab79814Paul Stewart
1117522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  Mock::VerifyAndClearExpectations(storage);
1127522551440b9a287bccf2d95a42357d04ab79814Paul Stewart
1137522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  // If HandleProfileEntryDeletion() returns false, Profile should call
1147522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  // DeleteGroup() itself.
1150756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart  EXPECT_CALL(*storage, ContainsGroup(kEntryName))
1160756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart      .WillOnce(Return(true));
1177522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  EXPECT_CALL(*manager.get(), HandleProfileEntryDeletion(_, kEntryName))
1187522551440b9a287bccf2d95a42357d04ab79814Paul Stewart      .WillOnce(Return(false));
1197522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  EXPECT_CALL(*storage, DeleteGroup(kEntryName))
1207522551440b9a287bccf2d95a42357d04ab79814Paul Stewart      .WillOnce(Return(true));
1210756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart  EXPECT_CALL(*storage, Flush())
1220756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart      .WillOnce(Return(true));
1237522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  {
1247522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    Error error;
1257522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    profile_->DeleteEntry(kEntryName, &error);
1267522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    EXPECT_TRUE(error.IsSuccess());
1277522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  }
1287522551440b9a287bccf2d95a42357d04ab79814Paul Stewart
1290756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart  Mock::VerifyAndClearExpectations(storage);
1300756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart
1317522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  // If HandleProfileEntryDeletion() returns true, Profile should not call
1327522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  // DeleteGroup() itself.
1330756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart  EXPECT_CALL(*storage, ContainsGroup(kEntryName))
1340756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart      .WillOnce(Return(true));
1357522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  EXPECT_CALL(*manager.get(), HandleProfileEntryDeletion(_, kEntryName))
1367522551440b9a287bccf2d95a42357d04ab79814Paul Stewart      .WillOnce(Return(true));
1377522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  EXPECT_CALL(*storage, DeleteGroup(kEntryName))
1387522551440b9a287bccf2d95a42357d04ab79814Paul Stewart      .Times(0);
1390756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart  EXPECT_CALL(*storage, Flush())
1400756db95c9d39d6e6aa9a754e54b441eff46ff34Paul Stewart      .WillOnce(Return(true));
1417522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  {
1427522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    Error error;
1437522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    profile_->DeleteEntry(kEntryName, &error);
1447522551440b9a287bccf2d95a42357d04ab79814Paul Stewart    EXPECT_TRUE(error.IsSuccess());
1457522551440b9a287bccf2d95a42357d04ab79814Paul Stewart  }
1467522551440b9a287bccf2d95a42357d04ab79814Paul Stewart}
1477522551440b9a287bccf2d95a42357d04ab79814Paul Stewart
148a4766822880815bafdc69778ccaccaf661536181Darin PetkovTEST_F(ProfileTest, IsValidIdentifierToken) {
149a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::IsValidIdentifierToken(""));
150a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::IsValidIdentifierToken(" "));
151a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::IsValidIdentifierToken("-"));
152a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::IsValidIdentifierToken("~"));
153a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::IsValidIdentifierToken("_"));
154a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_TRUE(Profile::IsValidIdentifierToken("a"));
155a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_TRUE(Profile::IsValidIdentifierToken("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
156a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_TRUE(Profile::IsValidIdentifierToken("abcdefghijklmnopqrstuvwxyz"));
157a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_TRUE(Profile::IsValidIdentifierToken("0123456789"));
158a4766822880815bafdc69778ccaccaf661536181Darin Petkov}
159a4766822880815bafdc69778ccaccaf661536181Darin Petkov
160a4766822880815bafdc69778ccaccaf661536181Darin PetkovTEST_F(ProfileTest, ParseIdentifier) {
161a4766822880815bafdc69778ccaccaf661536181Darin Petkov  Profile::Identifier identifier;
162a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("", &identifier));
163a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~", &identifier));
164a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~foo", &identifier));
165a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~/", &identifier));
166a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~bar/", &identifier));
167a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~/zoo", &identifier));
168a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~./moo", &identifier));
169a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~valid/?", &identifier));
170a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~no//no", &identifier));
171a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("~no~no", &identifier));
172a4766822880815bafdc69778ccaccaf661536181Darin Petkov
173a4766822880815bafdc69778ccaccaf661536181Darin Petkov  static const char kUser[] = "user";
174a4766822880815bafdc69778ccaccaf661536181Darin Petkov  static const char kIdentifier[] = "identifier";
175a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_TRUE(Profile::ParseIdentifier(
176a4766822880815bafdc69778ccaccaf661536181Darin Petkov      base::StringPrintf("~%s/%s", kUser, kIdentifier),
177a4766822880815bafdc69778ccaccaf661536181Darin Petkov      &identifier));
178a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_EQ(kUser, identifier.user);
179a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_EQ(kIdentifier, identifier.identifier);
180a4766822880815bafdc69778ccaccaf661536181Darin Petkov
181a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("!", &identifier));
182a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_FALSE(Profile::ParseIdentifier("/nope", &identifier));
183a4766822880815bafdc69778ccaccaf661536181Darin Petkov
184a4766822880815bafdc69778ccaccaf661536181Darin Petkov  static const char kIdentifier2[] = "something";
185a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_TRUE(Profile::ParseIdentifier(kIdentifier2, &identifier));
186a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_EQ("", identifier.user);
187a4766822880815bafdc69778ccaccaf661536181Darin Petkov  EXPECT_EQ(kIdentifier2, identifier.identifier);
188a4766822880815bafdc69778ccaccaf661536181Darin Petkov}
189a4766822880815bafdc69778ccaccaf661536181Darin Petkov
190f3eced90466010ac4b067a565ba371c476e6de67Paul StewartTEST_F(ProfileTest, IdentifierToString) {
191f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart  Profile::Identifier identifier;
192f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart  static const char kUser[] = "user";
193f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart  static const char kIdentifier[] = "identifier";
194f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart  identifier.user = kUser;
195f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart  identifier.identifier = kIdentifier;
196f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart  EXPECT_EQ(base::StringPrintf("~%s/%s", kUser, kIdentifier),
197f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart            Profile::IdentifierToString(identifier));
198f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart}
199f3eced90466010ac4b067a565ba371c476e6de67Paul Stewart
2007df0c672458bee8f4ff33004103351d59a9f4b50Chris MasoneTEST_F(ProfileTest, GetFriendlyName) {
201a4766822880815bafdc69778ccaccaf661536181Darin Petkov  static const char kUser[] = "theUser";
202a4766822880815bafdc69778ccaccaf661536181Darin Petkov  static const char kIdentifier[] = "theIdentifier";
2036515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  Profile::Identifier id(kIdentifier);
204d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal  ProfileRefPtr profile(new Profile(
205d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      control_interface(), metrics(), manager(), id, FilePath(), false));
2067df0c672458bee8f4ff33004103351d59a9f4b50Chris Masone  EXPECT_EQ(kIdentifier, profile->GetFriendlyName());
2077df0c672458bee8f4ff33004103351d59a9f4b50Chris Masone  id.user = kUser;
208d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal  profile = new Profile(
209d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      control_interface(), metrics(), manager(), id, FilePath(), false);
2107df0c672458bee8f4ff33004103351d59a9f4b50Chris Masone  EXPECT_EQ(string(kUser) + "/" + kIdentifier, profile->GetFriendlyName());
211a4766822880815bafdc69778ccaccaf661536181Darin Petkov}
212a4766822880815bafdc69778ccaccaf661536181Darin Petkov
213a4766822880815bafdc69778ccaccaf661536181Darin PetkovTEST_F(ProfileTest, GetStoragePath) {
214a4766822880815bafdc69778ccaccaf661536181Darin Petkov  static const char kUser[] = "chronos";
215a4766822880815bafdc69778ccaccaf661536181Darin Petkov  static const char kIdentifier[] = "someprofile";
2160a59a5a484634f798222ad077dbbfa7faa76651dmukesh agrawal  static const char kDirectory[] = "/a/place/for/";
2176515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  Profile::Identifier id(kIdentifier);
218d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal  ProfileRefPtr profile(new Profile(
219d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      control_interface(), metrics(), manager(), id, FilePath(), false));
220e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal  EXPECT_TRUE(profile->persistent_profile_path_.empty());
2212ae797d040b7261a5619c750e07037566bcb542bChris Masone  id.user = kUser;
222d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal  profile = new Profile(
223d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      control_interface(), metrics(), manager(), id, FilePath(kDirectory),
224d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      false);
225e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal#if defined(ENABLE_JSON_STORE)
226e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal  EXPECT_EQ("/a/place/for/chronos/someprofile.profile.json",
227e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal            profile->persistent_profile_path_.value());
228e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal#else
229e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal  EXPECT_EQ("/a/place/for/chronos/someprofile.profile",
230e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal            profile->persistent_profile_path_.value());
231e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal#endif
232a4766822880815bafdc69778ccaccaf661536181Darin Petkov}
233a4766822880815bafdc69778ccaccaf661536181Darin Petkov
2346791a43add38926966bd420e89541717fb2cb2b5Chris MasoneTEST_F(ProfileTest, ServiceManagement) {
2356515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  scoped_refptr<MockService> service1(CreateMockService());
2366515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  scoped_refptr<MockService> service2(CreateMockService());
2376515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone
2386515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  EXPECT_CALL(*service1.get(), Save(_))
2396515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone      .WillRepeatedly(Invoke(service1.get(), &MockService::FauxSave));
2406515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  EXPECT_CALL(*service2.get(), Save(_))
2416515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone      .WillRepeatedly(Invoke(service2.get(), &MockService::FauxSave));
2426515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone
2436515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AdoptService(service1));
2446515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AdoptService(service2));
2456515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone
2466515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  // Ensure services are in the profile now.
2476515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->ContainsService(service1));
2486515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->ContainsService(service2));
2496515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone
2506515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  // Ensure we can't add them twice.
2516515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_FALSE(profile_->AdoptService(service1));
2526515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_FALSE(profile_->AdoptService(service2));
2536791a43add38926966bd420e89541717fb2cb2b5Chris Masone
2546515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  // Ensure that we can abandon individually, and that doing so is idempotent.
2556515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AbandonService(service1));
2566515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_FALSE(profile_->ContainsService(service1));
2576515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AbandonService(service1));
2586515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->ContainsService(service2));
2596791a43add38926966bd420e89541717fb2cb2b5Chris Masone
2606515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  // Clean up.
2616515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AbandonService(service2));
2626515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_FALSE(profile_->ContainsService(service1));
2636515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_FALSE(profile_->ContainsService(service2));
2646791a43add38926966bd420e89541717fb2cb2b5Chris Masone}
2656791a43add38926966bd420e89541717fb2cb2b5Chris Masone
266bba6a5b87cb21424770228cd73e10574a2151568Paul StewartTEST_F(ProfileTest, ServiceConfigure) {
2676515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ServiceRefPtr service1(new ServiceUnderTest(control_interface(),
2686515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone                                              dispatcher(),
2693426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                                              metrics(),
2706515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone                                              manager()));
2713d5be0d7fb6d5dfec1e96d619bf98bde6ba55fadmukesh agrawal  // Change priority from default.
272cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  service1->SetPriority(service1->priority() + 1, nullptr);
2736515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AdoptService(service1));
2746515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->ContainsService(service1));
2756515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone
2766515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  // Create new service; ask Profile to merge it with a known, matching,
2776515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  // service; ensure that settings from |service1| wind up in |service2|.
2786515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ServiceRefPtr service2(new ServiceUnderTest(control_interface(),
2796515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone                                              dispatcher(),
2803426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                                              metrics(),
2816515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone                                              manager()));
2827fab89734d88724a288e96a9996b15548c5294c7Ben Chan  int32_t orig_priority = service2->priority();
283bba6a5b87cb21424770228cd73e10574a2151568Paul Stewart  ASSERT_TRUE(profile_->ConfigureService(service2));
28400917ceafbc28599391bfcdd5837faf6d63fec32mukesh agrawal  ASSERT_EQ(service1->priority(), service2->priority());
28500917ceafbc28599391bfcdd5837faf6d63fec32mukesh agrawal  ASSERT_NE(orig_priority, service2->priority());
2866515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone
2876515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  // Clean up.
2886515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AbandonService(service1));
2896515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_FALSE(profile_->ContainsService(service1));
2906515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_FALSE(profile_->ContainsService(service2));
2916515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone}
2926515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone
2936515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris MasoneTEST_F(ProfileTest, Save) {
2949d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone  scoped_refptr<MockService> service1(CreateMockService());
2959d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone  scoped_refptr<MockService> service2(CreateMockService());
2969d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone  EXPECT_CALL(*service1.get(), Save(_)).WillOnce(Return(true));
2979d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone  EXPECT_CALL(*service2.get(), Save(_)).WillOnce(Return(true));
2989d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone
2996515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AdoptService(service1));
3006515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AdoptService(service2));
3019d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone
3026515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  profile_->Save();
3039d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone}
3049d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone
3056791a43add38926966bd420e89541717fb2cb2b5Chris MasoneTEST_F(ProfileTest, EntryEnumeration) {
3066515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  scoped_refptr<MockService> service1(CreateMockService());
3076515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  scoped_refptr<MockService> service2(CreateMockService());
3081b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart  string service1_storage_name = Technology::NameFromIdentifier(
3091b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart      Technology::kCellular) + "_1";
3101b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart  string service2_storage_name = Technology::NameFromIdentifier(
3111b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart      Technology::kCellular) + "_2";
3126515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  EXPECT_CALL(*service1.get(), Save(_))
3136515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone      .WillRepeatedly(Invoke(service1.get(), &MockService::FauxSave));
3146515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  EXPECT_CALL(*service2.get(), Save(_))
3156515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone      .WillRepeatedly(Invoke(service2.get(), &MockService::FauxSave));
3161b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart  EXPECT_CALL(*service1.get(), GetStorageIdentifier())
3171b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart      .WillRepeatedly(Return(service1_storage_name));
3181b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart  EXPECT_CALL(*service2.get(), GetStorageIdentifier())
3191b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart      .WillRepeatedly(Return(service2_storage_name));
3206515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone
321457728b3eeb2d67c980e0d20675f0a0f750903e1Darin Petkov  string service1_name(service1->unique_name());
322457728b3eeb2d67c980e0d20675f0a0f750903e1Darin Petkov  string service2_name(service2->unique_name());
32351a7e939ed0d260392a40bc5d58e6d2651c6ddc0mukesh agrawal
3246791a43add38926966bd420e89541717fb2cb2b5Chris Masone  ASSERT_TRUE(profile_->AdoptService(service1));
3256791a43add38926966bd420e89541717fb2cb2b5Chris Masone  ASSERT_TRUE(profile_->AdoptService(service2));
3266791a43add38926966bd420e89541717fb2cb2b5Chris Masone
3271b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart  Error error;
3281b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart  ASSERT_EQ(2, profile_->EnumerateEntries(&error).size());
3296791a43add38926966bd420e89541717fb2cb2b5Chris Masone
3306515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AbandonService(service1));
3311b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart  ASSERT_EQ(service2_storage_name, profile_->EnumerateEntries(&error)[0]);
3326791a43add38926966bd420e89541717fb2cb2b5Chris Masone
3336515aabcd1fbbb9ff2090c9675c17eeef64e7474Chris Masone  ASSERT_TRUE(profile_->AbandonService(service2));
3341b2531423a15ccc5ac5acaf09edac9a687902dfaPaul Stewart  ASSERT_EQ(0, profile_->EnumerateEntries(&error).size());
3356791a43add38926966bd420e89541717fb2cb2b5Chris Masone}
3366791a43add38926966bd420e89541717fb2cb2b5Chris Masone
33778af94ce5ff7c3f22bda6148c6115ec8591129a5Paul StewartTEST_F(ProfileTest, LoadUserProfileList) {
33878af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  FilePath list_path(FilePath(storage_path()).Append("test.profile"));
33978af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  vector<Profile::Identifier> identifiers =
34078af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart      Profile::LoadUserProfileList(list_path);
34178af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_TRUE(identifiers.empty());
34278af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart
34378af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kUser0[] = "scarecrow";
34478af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kUser1[] = "jeans";
34578af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kIdentifier0[] = "rattlesnake";
34678af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kIdentifier1[] = "ceiling";
34778af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kHash0[] = "neighbors";
34878af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  string data(base::StringPrintf("\n"
34978af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 "~userbut/nospacehere\n"
35078af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 "defaultprofile notaccepted\n"
35178af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 "~%s/%s %s\n"
35278af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 "~userbutno/hash\n"
35378af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 " ~dontaccept/leadingspaces hash\n"
35478af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 "~this_username_fails_to_parse/id hash\n"
35578af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 "~%s/%s \n\n",
35678af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 kUser0, kIdentifier0, kHash0,
35778af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart                                 kUser1, kIdentifier1));
3586fbf64f493a9aae7d743888039c61a57386203dbBen Chan  EXPECT_EQ(data.size(), base::WriteFile(list_path, data.data(), data.size()));
35978af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  identifiers = Profile::LoadUserProfileList(list_path);
36078af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_EQ(2, identifiers.size());
36178af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_EQ(kUser0, identifiers[0].user);
36278af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_EQ(kIdentifier0, identifiers[0].identifier);
36378af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_EQ(kHash0, identifiers[0].user_hash);
36478af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_EQ(kUser1, identifiers[1].user);
36578af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_EQ(kIdentifier1, identifiers[1].identifier);
36678af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_EQ("", identifiers[1].user_hash);
36778af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart}
36878af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart
36978af94ce5ff7c3f22bda6148c6115ec8591129a5Paul StewartTEST_F(ProfileTest, SaveUserProfileList) {
37078af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kUser0[] = "user0";
37178af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kIdentifier0[] = "id0";
37278af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  Profile::Identifier id0(kUser0, kIdentifier0);
37378af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kHash0[] = "hash0";
37478af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  id0.user_hash = kHash0;
37578af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  vector<ProfileRefPtr> profiles;
376d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal  profiles.push_back(new Profile(
377d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      control_interface(), metrics(), manager(), id0, FilePath(), false));
37878af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart
37978af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kUser1[] = "user1";
38078af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kIdentifier1[] = "id1";
38178af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  Profile::Identifier id1(kUser1, kIdentifier1);
38278af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kHash1[] = "hash1";
38378af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  id1.user_hash = kHash1;
384d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal  profiles.push_back(new Profile(
385d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      control_interface(), metrics(), manager(), id1, FilePath(), false));
38678af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart
38778af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart
38878af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kIdentifier2[] = "id2";
38978af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  Profile::Identifier id2("", kIdentifier2);
39078af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  const char kHash2[] = "hash2";
39178af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  id1.user_hash = kHash2;
392d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal  profiles.push_back(new Profile(
393d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      control_interface(), metrics(), manager(), id2, FilePath(), false));
39478af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart
39578af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  FilePath list_path(FilePath(storage_path()).Append("test.profile"));
39678af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  EXPECT_TRUE(Profile::SaveUserProfileList(list_path, profiles));
39778af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart
39878af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart  string profile_data;
399a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_TRUE(base::ReadFileToString(list_path, &profile_data));
400a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan  EXPECT_EQ(base::StringPrintf("~%s/%s %s\n~%s/%s %s\n",
401a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan                               kUser0, kIdentifier0, kHash0,
402a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan                               kUser1, kIdentifier1, kHash1),
40378af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart            profile_data);
40478af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart}
40578af94ce5ff7c3f22bda6148c6115ec8591129a5Paul Stewart
4065dc40aad05908dc435e623e56392780ef6d1079ePaul StewartTEST_F(ProfileTest, MatchesIdentifier) {
4075dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  static const char kUser[] = "theUser";
4085dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  static const char kIdentifier[] = "theIdentifier";
4095dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  Profile::Identifier id(kUser, kIdentifier);
410d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal  ProfileRefPtr profile(new Profile(
411d48e8140b17d9f04e9848e1e638c483450a5dcfcmukesh agrawal      control_interface(), metrics(), manager(), id, FilePath(), false));
4125dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_TRUE(profile->MatchesIdentifier(id));
4135dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_FALSE(profile->MatchesIdentifier(Profile::Identifier(kUser, "")));
4145dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_FALSE(
4155dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart      profile->MatchesIdentifier(Profile::Identifier("", kIdentifier)));
4165dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_FALSE(
4175dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart      profile->MatchesIdentifier(Profile::Identifier(kIdentifier, kUser)));
4185dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart}
4195dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
4205dc40aad05908dc435e623e56392780ef6d1079ePaul StewartTEST_F(ProfileTest, InitStorage) {
4215dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  Profile::Identifier id("theUser", "theIdentifier");
4220a59a5a484634f798222ad077dbbfa7faa76651dmukesh agrawal  ASSERT_TRUE(base::CreateDirectory(
4230a59a5a484634f798222ad077dbbfa7faa76651dmukesh agrawal      base::FilePath(storage_path()).Append("theUser")));
4245dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
4255dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // Profile doesn't exist but we wanted it to.
4265dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_FALSE(ProfileInitStorage(id, Profile::kOpenExisting, false,
4275dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                                  Error::kNotFound));
4285dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
4295dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // Success case, with a side effect of creating the profile.
4305dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_TRUE(ProfileInitStorage(id, Profile::kCreateNew, true,
4315dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                                 Error::kSuccess));
4325dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
4335dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // The results from our two test cases above will now invert since
4345dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // the profile now exists.  First, we now succeed if we require that
4355dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // the profile already exist...
4365dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_TRUE(ProfileInitStorage(id, Profile::kOpenExisting, false,
4375dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                                 Error::kSuccess));
4385dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
4395dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // And we fail if we require that it doesn't.
4405dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_FALSE(ProfileInitStorage(id, Profile::kCreateNew, false,
4415dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                                  Error::kAlreadyExists));
4425dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
4435dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // As a sanity check, ensure "create or open" works for both profile-exists...
4445dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_TRUE(ProfileInitStorage(id, Profile::kCreateOrOpenExisting, false,
4455dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                                 Error::kSuccess));
4465dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
4475dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // ...and for a new profile that doesn't exist.
4485dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  Profile::Identifier id2("theUser", "theIdentifier2");
4495dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // Let's just make double-check that this profile really doesn't exist.
4505dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  ASSERT_FALSE(ProfileInitStorage(id2, Profile::kOpenExisting, false,
4515dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                                  Error::kNotFound));
4525dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
4535dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  // Then test that with "create or open" we succeed.
4545dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart  EXPECT_TRUE(ProfileInitStorage(id2, Profile::kCreateOrOpenExisting, false,
4555dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart                                 Error::kSuccess));
4562ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart
4572ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart  // Corrupt the profile storage.
4582ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart  FilePath final_path(
4590a59a5a484634f798222ad077dbbfa7faa76651dmukesh agrawal      base::StringPrintf("%s/%s/%s.profile", storage_path().c_str(),
4600a59a5a484634f798222ad077dbbfa7faa76651dmukesh agrawal                         id.user.c_str(), id.identifier.c_str()));
461e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal#ifdef ENABLE_JSON_STORE
462e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal  final_path = final_path.AddExtension("json");
463e48186532acb04b9e11efc9b9334dd555ffcae29mukesh agrawal#endif
4642ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart  string data = "]corrupt_data[";
4656fbf64f493a9aae7d743888039c61a57386203dbBen Chan  EXPECT_EQ(data.size(), base::WriteFile(final_path, data.data(), data.size()));
4662ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart
4672ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart  // Then test that we fail to open this file.
4685133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le  EXPECT_CALL(*mock_metrics_, NotifyCorruptedProfile());
4692ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart  EXPECT_FALSE(ProfileInitStorage(id, Profile::kOpenExisting, false,
4702ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart                                  Error::kInternalError));
4715133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le  Mock::VerifyAndClearExpectations(mock_metrics_.get());
4722ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart
4732ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart  // But then on a second try the file no longer exists.
4745133b71eaa00535739ebbddd8a8f31cd8fcf33a8Thieu Le  EXPECT_CALL(*mock_metrics_, NotifyCorruptedProfile()).Times(0);
4752ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart  ASSERT_FALSE(ProfileInitStorage(id, Profile::kOpenExisting, false,
4762ebc16da6068c8c61658b39cf70d157d7d0911ebPaul Stewart                                  Error::kNotFound));
4775dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart}
4785dc40aad05908dc435e623e56392780ef6d1079ePaul Stewart
479e7c6ad35cafed32a0fd1390487c74e66eae1961dDarin PetkovTEST_F(ProfileTest, UpdateDevice) {
480cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  EXPECT_FALSE(profile_->UpdateDevice(nullptr));
481e7c6ad35cafed32a0fd1390487c74e66eae1961dDarin Petkov}
482e7c6ad35cafed32a0fd1390487c74e66eae1961dDarin Petkov
48318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter QiuTEST_F(ProfileTest, GetServiceFromEntry) {
48418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  std::unique_ptr<MockManager> manager(new StrictMock<MockManager>(
485bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal      control_interface(), dispatcher(), metrics()));
48618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  profile_->manager_ = manager.get();
48718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
4883b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart  MockStore* storage(new StrictMock<MockStore>());
48918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  profile_->storage_.reset(storage);  // Passes ownership
49018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  const string kEntryName("entry_name");
49118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
49218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // If entry does not appear in storage, GetServiceFromEntry() should return
49318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // an error.
49418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_CALL(*storage, ContainsGroup(kEntryName))
49518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      .WillOnce(Return(false));
49618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  {
49718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    Error error;
49818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    profile_->GetServiceFromEntry(kEntryName, &error);
49918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    EXPECT_EQ(Error::kNotFound, error.type());
50018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  }
50118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Mock::VerifyAndClearExpectations(storage);
50218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
50318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_CALL(*storage, ContainsGroup(kEntryName))
50418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      .WillRepeatedly(Return(true));
50518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
50618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // Service entry already registered with the manager, the registered service
50718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // is returned.
50818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  scoped_refptr<MockService> registered_service(CreateMockService());
50918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_CALL(*manager.get(),
51018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              GetServiceWithStorageIdentifier(profile_, kEntryName, _))
51118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      .WillOnce(Return(registered_service));
51218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  {
51318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    Error error;
51418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    EXPECT_EQ(registered_service,
51518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              profile_->GetServiceFromEntry(kEntryName, &error));
51618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    EXPECT_TRUE(error.IsSuccess());
51718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  }
51818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Mock::VerifyAndClearExpectations(manager.get());
51918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
52018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // Service entry not registered with the manager, a temporary service is
52118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  // created/returned.
52218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  scoped_refptr<MockService> temporary_service(CreateMockService());
52318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_CALL(*manager.get(),
52418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              GetServiceWithStorageIdentifier(profile_, kEntryName, _))
52518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      .WillOnce(Return(nullptr));
52618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  EXPECT_CALL(*manager.get(),
52718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              CreateTemporaryServiceFromProfile(profile_, kEntryName, _))
52818213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu      .WillOnce(Return(temporary_service));
52918213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  {
53018213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    Error error;
53118213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    EXPECT_EQ(temporary_service,
53218213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu              profile_->GetServiceFromEntry(kEntryName, &error));
53318213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu    EXPECT_TRUE(error.IsSuccess());
53418213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  }
53518213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu  Mock::VerifyAndClearExpectations(manager.get());
53618213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu}
53718213652e2ce4c6e4354951e5b665097b7a7aa6bPeter Qiu
5387355ce1937c504d836a303ac809bd436272212b3Paul Stewart}  // namespace shill
539