An amazing project that generates micro reports from tournament results
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
6.5 KiB

////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 Realm Inc.
//
// 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 "RLMMultiProcessTestCase.h"
#import "RLMSyncConfiguration_Private.h"
typedef void(^RLMSyncBasicErrorReportingBlock)(NSError * _Nullable);
NS_ASSUME_NONNULL_BEGIN
@interface RLMSyncManager ()
- (void)setSessionCompletionNotifier:(RLMSyncBasicErrorReportingBlock)sessionCompletionNotifier;
@end
@interface SyncObject : RLMObject
@property NSString *stringProp;
@end
@interface HugeSyncObject : RLMObject
@property NSData *dataProp;
+ (instancetype)object;
@end
@interface RLMSyncTestCase : RLMMultiProcessTestCase
+ (RLMSyncManager *)managerForCurrentTest;
+ (NSURL *)authServerURL;
+ (NSURL *)secureAuthServerURL;
+ (RLMSyncCredentials *)basicCredentialsWithName:(NSString *)name register:(BOOL)shouldRegister;
+ (NSURL *)onDiskPathForSyncedRealm:(RLMRealm *)realm;
/// Retrieve the administrator token.
- (NSString *)adminToken;
/// Read and delete the last email sent by ROS to the given address.
/// Returns nil if none has been sent to that address.
- (nullable NSString *)emailForAddress:(NSString *)email;
/// Synchronously open a synced Realm and wait until the binding process has completed or failed.
- (RLMRealm *)openRealmForURL:(NSURL *)url user:(RLMSyncUser *)user;
/// Synchronously open a synced Realm and wait until the binding process has completed or failed.
- (RLMRealm *)openRealmWithConfiguration:(RLMRealmConfiguration *)configuration;
/// Synchronously open a synced Realm. Also run a block right after the Realm is created.
- (RLMRealm *)openRealmForURL:(NSURL *)url
user:(RLMSyncUser *)user
immediatelyBlock:(nullable void(^)(void))block;
/// Synchronously open a synced Realm with encryption key and stop policy.
/// Also run a block right after the Realm is created.
- (RLMRealm *)openRealmForURL:(NSURL *)url
user:(RLMSyncUser *)user
encryptionKey:(nullable NSData *)encryptionKey
stopPolicy:(RLMSyncStopPolicy)stopPolicy
immediatelyBlock:(nullable void(^)(void))block;
/// Synchronously open a synced Realm and wait until the binding process has completed or failed.
/// Also run a block right after the Realm is created.
- (RLMRealm *)openRealmWithConfiguration:(RLMRealmConfiguration *)configuration
immediatelyBlock:(nullable void(^)(void))block;
;
/// Immediately open a synced Realm.
- (RLMRealm *)immediatelyOpenRealmForURL:(NSURL *)url user:(RLMSyncUser *)user;
/// Immediately open a synced Realm with encryption key and stop policy.
- (RLMRealm *)immediatelyOpenRealmForURL:(NSURL *)url
user:(RLMSyncUser *)user
encryptionKey:(nullable NSData *)encryptionKey
stopPolicy:(RLMSyncStopPolicy)stopPolicy;
/// Synchronously create, log in, and return a user.
- (RLMSyncUser *)logInUserForCredentials:(RLMSyncCredentials *)credentials
server:(NSURL *)url;
/// Create and log in an admin user.
- (RLMSyncUser *)createAdminUserForURL:(NSURL *)url username:(NSString *)username;
/// Add a number of objects to a Realm.
- (void)addSyncObjectsToRealm:(RLMRealm *)realm descriptions:(NSArray<NSString *> *)descriptions;
/// Synchronously wait for downloads to complete for any number of Realms, and then check their `SyncObject` counts.
- (void)waitForDownloadsForUser:(RLMSyncUser *)user
realms:(NSArray<RLMRealm *> *)realms
realmURLs:(NSArray<NSURL *> *)realmURLs
expectedCounts:(NSArray<NSNumber *> *)counts;
/// "Prime" the sync manager to signal the given semaphore the next time a session is bound. This method should be
/// called right before a Realm is opened if that Realm's session is the one to be monitored.
- (void)primeSyncManagerWithSemaphore:(nullable dispatch_semaphore_t)semaphore;
/// Wait for downloads to complete; drop any error.
- (void)waitForDownloadsForRealm:(RLMRealm *)realm;
- (void)waitForDownloadsForRealm:(RLMRealm *)realm error:(NSError **)error;
/// Wait for uploads to complete; drop any error.
- (void)waitForUploadsForRealm:(RLMRealm *)realm;
- (void)waitForUploadsForRealm:(RLMRealm *)realm error:(NSError **)error;
/// Wait for downloads to complete while spinning the runloop. This method uses expectations.
- (void)waitForDownloadsForUser:(RLMSyncUser *)user
url:(NSURL *)url
expectation:(nullable XCTestExpectation *)expectation
error:(NSError **)error;
/// Manually set the refresh token for a user. Used for testing invalid token conditions.
- (void)manuallySetRefreshTokenForUser:(RLMSyncUser *)user value:(NSString *)tokenValue;
@end
NS_ASSUME_NONNULL_END
#define WAIT_FOR_SEMAPHORE(macro_semaphore, macro_timeout) \
{ \
int64_t delay_in_ns = (int64_t)(macro_timeout * NSEC_PER_SEC); \
BOOL sema_success = dispatch_semaphore_wait(macro_semaphore, dispatch_time(DISPATCH_TIME_NOW, delay_in_ns)) == 0; \
XCTAssertTrue(sema_success, @"Semaphore timed out."); \
}
#define CHECK_COUNT(d_count, macro_object_type, macro_realm) \
{ \
[macro_realm refresh]; \
NSInteger c = [macro_object_type allObjectsInRealm:macro_realm].count; \
NSString *w = self.isParent ? @"parent" : @"child"; \
XCTAssert(d_count == c, @"Expected %@ items, but actually got %@ (%@)", @(d_count), @(c), w); \
}