aboutsummaryrefslogtreecommitdiffhomepage
path: root/Example/Database/Tests/Helpers/FDevice.m
diff options
context:
space:
mode:
Diffstat (limited to 'Example/Database/Tests/Helpers/FDevice.m')
-rw-r--r--Example/Database/Tests/Helpers/FDevice.m133
1 files changed, 133 insertions, 0 deletions
diff --git a/Example/Database/Tests/Helpers/FDevice.m b/Example/Database/Tests/Helpers/FDevice.m
new file mode 100644
index 0000000..f9667df
--- /dev/null
+++ b/Example/Database/Tests/Helpers/FDevice.m
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2017 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <XCTest/XCTest.h>
+#import "FDevice.h"
+#import "FIRDatabaseReference.h"
+#import "FRepoManager.h"
+#import "FIRDatabaseReference_Private.h"
+#import "FIRDatabaseConfig_Private.h"
+#import "SenTest+FWaiter.h"
+#import "FTestHelpers.h"
+
+@interface FDevice() {
+ FIRDatabaseConfig * config;
+ NSString *url;
+ BOOL isOnline;
+ BOOL disposed;
+}
+@end
+
+@implementation FDevice
+
+- (id)initOnline {
+ FIRDatabaseReference * ref = [FTestHelpers getRandomNode];
+ return [self initOnlineWithUrl:[ref description]];
+}
+
+- (id)initOffline {
+ FIRDatabaseReference * ref = [FTestHelpers getRandomNode];
+ return [self initOfflineWithUrl:[ref description]];
+}
+
+- (id)initOnlineWithUrl:(NSString *)firebaseUrl {
+ return [self initWithUrl:firebaseUrl andOnline:YES];
+}
+
+- (id)initOfflineWithUrl:(NSString *)firebaseUrl {
+ return [self initWithUrl:firebaseUrl andOnline:NO];
+}
+
+static NSUInteger deviceId = 0;
+
+- (id)initWithUrl:(NSString *)firebaseUrl andOnline:(BOOL)online {
+ self = [super init];
+ if (self) {
+ config = [FIRDatabaseConfig configForName:[NSString stringWithFormat:@"device-%lu", deviceId++]];
+ config.persistenceEnabled = YES;
+ url = firebaseUrl;
+ isOnline = online;
+ }
+ return self;
+}
+
+- (void) dealloc
+{
+ if (!self->disposed) {
+ [NSException raise:NSInternalInconsistencyException format:@"Forgot to dispose device"];
+ }
+}
+
+- (void) dispose {
+ // TODO: clear persistence
+ [FRepoManager disposeRepos:self->config];
+ self->disposed = YES;
+}
+
+- (void)goOffline {
+ isOnline = NO;
+ [FRepoManager interrupt:config];
+}
+
+- (void)goOnline {
+ isOnline = YES;
+ [FRepoManager resume:config];
+}
+
+- (void)restartOnline {
+ @autoreleasepool {
+ [FRepoManager disposeRepos:config];
+ isOnline = YES;
+ }
+}
+
+- (void)restartOffline {
+ @autoreleasepool {
+ [FRepoManager disposeRepos:config];
+ isOnline = NO;
+ }
+}
+
+// Waits for us to connect and then does an extra round-trip to make sure all initial state restoration is completely done.
+- (void)waitForIdleUsingWaiter:(XCTest*)waiter {
+ [self do:^(FIRDatabaseReference *ref) {
+ __block BOOL connected = NO;
+ FIRDatabaseHandle handle = [[ref.root child:@".info/connected"] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
+ connected = [snapshot.value boolValue];
+ }];
+ [waiter waitUntil:^BOOL { return connected; }];
+ [ref.root removeObserverWithHandle:handle];
+
+ // HACK: Do a deep setPriority (which we expect to fail because there's no data there) to do a no-op roundtrip.
+ __block BOOL done = NO;
+ [[ref.root child:@"ENTOHTNUHOE/ONTEHNUHTOE"] setPriority:@"blah" withCompletionBlock:^(NSError *error, FIRDatabaseReference *ref) {
+ done = YES;
+ }];
+ [waiter waitUntil:^BOOL { return done; }];
+ }];
+}
+
+- (void)do:(void (^)(FIRDatabaseReference *))action {
+ @autoreleasepool {
+ FIRDatabaseReference *ref = [[[[FIRDatabaseReference alloc] initWithConfig:self->config] database] referenceFromURL:self->url];
+ if (!isOnline) {
+ [FRepoManager interrupt:config];
+ }
+ action(ref);
+ }
+}
+
+@end