Skip to content

Commit 935a515

Browse files
authored
Port FSTEventManager to C++ (#3539)
* Initial version of c++ event manager * Addressing comments - DelayedConstructor * DelayedConstructor * formatting * final fixing
1 parent f841497 commit 935a515

File tree

10 files changed

+345
-303
lines changed

10 files changed

+345
-303
lines changed

Firestore/Example/Tests/Core/FSTEventManagerTests.mm

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
* limitations under the License.
1515
*/
1616

17-
#import "Firestore/Source/Core/FSTEventManager.h"
18-
1917
#import <OCMock/OCMock.h>
2018
#import <XCTest/XCTest.h>
2119

@@ -27,6 +25,7 @@
2725

2826
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
2927

28+
#include "Firestore/core/src/firebase/firestore/core/event_manager.h"
3029
#include "Firestore/core/src/firebase/firestore/core/view_snapshot.h"
3130
#include "Firestore/core/src/firebase/firestore/model/document_key_set.h"
3231
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
@@ -36,8 +35,10 @@
3635
#include "Firestore/core/test/firebase/firestore/testutil/xcgmock.h"
3736

3837
using firebase::firestore::core::EventListener;
38+
using firebase::firestore::core::EventManager;
3939
using firebase::firestore::core::ListenOptions;
4040
using firebase::firestore::core::QueryListener;
41+
using firebase::firestore::core::SyncEngineCallback;
4142
using firebase::firestore::core::ViewSnapshot;
4243
using firebase::firestore::model::DocumentKeySet;
4344
using firebase::firestore::model::DocumentSet;
@@ -63,10 +64,6 @@
6364

6465
} // namespace
6566

66-
// FSTEventManager implements this delegate privately
67-
@interface FSTEventManager () <FSTSyncEngineDelegate>
68-
@end
69-
7067
@interface FSTEventManagerTests : XCTestCase
7168
@end
7269

@@ -79,18 +76,18 @@ - (void)DISABLED_testHandlesManyListenersPerQuery {
7976
auto listener2 = NoopQueryListener(query);
8077

8178
FSTSyncEngine *syncEngineMock = OCMStrictClassMock([FSTSyncEngine class]);
82-
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
83-
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
79+
OCMExpect([syncEngineMock setCallback:static_cast<SyncEngineCallback *>([OCMArg anyPointer])]);
80+
EventManager eventManager(syncEngineMock);
8481

8582
OCMExpect([syncEngineMock listenToQuery:query]);
86-
[eventManager addListener:listener1];
83+
eventManager.AddQueryListener(listener1);
8784
OCMVerifyAll((id)syncEngineMock);
8885

89-
[eventManager addListener:listener2];
90-
[eventManager removeListener:listener2];
86+
eventManager.AddQueryListener(listener2);
87+
eventManager.RemoveQueryListener(listener2);
9188

9289
OCMExpect([syncEngineMock stopListeningToQuery:query]);
93-
[eventManager removeListener:listener1];
90+
eventManager.RemoveQueryListener(listener1);
9491
OCMVerifyAll((id)syncEngineMock);
9592
}
9693

@@ -99,10 +96,10 @@ - (void)testHandlesUnlistenOnUnknownListenerGracefully {
9996
auto listener = NoopQueryListener(query);
10097

10198
FSTSyncEngine *syncEngineMock = OCMStrictClassMock([FSTSyncEngine class]);
102-
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
103-
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
99+
OCMExpect([syncEngineMock setCallback:static_cast<SyncEngineCallback *>([OCMArg anyPointer])]);
100+
EventManager eventManager(syncEngineMock);
104101

105-
[eventManager removeListener:listener];
102+
eventManager.RemoveQueryListener(listener);
106103
OCMVerifyAll((id)syncEngineMock);
107104
}
108105

@@ -129,17 +126,17 @@ - (void)DISABLED_testNotifiesListenersInTheRightOrder {
129126
query1, [eventOrder](StatusOr<ViewSnapshot>) { [eventOrder addObject:@"listener3"]; });
130127

