// Copyright (c) 2012 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 #include "base/memory/scoped_ptr.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_samples.h" #include "base/metrics/statistics_recorder.h" #import "chrome/browser/chrome_browser_application_mac.h" #include "testing/gtest/include/gtest/gtest.h" using base::HistogramBase; using base::HistogramSamples; 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. // TODO(rtenneti): Leaks StatisticsRecorder and will update suppressions. base::StatisticsRecorder::Initialize(); 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(HistogramBase::kUmaTargetedHistogramFlag, histograms[0]->flags()); scoped_ptr samples(histograms[0]->SnapshotSamples()); EXPECT_EQ(4, samples->GetCount(0)); EXPECT_EQ(1, samples->GetCount(1)); EXPECT_EQ(3, samples->GetCount(2)); EXPECT_EQ(2, samples->GetCount(3)); // The unknown exceptions should end up in the overflow bucket. EXPECT_TRUE(histograms[0]->HasConstructionArguments(1, kUnknownNSException, kUnknownNSException + 1)); EXPECT_EQ(4, samples->GetCount(kUnknownNSException)); } } // chrome_browser_application_mac