Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #import <Cocoa/Cocoa.h>
      6 
      7 #include "base/metrics/histogram.h"
      8 #import "chrome/browser/chrome_browser_application_mac.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 using base::Histogram;
     12 using base::StatisticsRecorder;
     13 
     14 namespace chrome_browser_application_mac {
     15 
     16 // Generate an NSException with the given name.
     17 NSException* ExceptionNamed(NSString* name) {
     18   return [NSException exceptionWithName:name
     19                                  reason:@"No reason given"
     20                                userInfo:nil];
     21 }
     22 
     23 // Helper to keep binning expectations readible.
     24 size_t BinForExceptionNamed(NSString* name) {
     25   return BinForException(ExceptionNamed(name));
     26 }
     27 
     28 TEST(ChromeApplicationMacTest, ExceptionBinning) {
     29   // These exceptions must be in this order.
     30   EXPECT_EQ(BinForExceptionNamed(NSGenericException), 0U);
     31   EXPECT_EQ(BinForExceptionNamed(NSRangeException), 1U);
     32   EXPECT_EQ(BinForExceptionNamed(NSInvalidArgumentException), 2U);
     33   EXPECT_EQ(BinForExceptionNamed(NSMallocException), 3U);
     34 
     35   // Random other exceptions map to |kUnknownNSException|.
     36   EXPECT_EQ(BinForExceptionNamed(@"CustomName"), kUnknownNSException);
     37   EXPECT_EQ(BinForExceptionNamed(@"Custom Name"), kUnknownNSException);
     38   EXPECT_EQ(BinForExceptionNamed(@""), kUnknownNSException);
     39   EXPECT_EQ(BinForException(nil), kUnknownNSException);
     40 }
     41 
     42 TEST(ChromeApplicationMacTest, RecordException) {
     43   // Start up a histogram recorder.
     44   StatisticsRecorder recorder;
     45 
     46   StatisticsRecorder::Histograms histograms;
     47   StatisticsRecorder::GetSnapshot("OSX.NSException", &histograms);
     48   EXPECT_EQ(0U, histograms.size());
     49 
     50   // Record some known exceptions.
     51   RecordExceptionWithUma(ExceptionNamed(NSGenericException));
     52   RecordExceptionWithUma(ExceptionNamed(NSGenericException));
     53   RecordExceptionWithUma(ExceptionNamed(NSGenericException));
     54   RecordExceptionWithUma(ExceptionNamed(NSGenericException));
     55   RecordExceptionWithUma(ExceptionNamed(NSRangeException));
     56   RecordExceptionWithUma(ExceptionNamed(NSInvalidArgumentException));
     57   RecordExceptionWithUma(ExceptionNamed(NSInvalidArgumentException));
     58   RecordExceptionWithUma(ExceptionNamed(NSInvalidArgumentException));
     59   RecordExceptionWithUma(ExceptionNamed(NSMallocException));
     60   RecordExceptionWithUma(ExceptionNamed(NSMallocException));
     61 
     62   // Record some unknown exceptions.
     63   RecordExceptionWithUma(ExceptionNamed(@"CustomName"));
     64   RecordExceptionWithUma(ExceptionNamed(@"Custom Name"));
     65   RecordExceptionWithUma(ExceptionNamed(@""));
     66   RecordExceptionWithUma(nil);
     67 
     68   // We should have exactly the right number of exceptions.
     69   StatisticsRecorder::GetSnapshot("OSX.NSException", &histograms);
     70   EXPECT_EQ(1U, histograms.size());
     71   EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histograms[0]->flags());
     72   Histogram::SampleSet sample;
     73   histograms[0]->SnapshotSample(&sample);
     74   EXPECT_EQ(4, sample.counts(0));
     75   EXPECT_EQ(1, sample.counts(1));
     76   EXPECT_EQ(3, sample.counts(2));
     77   EXPECT_EQ(2, sample.counts(3));
     78 
     79   // The unknown exceptions should end up in the overflow bucket.
     80   EXPECT_EQ(kUnknownNSException + 1, histograms[0]->bucket_count());
     81   EXPECT_EQ(4, sample.counts(kUnknownNSException));
     82 }
     83 
     84 }  // chrome_browser_application_mac
     85