summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-27 22:31:51 +0000
committerstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-27 22:31:51 +0000
commitaa752c3f3c06918c0d684044c8418d3a6f33c37c (patch)
treed8b9b4458b9c7eb0b5741762890c0db2ef292c10
parent98ae4a3d3ca74c8de31122951d54709b57faff08 (diff)
downloadchromium_src-aa752c3f3c06918c0d684044c8418d3a6f33c37c.zip
chromium_src-aa752c3f3c06918c0d684044c8418d3a6f33c37c.tar.gz
chromium_src-aa752c3f3c06918c0d684044c8418d3a6f33c37c.tar.bz2
Fix log type preservation across log pausing
This was causing the first ongoing log to be stored as an initial log instead of an ongoing log (if it was stored instead of being sent). BUG=None TEST=None Review URL: http://codereview.chromium.org/10134051 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@134375 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/common/metrics/metrics_log_manager.cc18
-rw-r--r--chrome/common/metrics/metrics_log_manager.h2
-rw-r--r--chrome/common/metrics/metrics_log_manager_unittest.cc24
3 files changed, 42 insertions, 2 deletions
diff --git a/chrome/common/metrics/metrics_log_manager.cc b/chrome/common/metrics/metrics_log_manager.cc
index 078f9b4..2326cc8 100644
--- a/chrome/common/metrics/metrics_log_manager.cc
+++ b/chrome/common/metrics/metrics_log_manager.cc
@@ -22,8 +22,9 @@ const char kDiscardedLog[] = "Log discarded";
} // anonymous namespace
-MetricsLogManager::MetricsLogManager() : current_log_type_(INITIAL_LOG),
- staged_log_type_(INITIAL_LOG),
+MetricsLogManager::MetricsLogManager() : current_log_type_(NO_LOG),
+ paused_log_type_(NO_LOG),
+ staged_log_type_(NO_LOG),
max_ongoing_log_store_size_(0) {}
MetricsLogManager::~MetricsLogManager() {}
@@ -40,6 +41,7 @@ void MetricsLogManager::SerializedLog::swap(SerializedLog& log) {
void MetricsLogManager::BeginLoggingWithLog(MetricsLogBase* log,
LogType log_type) {
+ DCHECK(log_type != NO_LOG);
DCHECK(!current_log_.get());
current_log_.reset(log);
current_log_type_ = log_type;
@@ -47,12 +49,14 @@ void MetricsLogManager::BeginLoggingWithLog(MetricsLogBase* log,
void MetricsLogManager::FinishCurrentLog() {
DCHECK(current_log_.get());
+ DCHECK(current_log_type_ != NO_LOG);
current_log_->CloseLog();
SerializedLog compressed_log;
CompressCurrentLog(&compressed_log);
if (!compressed_log.empty())
StoreLog(&compressed_log, current_log_type_);
current_log_.reset();
+ current_log_type_ = NO_LOG;
}
void MetricsLogManager::StageNextLogForUpload() {
@@ -64,6 +68,7 @@ void MetricsLogManager::StageNextLogForUpload() {
: INITIAL_LOG;
DCHECK(!source_list->empty());
DCHECK(staged_log_text_.empty());
+ DCHECK(staged_log_type_ == NO_LOG);
staged_log_text_.swap(source_list->back());
staged_log_type_ = source_type;
source_list->pop_back();
@@ -80,6 +85,7 @@ bool MetricsLogManager::has_staged_log_proto() const {
void MetricsLogManager::DiscardStagedLog() {
staged_log_text_.xml.clear();
staged_log_text_.proto.clear();
+ staged_log_type_ = NO_LOG;
}
void MetricsLogManager::DiscardStagedLogProto() {
@@ -89,16 +95,23 @@ void MetricsLogManager::DiscardStagedLogProto() {
void MetricsLogManager::DiscardCurrentLog() {
current_log_->CloseLog();
current_log_.reset();
+ current_log_type_ = NO_LOG;
}
void MetricsLogManager::PauseCurrentLog() {
DCHECK(!paused_log_.get());
+ DCHECK(paused_log_type_ == NO_LOG);
paused_log_.reset(current_log_.release());
+ paused_log_type_ = current_log_type_;
+ current_log_type_ = NO_LOG;
}
void MetricsLogManager::ResumePausedLog() {
DCHECK(!current_log_.get());
+ DCHECK(current_log_type_ == NO_LOG);
current_log_.reset(paused_log_.release());
+ current_log_type_ = paused_log_type_;
+ paused_log_type_ = NO_LOG;
}
void MetricsLogManager::StoreStagedLogAsUnsent() {
@@ -113,6 +126,7 @@ void MetricsLogManager::StoreStagedLogAsUnsent() {
}
void MetricsLogManager::StoreLog(SerializedLog* log_text, LogType log_type) {
+ DCHECK(log_type != NO_LOG);
std::vector<SerializedLog>* destination_list =
(log_type == INITIAL_LOG) ? &unsent_initial_logs_
: &unsent_ongoing_logs_;
diff --git a/chrome/common/metrics/metrics_log_manager.h b/chrome/common/metrics/metrics_log_manager.h
index d1e245e..426cadb 100644
--- a/chrome/common/metrics/metrics_log_manager.h
+++ b/chrome/common/metrics/metrics_log_manager.h
@@ -37,6 +37,7 @@ class MetricsLogManager {
enum LogType {
INITIAL_LOG, // The first log of a session.
ONGOING_LOG, // Subsequent logs in a session.
+ NO_LOG, // Placeholder value for when there is no log.
};
// Takes ownership of |log|, which has type |log_type|, and makes it the
@@ -156,6 +157,7 @@ class MetricsLogManager {
// A paused, previously-current log.
scoped_ptr<MetricsLogBase> paused_log_;
+ LogType paused_log_type_;
// Helper class to handle serialization/deserialization of logs for persistent
// storage. May be NULL.
diff --git a/chrome/common/metrics/metrics_log_manager_unittest.cc b/chrome/common/metrics/metrics_log_manager_unittest.cc
index d8be967..4369540 100644
--- a/chrome/common/metrics/metrics_log_manager_unittest.cc
+++ b/chrome/common/metrics/metrics_log_manager_unittest.cc
@@ -116,6 +116,30 @@ TEST(MetricsLogManagerTest, InterjectedLog) {
EXPECT_FALSE(log_manager.has_unsent_logs());
}
+TEST(MetricsLogManagerTest, InterjectedLogPreservesType) {
+ MetricsLogManager log_manager;
+
+ MetricsLogBase* ongoing_log = new MetricsLogBase("id", 0, "version");
+ MetricsLogBase* temp_log = new MetricsLogBase("id", 0, "version");
+
+ log_manager.BeginLoggingWithLog(ongoing_log, MetricsLogManager::ONGOING_LOG);
+ log_manager.PauseCurrentLog();
+ log_manager.BeginLoggingWithLog(temp_log, MetricsLogManager::INITIAL_LOG);
+ log_manager.FinishCurrentLog();
+ log_manager.ResumePausedLog();
+ log_manager.StageNextLogForUpload();
+ log_manager.DiscardStagedLog();
+
+ // Verify that the remaining log (which is the original ongoing log) still
+ // has the right type.
+ DummyLogSerializer* serializer = new DummyLogSerializer;
+ log_manager.set_log_serializer(serializer);
+ log_manager.FinishCurrentLog();
+ log_manager.PersistUnsentLogs();
+ EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG));
+ EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG));
+}
+
TEST(MetricsLogManagerTest, StoreAndLoad) {
std::vector<SerializedLog> initial_logs;
std::vector<SerializedLog> ongoing_logs;