// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import #include "base/metrics/histogram.h" #import "chrome/browser/chrome_browser_application_mac.h" #include "testing/gtest/include/gtest/gtest.h" using base::Histogram; using base::StatisticsRecorder; namespace chrome_browser_application_mac { // Generate an NSException with the given name. NSException* ExceptionNamed(NSString* name) { return [NSException exceptionWithName:name reason:@"No reason given" userInfo:nil]; } // Helper to keep binning expectations readible. size_t BinForExceptionNamed(NSString* name) { return BinForException(ExceptionNamed(name)); } TEST(ChromeApplicationMacTest, ExceptionBinning) { // These exceptions must be in this order. EXPECT_EQ(BinForExceptionNamed(NSGenericException), 0U); EXPECT_EQ(BinForExceptionNamed(NSRangeException), 1U); EXPECT_EQ(BinForExceptionNamed(NSInvalidArgumentException), 2U); EXPECT_EQ(BinForExceptionNamed(NSMallocException), 3U); // Random other exceptions map to |kUnknownNSException|. EXPECT_EQ(BinForExceptionNamed(@"CustomName"), kUnknownNSException); EXPECT_EQ(BinForExceptionNamed(@"Custom Name"), kUnknownNSException); EXPECT_EQ(BinForExceptionNamed(@""), kUnknownNSException); EXPECT_EQ(BinForException(nil), kUnknownNSException); } TEST(ChromeApplicationMacTest, RecordException) { // Start up a histogram recorder. StatisticsRecorder recorder; StatisticsRecorder::Histograms histograms; StatisticsRecorder::GetSnapshot("OSX.NSException", &histograms); EXPECT_EQ(0U, histograms.size()); // Record some known exceptions. RecordExceptionWithUma(ExceptionNamed(NSGenericException)); RecordExceptionWithUma(ExceptionNamed(NSGenericException)); RecordExceptionWithUma(ExceptionNamed(NSGenericException)); RecordExceptionWithUma(ExceptionNamed(NSGenericException)); RecordExceptionWithUma(ExceptionNamed(NSRangeException)); RecordExceptionWithUma(ExceptionNamed(NSInvalidArgumentException)); RecordExceptionWithUma(ExceptionNamed(NSInvalidArgumentException)); RecordExceptionWithUma(ExceptionNamed(NSInvalidArgumentException)); RecordExceptionWithUma(ExceptionNamed(NSMallocException)); RecordExceptionWithUma(ExceptionNamed(NSMallocException)); // Record some unknown exceptions. RecordExceptionWithUma(ExceptionNamed(@"CustomName")); RecordExceptionWithUma(ExceptionNamed(@"Custom Name")); RecordExceptionWithUma(ExceptionNamed(@"")); RecordExceptionWithUma(nil); // We should have exactly the right number of exceptions. StatisticsRecorder::GetSnapshot("OSX.NSException", &histograms); EXPECT_EQ(1U, histograms.size()); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histograms[0]->flags()); Histogram::SampleSet sample; histograms[0]->SnapshotSample(&sample); EXPECT_EQ(4, sample.counts(0)); EXPECT_EQ(1, sample.counts(1)); EXPECT_EQ(3, sample.counts(2)); EXPECT_EQ(2, sample.counts(3)); // The unknown exceptions should end up in the overflow bucket. EXPECT_EQ(kUnknownNSException + 1, histograms[0]->bucket_count()); EXPECT_EQ(4, sample.counts(kUnknownNSException)); } } // chrome_browser_application_mac