toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.m

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 // Copyright (c) 2006, Google Inc.
     2 // All rights reserved.
     3 //
     4 // Redistribution and use in source and binary forms, with or without
     5 // modification, are permitted provided that the following conditions are
     6 // met:
     7 //
     8 //     * Redistributions of source code must retain the above copyright
     9 // notice, this list of conditions and the following disclaimer.
    10 //     * Redistributions in binary form must reproduce the above
    11 // copyright notice, this list of conditions and the following disclaimer
    12 // in the documentation and/or other materials provided with the
    13 // distribution.
    14 //     * Neither the name of Google Inc. nor the names of its
    15 // contributors may be used to endorse or promote products derived from
    16 // this software without specific prior written permission.
    17 //
    18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    30 #import <Breakpad/Breakpad.h>
    32 #import "Controller.h"
    33 #import "TestClass.h"
    34 #import "GTMDefines.h"
    35 #include <unistd.h>
    36 #include <mach/mach.h>
    38 @implementation Controller
    40 - (void)causeCrash {
    41   float *aPtr = nil;
    42   NSLog(@"Crash!");
    43   NSLog(@"Bad programmer: %f", *aPtr);
    44 }
    46 - (void)generateReportWithoutCrash:(id)sender {
    47   BreakpadGenerateAndSendReport(breakpad_);
    48 }
    50 - (IBAction)showForkTestWindow:(id) sender {
    51   [forkTestOptions_ setIsVisible:YES];
    52 }
    54 - (IBAction)forkTestOptions:(id)sender {
    55   NSInteger tag = [[sender selectedCell] tag];
    56   NSLog(@"sender tag: %d", tag);
    57   if (tag <= 2) {
    58     bpForkOption = tag;
    59   }
    61   if (tag == 3) {
    62     useVFork = NO;
    63   }
    65   if (tag == 4) {
    66     useVFork = YES;
    67   }
    69   if (tag >= 5 && tag <= 7) {
    70     progCrashPoint = tag;
    71   }
    73 }
    75 - (IBAction)forkTestGo:(id)sender {
    77   NSString *resourcePath = [[NSBundle bundleForClass:
    78                                         [self class]] resourcePath];
    79   NSString *execProgname = nil;
    80   if (progCrashPoint == DURINGLAUNCH) {
    81     execProgname = [resourcePath stringByAppendingString:@"/crashduringload"];
    82   } else if (progCrashPoint == AFTERLAUNCH) {
    83     execProgname = [resourcePath stringByAppendingString:@"/crashInMain"];
    84   }
    86   const char *progName = NULL;
    87   if (progCrashPoint != BETWEENFORKEXEC) {
    88     progName = [execProgname UTF8String];
    89   }
    91   int pid;
    93   if (bpForkOption == UNINSTALL) {
    94     BreakpadRelease(breakpad_);
    95   }
    97   if (useVFork) {
    98     pid = vfork();
    99   } else {
   100     pid = fork();
   101   }
   103   if (pid == 0) {
   104     sleep(3);
   105     NSLog(@"Child continuing");
   106     FILE *fd = fopen("/tmp/childlog.txt","wt");
   107     kern_return_t kr;
   108     if (bpForkOption == RESETEXCEPTIONPORT) {
   109       kr = task_set_exception_ports(mach_task_self(),
   110                                EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION |
   111                                EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT,
   112                                MACH_PORT_NULL,
   113                                EXCEPTION_DEFAULT,
   114                                THREAD_STATE_NONE);
   115       fprintf(fd,"task_set_exception_ports returned %d\n", kr);
   116     }
   118     if (progCrashPoint == BETWEENFORKEXEC) {
   119       fprintf(fd,"crashing post-fork\n");
   120       int *a = NULL;
   121       printf("%d\n",*a++);
   122     }
   124     fprintf(fd,"about to call exec with %s\n", progName);
   125     fclose(fd);
   126     int i = execl(progName, progName, NULL);
   127     fprintf(fd, "exec returned! %d\n", i);
   128     fclose(fd);
   129   }
   130 }
   132 - (IBAction)crash:(id)sender {
   133   NSInteger tag = [sender tag];
   135   if (tag == 1) {
   136     [NSObject cancelPreviousPerformRequestsWithTarget:self];
   137     [self performSelector:@selector(causeCrash) withObject:nil afterDelay:10.0];
   138     [sender setState:NSOnState];
   139     return;
   140   }
   142   if (tag == 2 && breakpad_) {
   143     BreakpadRelease(breakpad_);
   144     breakpad_ = NULL;
   145     return;
   146   }
   148   [self causeCrash];
   149 }
   151 - (void)anotherThread {
   152   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   153   TestClass *tc = [[TestClass alloc] init];
   155   [tc wait];
   157   [pool release];
   158 }
   160 - (void)awakeFromNib {
   161   NSBundle *bundle = [NSBundle mainBundle];
   162   NSDictionary *info = [bundle infoDictionary];
   165   breakpad_ = BreakpadCreate(info);
   167   // Do some unit tests with keys
   168   // first a series of bogus values
   169   BreakpadSetKeyValue(breakpad_, nil, @"bad2");
   170   BreakpadSetKeyValue(nil, @"bad3", @"bad3");
   172   // Now some good ones
   173   BreakpadSetKeyValue(breakpad_,@"key1", @"value1");
   174   BreakpadSetKeyValue(breakpad_,@"key2", @"value2");
   175   BreakpadSetKeyValue(breakpad_,@"key3", @"value3");
   177   // Look for a bogus one that we didn't try to set
   178   NSString *test = BreakpadKeyValue(breakpad_, @"bad4");
   179   if (test) {
   180     NSLog(@"Bad BreakpadKeyValue (bad4)");
   181   }
   183   // Look for a bogus one we did try to set
   184   test = BreakpadKeyValue(breakpad_, @"bad1");
   185   if (test) {
   186     NSLog(@"Bad BreakpadKeyValue (bad1)");
   187   }
   189   // Test some bad args for BreakpadKeyValue
   190   test = BreakpadKeyValue(nil, @"bad5");
   191   if (test) {
   192     NSLog(@"Bad BreakpadKeyValue (bad5)");
   193   }
   195   test = BreakpadKeyValue(breakpad_, nil);
   196   if (test) {
   197     NSLog(@"Bad BreakpadKeyValue (nil)");
   198   }
   200   // Find some we did set
   201   test = BreakpadKeyValue(breakpad_, @"key1");
   202   if (![test isEqualToString:@"value1"]) {
   203     NSLog(@"Can't find BreakpadKeyValue (key1)");
   204   }
   205   test = BreakpadKeyValue(breakpad_, @"key2");
   206   if (![test isEqualToString:@"value2"]) {
   207     NSLog(@"Can't find BreakpadKeyValue (key2)");
   208   }
   209   test = BreakpadKeyValue(breakpad_, @"key3");
   210   if (![test isEqualToString:@"value3"]) {
   211     NSLog(@"Can't find BreakpadKeyValue (key3)");
   212   }
   214   // Bad args for BreakpadRemoveKeyValue
   215   BreakpadRemoveKeyValue(nil, @"bad6");
   216   BreakpadRemoveKeyValue(breakpad_, nil);
   218   // Remove one that is valid
   219   BreakpadRemoveKeyValue(breakpad_, @"key3");
   221   // Try and find it
   222   test = BreakpadKeyValue(breakpad_, @"key3");
   223   if (test) {
   224     NSLog(@"Shouldn't find BreakpadKeyValue (key3)");
   225   }
   227   // Try and remove it again
   228   BreakpadRemoveKeyValue(breakpad_, @"key3");
   230   // Try removal by setting to nil
   231   BreakpadSetKeyValue(breakpad_,@"key2", nil);
   232   // Try and find it
   233   test = BreakpadKeyValue(breakpad_, @"key2");
   234   if (test) {
   235     NSLog(@"Shouldn't find BreakpadKeyValue (key2)");
   236   }
   238   BreakpadAddUploadParameter(breakpad_,
   239                              @"MeaningOfLife",
   240                              @"42");
   241   [NSThread detachNewThreadSelector:@selector(anotherThread)
   242                            toTarget:self withObject:nil];
   244   NSUserDefaults *args = [NSUserDefaults standardUserDefaults];
   246   // If the user specified autocrash on the command line, toggle
   247   // Breakpad to not confirm and crash immediately.  This is for
   248   // automated testing.
   249   if ([args boolForKey:@"autocrash"]) {
   250     BreakpadSetKeyValue(breakpad_,
   251                         @BREAKPAD_SKIP_CONFIRM,
   252                         @"YES");
   253     [self causeCrash];
   254   }
   256   progCrashPoint = DURINGLAUNCH;
   257   [window_ center];
   258   [window_ makeKeyAndOrderFront:self];
   259 }
   261 @end

mercurial