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