131128
FSTSyncEngine *syncEngineMock = OCMClassMock([FSTSyncEngine class]);
132-
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
129+
EventManager eventManager(syncEngineMock);
133130

134-
[eventManager addListener:listener1];
135-
[eventManager addListener:listener2];
136-
[eventManager addListener:listener3];
131+
eventManager.AddQueryListener(listener1);
132+
eventManager.AddQueryListener(listener2);
133+
eventManager.AddQueryListener(listener3);
137134
OCMVerify([syncEngineMock listenToQuery:query1]);
138135
OCMVerify([syncEngineMock listenToQuery:query2]);
139136

140137
ViewSnapshot snapshot1 = [self makeEmptyViewSnapshotWithQuery:query1];
141138
ViewSnapshot snapshot2 = [self makeEmptyViewSnapshotWithQuery:query2];
142-
[eventManager handleViewSnapshots:{snapshot1, snapshot2}];
139+
eventManager.OnViewSnapshots({snapshot1, snapshot2});
143140

144141
NSArray *expected = @[ @"listener1", @"listener3", @"listener2" ];
145142
XCTAssertEqualObjects(eventOrder, expected);
@@ -165,14 +162,16 @@ void OnOnlineStateChanged(OnlineState online_state) override {
165162
auto fake_listener = std::make_shared<FakeQueryListener>(query);
166163

167164
FSTSyncEngine *syncEngineMock = OCMClassMock([FSTSyncEngine class]);
168-
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
169-
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
165+
OCMExpect([syncEngineMock setCallback:static_cast<SyncEngineCallback *>([OCMArg anyPointer])]);
166+
EventManager eventManager(syncEngineMock);
170167

171-
[eventManager addListener:fake_listener];
168+
eventManager.AddQueryListener(fake_listener);
172169
XC_ASSERT_THAT(fake_listener->events, ElementsAre(OnlineState::Unknown));
173170

174-
[eventManager applyChangedOnlineState:OnlineState::Online];
171+
eventManager.HandleOnlineStateChange(OnlineState::Online);
175172
XC_ASSERT_THAT(fake_listener->events, ElementsAre(OnlineState::Unknown, OnlineState::Online));
173+
174+
OCMVerifyAll((id)syncEngineMock);
176175
}
177176

178177
@end

Firestore/Example/Tests/SpecTests/FSTSyncEngineTestDriver.mm

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include <utility>
2626
#include <vector>
2727

28-
#import "Firestore/Source/Core/FSTEventManager.h"
2928
#import "Firestore/Source/Core/FSTSyncEngine.h"
3029
#import "Firestore/Source/Local/FSTLocalStore.h"
3130
#import "Firestore/Source/Local/FSTPersistence.h"
@@ -38,11 +37,13 @@
3837
#include "Firestore/core/src/firebase/firestore/auth/empty_credentials_provider.h"
3938
#include "Firestore/core/src/firebase/firestore/auth/user.h"
4039
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
40+
#include "Firestore/core/src/firebase/firestore/core/event_manager.h"
4141
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
4242
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
4343
#include "Firestore/core/src/firebase/firestore/objc/objc_compatibility.h"
4444
#include "Firestore/core/src/firebase/firestore/remote/remote_store.h"
4545
#include "Firestore/core/src/firebase/firestore/util/async_queue.h"
46+
#include "Firestore/core/src/firebase/firestore/util/delayed_constructor.h"
4647
#include "Firestore/core/src/firebase/firestore/util/error_apple.h"
4748
#include "Firestore/core/src/firebase/firestore/util/executor_libdispatch.h"
4849
#include "Firestore/core/src/firebase/firestore/util/hard_assert.h"
@@ -58,6 +59,7 @@
5859
using firebase::firestore::auth::HashUser;
5960
using firebase::firestore::auth::User;
6061
using firebase::firestore::core::DatabaseInfo;
62+
using firebase::firestore::core::EventManager;
6163
using firebase::firestore::core::ListenOptions;
6264
using firebase::firestore::core::Query;
6365
using firebase::firestore::core::QueryListener;
@@ -72,13 +74,14 @@
7274
using firebase::firestore::remote::RemoteStore;
7375
using firebase::firestore::remote::WatchChange;
7476
using firebase::firestore::util::AsyncQueue;
75-
using firebase::firestore::util::TimerId;
77+
using firebase::firestore::util::DelayedConstructor;
7678
using firebase::firestore::util::ExecutorLibdispatch;
7779
using firebase::firestore::util::MakeNSError;
7880
using firebase::firestore::util::MakeString;
7981
using firebase::firestore::util::Status;
8082
using firebase::firestore::util::StatusOr;
8183
using firebase::firestore::util::StringFormat;
84+
using firebase::firestore::util::TimerId;
8285
using firebase::firestore::util::ToString;
8386

