Readability review.
Review URL: http://codereview.chromium.org/2729018
diff --git a/metrics/counter.cc b/metrics/counter.cc
index 58dbae4..b81a0d1 100644
--- a/metrics/counter.cc
+++ b/metrics/counter.cc
@@ -4,7 +4,7 @@
#include "counter.h"
-#include <sys/file.h>
+#include <fcntl.h>
#include <base/eintr_wrapper.h>
#include <base/logging.h>
@@ -12,26 +12,28 @@
namespace chromeos_metrics {
// TaggedCounter::Record implementation.
-void TaggedCounter::Record::Init(int tag, int count) {
+void TaggedCounter::Record::Init(int32 tag, int32 count) {
tag_ = tag;
count_ = (count > 0) ? count : 0;
}
-void TaggedCounter::Record::Add(int count) {
+void TaggedCounter::Record::Add(int32 count) {
if (count <= 0)
return;
- count_ += count;
-
- // Saturates on postive overflow.
- if (count_ < 0) {
- count_ = INT_MAX;
- }
+ // Saturates on positive overflow.
+ int64 new_count = static_cast<int64>(count_) + static_cast<int64>(count);
+ if (new_count > kint32max)
+ count_ = kint32max;
+ else
+ count_ = static_cast<int32>(new_count);
}
// TaggedCounter implementation.
TaggedCounter::TaggedCounter()
- : filename_(NULL), reporter_(NULL), reporter_handle_(NULL),
+ : filename_(NULL),
+ reporter_(NULL),
+ reporter_handle_(NULL),
record_state_(kRecordInvalid) {}
TaggedCounter::~TaggedCounter() {}
@@ -45,7 +47,7 @@
record_state_ = kRecordInvalid;
}
-void TaggedCounter::Update(int tag, int count) {
+void TaggedCounter::Update(int32 tag, int32 count) {
UpdateInternal(tag,
count,
false); // No flush.
@@ -57,7 +59,7 @@
true); // Do flush.
}
-void TaggedCounter::UpdateInternal(int tag, int count, bool flush) {
+void TaggedCounter::UpdateInternal(int32 tag, int32 count, bool flush) {
if (flush) {
// Flushing but record is null, so nothing to do.
if (record_state_ == kRecordNull)
@@ -104,11 +106,10 @@
record_state_ = kRecordNullDirty;
return;
}
-
record_state_ = kRecordNull;
}
-void TaggedCounter::ReportRecord(int tag, bool flush) {
+void TaggedCounter::ReportRecord(int32 tag, bool flush) {
// If no valid record, there's nothing to report.
if (record_state_ != kRecordValid) {
DCHECK_EQ(record_state_, kRecordNull);
@@ -126,7 +127,7 @@
record_state_ = kRecordNullDirty;
}
-void TaggedCounter::UpdateRecord(int tag, int count, bool flush) {
+void TaggedCounter::UpdateRecord(int32 tag, int32 count, bool flush) {
if (flush) {
DCHECK(record_state_ == kRecordNull || record_state_ == kRecordNullDirty);
return;
diff --git a/metrics/counter.h b/metrics/counter.h
index 876b107..1cfcb51 100644
--- a/metrics/counter.h
+++ b/metrics/counter.h
@@ -5,6 +5,7 @@
#ifndef METRICS_COUNTER_H_
#define METRICS_COUNTER_H_
+#include <base/basictypes.h>
#include <gtest/gtest_prod.h> // for FRIEND_TEST
namespace chromeos_metrics {
@@ -18,6 +19,11 @@
// event counts. The aggregated count is reported through the
// callback when the counter is explicitly flushed or when data for a
// new tag arrives.
+//
+// The primary reason for using an interface is to allow easier unit
+// testing in clients through mocking thus avoiding file access and
+// callbacks. Of course, it also enables alternative implementations
+// of the counter with additional features.
class TaggedCounterInterface {
public:
// Callback type used for reporting aggregated or flushed data.
@@ -27,7 +33,7 @@
// |handle| is the |reporter_handle| pointer passed through Init.
// |tag| is the tag associated with the aggregated count.
// |count| is aggregated count.
- typedef void (*Reporter)(void* handle, int tag, int count);
+ typedef void (*Reporter)(void* handle, int32 tag, int32 count);
virtual ~TaggedCounterInterface() {}
@@ -44,7 +50,7 @@
// Adds |count| of events for the given |tag|. If there's an
// existing aggregated count for a different tag, it's reported
// through the reporter callback and discarded.
- virtual void Update(int tag, int count) = 0;
+ virtual void Update(int32 tag, int32 count) = 0;
// Reports the current aggregated count (if any) through the
// reporter callback and discards it.
@@ -58,7 +64,7 @@
// Implementation of interface methods.
void Init(const char* filename, Reporter reporter, void* reporter_handle);
- void Update(int tag, int count);
+ void Update(int32 tag, int32 count);
void Flush();
private:
@@ -89,25 +95,25 @@
// Initializes with |tag| and |count|. If |count| is negative,
// |count_| is set to 0.
- void Init(int tag, int count);
+ void Init(int32 tag, int32 count);
// Adds |count| to the current |count_|. Negative |count| is
// ignored. In case of positive overflow, |count_| is saturated to
- // INT_MAX.
- void Add(int count);
+ // kint32max.
+ void Add(int32 count);
- int tag() const { return tag_; }
- int count() const { return count_; }
+ int32 tag() const { return tag_; }
+ int32 count() const { return count_; }
private:
- int tag_;
- int count_;
+ int32 tag_;
+ int32 count_;
};
// Implementation of the Update and Flush methods. Goes through the
// necessary steps to read, report, update, and sync the aggregated
// record.
- void UpdateInternal(int tag, int count, bool flush);
+ void UpdateInternal(int32 tag, int32 count, bool flush);
// If the current cached record is invalid, reads it from persistent
// storage specified through file descriptor |fd| and updates the
@@ -119,13 +125,13 @@
// or the new |tag| is different than the old one, reports the
// aggregated data through the reporter callback and resets the
// cached record.
- void ReportRecord(int tag, bool flush);
+ void ReportRecord(int32 tag, bool flush);
// Updates the cached record given the new |tag| and |count|. This
// method expects either a null cached record, or a valid cached
// record with the same tag as |tag|. If |flush| is true, the method
// asserts that the cached record is null and returns.
- void UpdateRecord(int tag, int count, bool flush);
+ void UpdateRecord(int32 tag, int32 count, bool flush);
// If the cached record state is dirty, updates the persistent
// storage specified through file descriptor |fd| and switches the
diff --git a/metrics/counter_mock.h b/metrics/counter_mock.h
index 22327ac..baa97b0 100644
--- a/metrics/counter_mock.h
+++ b/metrics/counter_mock.h
@@ -24,3 +24,4 @@
} // namespace chromeos_metrics
#endif // METRICS_COUNTER_MOCK_H_
+
diff --git a/metrics/counter_test.cc b/metrics/counter_test.cc
index 605e859..fd5a389 100644
--- a/metrics/counter_test.cc
+++ b/metrics/counter_test.cc
@@ -62,8 +62,8 @@
// Asserts that the record file contains the specified contents.
testing::AssertionResult AssertRecord(const char* expr_tag,
const char* expr_count,
- int expected_tag,
- int expected_count) {
+ int32 expected_tag,
+ int32 expected_count) {
int fd = HANDLE_EINTR(open(kTestRecordFile, O_RDONLY));
if (fd < 0) {
testing::Message msg;
@@ -105,7 +105,7 @@
// Adds a reporter call expectation that the specified tag/count
// callback will be generated.
- void ExpectReporterCall(int tag, int count) {
+ void ExpectReporterCall(int32 tag, int32 count) {
EXPECT_CALL(reporter_, Call(_, tag, count))
.Times(1)
.RetiresOnSaturation();
@@ -113,7 +113,7 @@
// The reporter callback forwards the call to the reporter mock so
// that we can set call expectations.
- static void Reporter(void* handle, int tag, int count) {
+ static void Reporter(void* handle, int32 tag, int32 count) {
TaggedCounterTest* test = static_cast<TaggedCounterTest*>(handle);
ASSERT_FALSE(NULL == test);
test->reporter_.Call(handle, tag, count);
@@ -130,7 +130,7 @@
}
// Returns true if the counter log contains |pattern|, false otherwise.
- bool LogContains(const std::string& pattern) {
+ bool LogContains(const std::string& pattern) const {
return log_.find(pattern) != std::string::npos;
}
@@ -141,7 +141,8 @@
std::string log_;
// Reporter mock to set callback expectations on.
- StrictMock<MockFunction<void(void* handle, int tag, int count)> > reporter_;
+ StrictMock<MockFunction<void(void* handle,
+ int32 tag, int32 count)> > reporter_;
// Pointer to the current test fixture.
static TaggedCounterTest* test_;
@@ -173,11 +174,11 @@
record_.Add(/* count */ -2);
EXPECT_EQ(15, record_.count());
- record_.Add(/* count */ INT_MAX);
- EXPECT_EQ(INT_MAX, record_.count());
+ record_.Add(/* count */ kint32max);
+ EXPECT_EQ(kint32max, record_.count());
record_.Add(/* count */ 1);
- EXPECT_EQ(INT_MAX, record_.count());
+ EXPECT_EQ(kint32max, record_.count());
}
TEST_F(TaggedCounterTest, BadFileLocation) {