152e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET/* 252e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Copyright (C) 2015 The Android Open Source Project 352e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 452e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Licensed under the Apache License, Version 2.0 (the "License"); 552e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * you may not use this file except in compliance with the License. 652e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * You may obtain a copy of the License at 752e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 852e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * http://www.apache.org/licenses/LICENSE-2.0 952e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * 1052e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * Unless required by applicable law or agreed to in writing, software 1152e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * distributed under the License is distributed on an "AS IS" BASIS, 1252e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1352e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * See the License for the specific language governing permissions and 1452e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET * limitations under the License. 1552e5b99983c1f7ff0b9a1f3b4b80d779073b21c8Bertrand SIMONNET */ 1646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 176c9fbb9a3aaee50302d54de8f27fc712c836b9eaBertrand SIMONNET#include <memory> 1846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 191253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET#include <base/at_exit.h> 201253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET#include <base/files/file_util.h> 211253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET#include <base/files/scoped_temp_dir.h> 221253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET#include <base/logging.h> 236b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET#include <base/metrics/sparse_histogram.h> 246b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET#include <base/metrics/statistics_recorder.h> 251253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET#include <base/sys_info.h> 266c9fbb9a3aaee50302d54de8f27fc712c836b9eaBertrand SIMONNET#include <gtest/gtest.h> 271253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 281253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET#include "constants.h" 291df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET#include "persistent_integer.h" 304b915ae1b226889da266c480c1ce90f6dd9f86b9Bertrand SIMONNET#include "uploader/metrics_log.h" 314b915ae1b226889da266c480c1ce90f6dd9f86b9Bertrand SIMONNET#include "uploader/mock/mock_system_profile_setter.h" 324b915ae1b226889da266c480c1ce90f6dd9f86b9Bertrand SIMONNET#include "uploader/mock/sender_mock.h" 334b915ae1b226889da266c480c1ce90f6dd9f86b9Bertrand SIMONNET#include "uploader/proto/chrome_user_metrics_extension.pb.h" 344b915ae1b226889da266c480c1ce90f6dd9f86b9Bertrand SIMONNET#include "uploader/proto/histogram_event.pb.h" 354b915ae1b226889da266c480c1ce90f6dd9f86b9Bertrand SIMONNET#include "uploader/proto/system_profile.pb.h" 364b915ae1b226889da266c480c1ce90f6dd9f86b9Bertrand SIMONNET#include "uploader/system_profile_cache.h" 374b915ae1b226889da266c480c1ce90f6dd9f86b9Bertrand SIMONNET#include "uploader/upload_service.h" 3846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 3946b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETclass UploadServiceTest : public testing::Test { 4046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET protected: 4146b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET virtual void SetUp() { 4246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET CHECK(dir_.CreateUniqueTempDir()); 436b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // Make sure the statistics recorder is inactive (contains no metrics) then 446b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // initialize it. 456b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET ASSERT_FALSE(base::StatisticsRecorder::IsActive()); 466b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET base::StatisticsRecorder::Initialize(); 479d3a4aeae2bd59ebe72fca44c4fa508c1e9f1333Bertrand SIMONNET 480586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET private_dir_ = dir_.path().Append("private"); 490586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET shared_dir_ = dir_.path().Append("shared"); 509d3a4aeae2bd59ebe72fca44c4fa508c1e9f1333Bertrand SIMONNET 510586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET EXPECT_TRUE(base::CreateDirectory(private_dir_)); 520586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET EXPECT_TRUE(base::CreateDirectory(shared_dir_)); 539d3a4aeae2bd59ebe72fca44c4fa508c1e9f1333Bertrand SIMONNET 540586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET ASSERT_EQ(0, base::WriteFile(shared_dir_.Append(metrics::kConsentFileName), 559d3a4aeae2bd59ebe72fca44c4fa508c1e9f1333Bertrand SIMONNET "", 0)); 566b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 570586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET upload_service_.reset(new UploadService( 580586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET "", base::TimeDelta(), base::TimeDelta(), private_dir_, shared_dir_)); 59b6c77af4993b5e5a83fd1ed80309823e44f70650Bertrand SIMONNET counters_ = upload_service_->counters_; 6046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 611253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->sender_.reset(new SenderMock); 62608e428006fa317badd51b941e05bdba42bd08bdBertrand SIMONNET upload_service_->InitForTest(new MockSystemProfileSetter); 631253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->GatherHistograms(); 641253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->Reset(); 6546b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET } 6646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 676b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET void SendSparseHistogram(const std::string& name, int sample) { 686b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET base::HistogramBase* histogram = base::SparseHistogram::FactoryGet( 696b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET name, base::Histogram::kUmaTargetedHistogramFlag); 706b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET histogram->Add(sample); 716b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET } 726b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 736b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET void SendHistogram( 746b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET const std::string& name, int sample, int min, int max, int nbuckets) { 756b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET base::HistogramBase* histogram = base::Histogram::FactoryGet( 766b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET name, min, max, nbuckets, base::Histogram::kUmaTargetedHistogramFlag); 776b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET histogram->Add(sample); 7846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET } 7946b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 801253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET void SetTestingProperty(const std::string& name, const std::string& value) { 81608e428006fa317badd51b941e05bdba42bd08bdBertrand SIMONNET base::FilePath filepath = 82608e428006fa317badd51b941e05bdba42bd08bdBertrand SIMONNET dir_.path().Append("etc/os-release.d").Append(name); 83eb697abf5eca1639aba7111e9a737987a1e3124cBertrand SIMONNET ASSERT_TRUE(base::CreateDirectory(filepath.DirName())); 840586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET ASSERT_EQ(value.size(), 850586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET base::WriteFile(filepath, value.data(), value.size())); 861253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET } 871253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 886b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET const metrics::SystemProfileProto_Stability GetCurrentStability() { 896c9fbb9a3aaee50302d54de8f27fc712c836b9eaBertrand SIMONNET EXPECT_TRUE(upload_service_->current_log_.get()); 906b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 910586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET return upload_service_->current_log_->uma_proto() 920586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET ->system_profile() 930586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET .stability(); 946b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET } 956b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 9646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET base::ScopedTempDir dir_; 976c9fbb9a3aaee50302d54de8f27fc712c836b9eaBertrand SIMONNET std::unique_ptr<UploadService> upload_service_; 9846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 996c9fbb9a3aaee50302d54de8f27fc712c836b9eaBertrand SIMONNET std::unique_ptr<base::AtExitManager> exit_manager_; 1006b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET std::shared_ptr<CrashCounters> counters_; 1010586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET base::FilePath private_dir_; 1020586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET base::FilePath shared_dir_; 10346b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET}; 10446b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 10546b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, FailedSendAreRetried) { 1061253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SenderMock* sender = new SenderMock(); 1071253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->sender_.reset(sender); 10846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1091253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET sender->set_should_succeed(false); 11046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1116b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendSparseHistogram("hello", 1); 1121253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 1131253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_EQ(1, sender->send_call_count()); 1141253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET std::string sent_string = sender->last_message(); 1151253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 1161253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 1171253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_EQ(2, sender->send_call_count()); 1181253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_EQ(sent_string, sender->last_message()); 11946b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 12046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 12146b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, DiscardLogsAfterTooManyFailedUpload) { 1221253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SenderMock* sender = new SenderMock(); 1231253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->sender_.reset(sender); 1241253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 1251253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET sender->set_should_succeed(false); 1261253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 1276b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendSparseHistogram("hello", 1); 12846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 12946b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET for (int i = 0; i < UploadService::kMaxFailedUpload; i++) { 1301253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 13146b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET } 13246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1331df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET EXPECT_TRUE(upload_service_->HasStagedLog()); 1341253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 1351df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET EXPECT_FALSE(upload_service_->HasStagedLog()); 1361df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET 1371df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET // Log a new sample. The failed upload counter should be reset. 1386b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendSparseHistogram("hello", 1); 1391df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET for (int i = 0; i < UploadService::kMaxFailedUpload; i++) { 1401df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET upload_service_->UploadEvent(); 1411df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET } 1421df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET // The log is not discarded after multiple failed uploads. 1431df10c43eab5b8c483fbf882a0c8a6e5e59c73c0Bertrand SIMONNET EXPECT_TRUE(upload_service_->HasStagedLog()); 14446b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 14546b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 14646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, EmptyLogsAreNotSent) { 1471253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SenderMock* sender = new SenderMock(); 1481253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->sender_.reset(sender); 1491253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 1501253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_FALSE(upload_service_->current_log_); 1511253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_EQ(0, sender->send_call_count()); 15246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 15346b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 15446b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, LogEmptyByDefault) { 155b6c77af4993b5e5a83fd1ed80309823e44f70650Bertrand SIMONNET // current_log_ should be initialized later as it needs AtExitManager to exist 15646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET // in order to gather system information from SysInfo. 157b6c77af4993b5e5a83fd1ed80309823e44f70650Bertrand SIMONNET EXPECT_FALSE(upload_service_->current_log_); 15846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 15946b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 16046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, CanSendMultipleTimes) { 1611253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SenderMock* sender = new SenderMock(); 1621253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->sender_.reset(sender); 1631253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 1646b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendSparseHistogram("hello", 1); 1656b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 1661253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 16746b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1681253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET std::string first_message = sender->last_message(); 1696b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendSparseHistogram("hello", 2); 17046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1711253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 17246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1731253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_NE(first_message, sender->last_message()); 17446b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 17546b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 17646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, LogEmptyAfterUpload) { 1776b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendSparseHistogram("hello", 2); 17846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1791253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 1801253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_FALSE(upload_service_->current_log_); 18146b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 18246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 18346b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, LogContainsAggregatedValues) { 1846b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendHistogram("foo", 11, 0, 42, 10); 1856b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendHistogram("foo", 12, 0, 42, 10); 18646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1871253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->GatherHistograms(); 18846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET metrics::ChromeUserMetricsExtension* proto = 1891253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->current_log_->uma_proto(); 19046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET EXPECT_EQ(1, proto->histogram_event().size()); 19146b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 19246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 1936b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNETTEST_F(UploadServiceTest, LogContainsCrashCounts) { 1946b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // By default, there is no current log. 1956b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET upload_service_->GatherHistograms(); 1966b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET EXPECT_FALSE(upload_service_->current_log_); 1976b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 1986b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // If the user crash counter is incremented, we add the count to the current 1996b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // log. 2006b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET counters_->IncrementUserCrashCount(); 2016b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET upload_service_->GatherHistograms(); 2026b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET EXPECT_EQ(1, GetCurrentStability().other_user_crash_count()); 2036b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 2046b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // If the kernel crash counter is incremented, we add the count to the current 2056b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // log. 2066b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET counters_->IncrementKernelCrashCount(); 2076b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET upload_service_->GatherHistograms(); 2086b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET EXPECT_EQ(1, GetCurrentStability().kernel_crash_count()); 2096b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 2106b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // If the kernel crash counter is incremented, we add the count to the current 2116b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // log. 2126b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET counters_->IncrementUncleanShutdownCount(); 2136b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET counters_->IncrementUncleanShutdownCount(); 2146b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET upload_service_->GatherHistograms(); 2156b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET EXPECT_EQ(2, GetCurrentStability().unclean_system_shutdown_count()); 2166b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 2176b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET // If no counter is incremented, the reported numbers don't change. 2186b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET upload_service_->GatherHistograms(); 2196b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET EXPECT_EQ(1, GetCurrentStability().other_user_crash_count()); 2206b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET EXPECT_EQ(1, GetCurrentStability().kernel_crash_count()); 2216b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET EXPECT_EQ(2, GetCurrentStability().unclean_system_shutdown_count()); 2226b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET} 2236b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 22446b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, ExtractChannelFromString) { 2250586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET EXPECT_EQ(SystemProfileCache::ProtoChannelFromString("developer-build"), 2260586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET metrics::SystemProfileProto::CHANNEL_UNKNOWN); 22746b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 22846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET EXPECT_EQ(metrics::SystemProfileProto::CHANNEL_DEV, 229dc225c82248d7df6acb7cdd9f18866511351cb2cBertrand SIMONNET SystemProfileCache::ProtoChannelFromString("dev-channel")); 2301253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 2311253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_EQ(metrics::SystemProfileProto::CHANNEL_STABLE, 232dc225c82248d7df6acb7cdd9f18866511351cb2cBertrand SIMONNET SystemProfileCache::ProtoChannelFromString("stable-channel")); 23346b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 23446b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET EXPECT_EQ(metrics::SystemProfileProto::CHANNEL_UNKNOWN, 2351253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SystemProfileCache::ProtoChannelFromString("this is a test")); 23646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 23746b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 23846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, ValuesInConfigFileAreSent) { 2391253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SenderMock* sender = new SenderMock(); 2401253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->sender_.reset(sender); 2411253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 242eb697abf5eca1639aba7111e9a737987a1e3124cBertrand SIMONNET SetTestingProperty(metrics::kProductId, "hello"); 243eb697abf5eca1639aba7111e9a737987a1e3124cBertrand SIMONNET SetTestingProperty(metrics::kProductVersion, "1.2.3.4"); 2441253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET 2456b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET SendSparseHistogram("hello", 1); 2466b8629a6490d01196368ae1ed5bc6967c6f127ebBertrand SIMONNET 24746b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET // Reset to create the new log with the profile setter. 2481253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->system_profile_setter_.reset( 2491253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET new SystemProfileCache(true, dir_.path())); 2501253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->Reset(); 2511253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET upload_service_->UploadEvent(); 25246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 2531253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_EQ(1, sender->send_call_count()); 2541253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_TRUE(sender->is_good_proto()); 2551253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_EQ(1, sender->last_message_proto().histogram_event().size()); 25646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 2571253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_NE(0, sender->last_message_proto().client_id()); 2581253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_NE(0, sender->last_message_proto().system_profile().build_timestamp()); 2591253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_NE(0, sender->last_message_proto().session_id()); 26046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 26146b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 26246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, PersistentGUID) { 26346b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET std::string tmp_file = dir_.path().Append("tmpfile").value(); 26446b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 26546b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET std::string first_guid = SystemProfileCache::GetPersistentGUID(tmp_file); 26646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET std::string second_guid = SystemProfileCache::GetPersistentGUID(tmp_file); 26746b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 26846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET // The GUID are cached. 26946b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET EXPECT_EQ(first_guid, second_guid); 27046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 27146b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET base::DeleteFile(base::FilePath(tmp_file), false); 27246b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 27346b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET first_guid = SystemProfileCache::GetPersistentGUID(tmp_file); 27446b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET base::DeleteFile(base::FilePath(tmp_file), false); 27546b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET second_guid = SystemProfileCache::GetPersistentGUID(tmp_file); 27646b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 27746b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET // Random GUIDs are generated (not all the same). 27846b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET EXPECT_NE(first_guid, second_guid); 27946b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 28046b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET 28146b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNETTEST_F(UploadServiceTest, SessionIdIncrementedAtInitialization) { 282eb697abf5eca1639aba7111e9a737987a1e3124cBertrand SIMONNET SetTestingProperty(metrics::kProductId, "hello"); 2831253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET SystemProfileCache cache(true, dir_.path()); 2841253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET cache.Initialize(); 2851253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET int session_id = cache.profile_.session_id; 2861253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET cache.initialized_ = false; 2871253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET cache.Initialize(); 2881253186728abd35d7177008598627e7b872974e5Bertrand SIMONNET EXPECT_EQ(cache.profile_.session_id, session_id + 1); 28946b49da5ad156911cf17aa79f373d90595063ba0Bertrand SIMONNET} 2904c8a8ad3bf6d4906b29b2d11afd400f107ceec9aBertrand SIMONNET 2911d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET// The product id must be set for metrics to be uploaded. 2921d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET// If it is not set, the system profile cache should fail to initialize. 2931d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNETTEST_F(UploadServiceTest, ProductIdMandatory) { 2941d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET SystemProfileCache cache(true, dir_.path()); 2951d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET ASSERT_FALSE(cache.Initialize()); 2961d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET SetTestingProperty(metrics::kProductId, ""); 2971d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET ASSERT_FALSE(cache.Initialize()); 2981d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET SetTestingProperty(metrics::kProductId, "hello"); 2991d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET ASSERT_TRUE(cache.Initialize()); 3001d15d46e1758052d25436e78487d5a778d0a3bc6Bertrand SIMONNET} 3010586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET 3020586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNETTEST_F(UploadServiceTest, CurrentLogSavedAndResumed) { 3030586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET SendHistogram("hello", 10, 0, 100, 10); 3040586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET upload_service_->PersistToDisk(); 3050586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET EXPECT_EQ( 3060586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET 1, upload_service_->current_log_->uma_proto()->histogram_event().size()); 3070586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET upload_service_.reset(new UploadService( 3080586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET "", base::TimeDelta(), base::TimeDelta(), private_dir_, shared_dir_)); 3090586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET upload_service_->InitForTest(nullptr); 3100586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET 3110586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET SendHistogram("hello", 10, 0, 100, 10); 3120586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET upload_service_->GatherHistograms(); 3130586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET EXPECT_EQ(2, upload_service_->GetOrCreateCurrentLog() 3140586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET ->uma_proto() 3150586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET ->histogram_event() 3160586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET .size()); 3170586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET} 3180586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET 3190586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNETTEST_F(UploadServiceTest, PersistEmptyLog) { 3200586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET upload_service_->PersistToDisk(); 3210586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET EXPECT_FALSE(base::PathExists(upload_service_->saved_log_path_)); 3220586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET} 3230586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET 3240586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNETTEST_F(UploadServiceTest, CorruptedSavedLog) { 3250586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET // Write a bogus saved log. 3260586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET EXPECT_EQ(5, base::WriteFile(upload_service_->saved_log_path_, "hello", 5)); 3270586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET 3280586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET upload_service_.reset(new UploadService( 3290586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET "", base::TimeDelta(), base::TimeDelta(), private_dir_, shared_dir_)); 3300586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET 3310586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET upload_service_->InitForTest(nullptr); 3320586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET // If the log is unreadable, we drop it and continue execution. 3330586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET ASSERT_NE(nullptr, upload_service_->GetOrCreateCurrentLog()); 3340586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET ASSERT_FALSE(base::PathExists(upload_service_->saved_log_path_)); 3350586504e01784b054944ca12f816880e27dfc2e7Bertrand SIMONNET} 336