8487
NS_ASSUME_NONNULL_BEGIN
@@ -111,7 +114,6 @@ @interface FSTSyncEngineTestDriver ()
111114

112115
#pragma mark - Parts of the Firestore system that the spec tests need to control.
113116

114-
@property(nonatomic, strong, readonly) FSTEventManager *eventManager;
115117
@property(nonatomic, strong, readonly) FSTLocalStore *localStore;
116118
@property(nonatomic, strong, readonly) FSTSyncEngine *syncEngine;
117119
@property(nonatomic, strong, readonly) id<FSTPersistence> persistence;
@@ -137,6 +139,8 @@ @implementation FSTSyncEngineTestDriver {
137139

138140
std::unique_ptr<RemoteStore> _remoteStore;
139141

142+
DelayedConstructor<EventManager> _eventManager;
143+
140144
std::unordered_map<TargetId, FSTQueryData *> _expectedActiveTargets;
141145

142146
// ivar is declared as mutable.
@@ -183,15 +187,15 @@ - (instancetype)initWithPersistence:(id<FSTPersistence>)persistence
183187
_remoteStore = absl::make_unique<RemoteStore>(
184188
_localStore, _datastore, _workerQueue, [self](OnlineState onlineState) {
185189
[self.syncEngine applyChangedOnlineState:onlineState];
186-
[self.eventManager applyChangedOnlineState:onlineState];
190+
_eventManager->HandleOnlineStateChange(onlineState);
187191
});
188192
;
189193

190194
_syncEngine = [[FSTSyncEngine alloc] initWithLocalStore:_localStore
191195
remoteStore:_remoteStore.get()
192196
initialUser:initialUser];
193197
_remoteStore->set_sync_engine(_syncEngine);
194-
_eventManager = [FSTEventManager eventManagerWithSyncEngine:_syncEngine];
198+
_eventManager.Init(_syncEngine);
195199

196200
// Set up internal event tracking for the spec tests.
197201
NSMutableArray<FSTQueryEvent *> *events = [NSMutableArray array];
@@ -363,7 +367,7 @@ - (TargetId)addUserListenerWithQuery:(Query)query {
363367
});
364368
_queryListeners[query] = listener;
365369
TargetId targetID;
366-
_workerQueue->EnqueueBlocking([&] { targetID = [self.eventManager addListener:listener]; });
370+
_workerQueue->EnqueueBlocking([&] { targetID = _eventManager->AddQueryListener(listener); });
367371
return targetID;
368372
}
369373

@@ -373,7 +377,7 @@ - (void)removeUserListenerWithQuery:(const Query &)query {
373377
std::shared_ptr<QueryListener> listener = found_iter->second;
374378
_queryListeners.erase(found_iter);
375379

376-
_workerQueue->EnqueueBlocking([&] { [self.eventManager removeListener:listener]; });
380+
_workerQueue->EnqueueBlocking([&] { _eventManager->RemoveQueryListener(listener); });
377381
}
378382
}
379383

Firestore/Source/Core/FSTEventManager.h

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)