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