From ac9324da7ad7c8dd9d42af608e3b2faf9723d56c Mon Sep 17 00:00:00 2001 From: "qsr@chromium.org" Date: Wed, 28 Nov 2012 17:04:52 +0000 Subject: [PATCH] Add assertion on initialization sequence. The order at which to call the controller methods is: 1) Any method that change the configuration_ field 2) start 3) Any other method This change adds assertion that it is done correctly. Review URL: https://breakpad.appspot.com/499003 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1085 4c0a9323-5329-0410-9bdc-e9ce6186880e --- src/client/ios/BreakpadController.h | 4 ++++ src/client/ios/BreakpadController.mm | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/client/ios/BreakpadController.h b/src/client/ios/BreakpadController.h index 6eb826b3..f766100e 100644 --- a/src/client/ios/BreakpadController.h +++ b/src/client/ios/BreakpadController.h @@ -55,6 +55,10 @@ // Whether or not crash reports should be uploaded. BOOL enableUploads_; + // Whether the controller has been started on the main thread. This is only + // used to assert the initialization order is correct. + BOOL started_; + // The interval to wait between two uploads. Value is 0 if no upload must be // done. int uploadIntervalInSeconds_; diff --git a/src/client/ios/BreakpadController.mm b/src/client/ios/BreakpadController.mm index 0c24e260..bf31647d 100644 --- a/src/client/ios/BreakpadController.mm +++ b/src/client/ios/BreakpadController.mm @@ -110,6 +110,7 @@ NSString* GetPlatform() { queue_ = dispatch_queue_create("com.google.BreakpadQueue", NULL); configuration_ = [[[NSBundle mainBundle] infoDictionary] mutableCopy]; enableUploads_ = NO; + started_ = NO; NSString* uploadInterval = [configuration_ valueForKey:@BREAKPAD_REPORT_INTERVAL]; [self setUploadInterval:[uploadInterval intValue]]; @@ -135,6 +136,8 @@ NSString* GetPlatform() { BreakpadAddUploadParameter(breakpadRef_, @"platform", GetPlatform()); } }; + NSAssert(!started_, @"Start cannot be called more than once."); + started_ = YES; if (onCurrentThread) startBlock(); else @@ -142,6 +145,9 @@ NSString* GetPlatform() { } - (void)stop { + NSAssert(started_, + @"The controller must be started before it can be stopped"); + started_ = NO; dispatch_sync(queue_, ^{ if (breakpadRef_) { BreakpadRelease(breakpadRef_); @@ -151,6 +157,8 @@ NSString* GetPlatform() { } - (void)setUploadingEnabled:(BOOL)enabled { + NSAssert(started_, + @"The controller must be started before setUploadingEnabled is called"); dispatch_async(queue_, ^{ if (enabled == enableUploads_) return; @@ -169,6 +177,8 @@ NSString* GetPlatform() { } - (void)updateConfiguration:(NSDictionary*)configuration { + NSAssert(!started_, + @"The controller must not be started when updateConfiguration is called"); [configuration_ addEntriesFromDictionary:configuration]; NSString* uploadInterval = [configuration_ valueForKey:@BREAKPAD_REPORT_INTERVAL]; @@ -177,10 +187,14 @@ NSString* GetPlatform() { } - (void)setUploadingURL:(NSString*)url { + NSAssert(!started_, + @"The controller must not be started when setUploadingURL is called"); [configuration_ setValue:url forKey:@BREAKPAD_URL]; } - (void)setUploadInterval:(int)intervalInSeconds { + NSAssert(!started_, + @"The controller must not be started when setUploadInterval is called"); [configuration_ removeObjectForKey:@BREAKPAD_REPORT_INTERVAL]; uploadIntervalInSeconds_ = intervalInSeconds; if (uploadIntervalInSeconds_ < 0) @@ -188,6 +202,8 @@ NSString* GetPlatform() { } - (void)addUploadParameter:(NSString*)value forKey:(NSString*)key { + NSAssert(started_, + @"The controller must be started before addUploadParameter is called"); dispatch_async(queue_, ^{ if (breakpadRef_) BreakpadAddUploadParameter(breakpadRef_, key, value); @@ -195,6 +211,8 @@ NSString* GetPlatform() { } - (void)removeUploadParameterForKey:(NSString*)key { + NSAssert(started_, @"The controller must be started before " + "removeUploadParameterForKey is called"); dispatch_async(queue_, ^{ if (breakpadRef_) BreakpadRemoveUploadParameter(breakpadRef_, key); @@ -202,6 +220,8 @@ NSString* GetPlatform() { } - (void)withBreakpadRef:(void(^)(BreakpadRef))callback { + NSAssert(started_, + @"The controller must be started before withBreakpadRef is called"); dispatch_async(queue_, ^{ callback(breakpadRef_); });