blob: 4252a7597133aba8edd39fb15b313ca364dd98c8 [file] [log] [blame]
// 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 "chrome/browser/chrome_browser_application_mac.h"
#import <Cocoa/Cocoa.h>
#include <stddef.h>
#include <memory>
#include "base/metrics/histogram_macros.h"
#include "base/metrics/histogram_samples.h"
#include "base/metrics/statistics_recorder.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());
std::unique_ptr<HistogramSamples> 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