Skip to content

Port FSTQueryListener to C++ #2618

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 27 commits into from
Mar 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
433fec1
Replace FSTDocumentSet's guts with immutable::SortedSet.
wilhuff Mar 17, 2019
83d61c7
Port FSTDocumentSet to C++ DocumentSet.
wilhuff Mar 17, 2019
5666ce5
Replace implementation of FSTDocumentSet with C++ DocumentSet
wilhuff Mar 21, 2019
83c0687
Update all usages of FSTDocumentSet
wilhuff Mar 17, 2019
614132f
Remove FSTDocumentSet
wilhuff Mar 21, 2019
d648e35
Merge branch 'master' into wilhuff/document-set
wilhuff Mar 22, 2019
f46866c
Add Objective-C++ guard
wilhuff Mar 22, 2019
3f45e44
Use absl::c_equal instead of hand-rolling it.
wilhuff Mar 22, 2019
c4fbcfe
Split SortedContainer out of SortedMapBase
wilhuff Mar 23, 2019
114fe05
Remove = default constructors that aren't true.
wilhuff Mar 23, 2019
03847dc
Fix NSNotFound -> npos
wilhuff Mar 23, 2019
9d86b35
Fix usage of FSTQuery.limit
wilhuff Mar 23, 2019
5cbe0ea
Port FSTListenOptions to C++
wilhuff Mar 23, 2019
b2116b3
Remove usage of FSTListenOptions
wilhuff Mar 23, 2019
59da887
Remove FSTListenOptions
wilhuff Mar 23, 2019
8dd6bfc
Review feedback
wilhuff Mar 25, 2019
3c5cd51
Merge branch 'master' into wilhuff/listen-options
wilhuff Mar 25, 2019
1f6c482
Merge branch 'master' into wilhuff/listen-options
wilhuff Mar 25, 2019
a39902e
Add QueryListener
wilhuff Mar 23, 2019
ce97b90
Replace FSTQueryListener with C++ QueryListener
wilhuff Mar 24, 2019
03157ff
objc::unordered_map
wilhuff Mar 26, 2019
ba38b49
Add a lint check for Objective-C banned words
wilhuff Mar 26, 2019
d85bf4e
Review feedback
wilhuff Mar 26, 2019
000bc1a
Merge branch 'master' into wilhuff/query-listener
wilhuff Mar 26, 2019
f186fd1
style.sh generated changes
wilhuff Mar 26, 2019
58b4b97
lint fixes
wilhuff Mar 26, 2019
f6a7b65
Fix CMake build
wilhuff Mar 26, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 46 additions & 54 deletions Firestore/Example/Tests/Core/FSTEventManagerTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
#import <OCMock/OCMock.h>
#import <XCTest/XCTest.h>

#include <memory>
#include <utility>
#include <vector>

#import "Firestore/Source/Core/FSTQuery.h"
#import "Firestore/Source/Core/FSTSyncEngine.h"
Expand All @@ -31,26 +33,31 @@
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
#include "Firestore/core/src/firebase/firestore/model/types.h"
#include "Firestore/core/src/firebase/firestore/util/statusor.h"
#include "Firestore/core/test/firebase/firestore/testutil/xcgmock.h"

using firebase::firestore::core::ListenOptions;
using firebase::firestore::core::ViewSnapshot;
using firebase::firestore::core::ViewSnapshotHandler;
using firebase::firestore::model::DocumentKeySet;
using firebase::firestore::model::DocumentSet;
using firebase::firestore::model::OnlineState;
using firebase::firestore::util::StatusOr;
using testing::ElementsAre;

NS_ASSUME_NONNULL_BEGIN

/**
* Converts an OnlineState to an NSNumber, usually for the purpose of adding
* it to an NSArray or similar container. There's no direct conversion from a
* strongly-typed enum to an integral type that could be passed to an NSNumber
* initializer.
*/
static NSNumber *ToNSNumber(OnlineState state) {
return @(static_cast<std::underlying_type<OnlineState>::type>(state));
namespace {

ViewSnapshotHandler NoopViewSnapshotHandler() {
return [](const StatusOr<ViewSnapshot> &) {};
}

std::shared_ptr<QueryListener> NoopQueryListener(FSTQuery *query) {
return QueryListener::Create(query, NoopViewSnapshotHandler());
}

} // namespace

// FSTEventManager implements this delegate privately
@interface FSTEventManager () <FSTSyncEngineDelegate>
@end
Expand All @@ -60,16 +67,10 @@ @interface FSTEventManagerTests : XCTestCase

@implementation FSTEventManagerTests

- (FSTQueryListener *)noopListenerForQuery:(FSTQuery *)query {
return [[FSTQueryListener alloc] initWithQuery:query
options:ListenOptions::DefaultOptions()
viewSnapshotHandler:[](const StatusOr<ViewSnapshot> &) {}];
}

- (void)testHandlesManyListenersPerQuery {
FSTQuery *query = FSTTestQuery("foo/bar");
FSTQueryListener *listener1 = [self noopListenerForQuery:query];
FSTQueryListener *listener2 = [self noopListenerForQuery:query];
auto listener1 = NoopQueryListener(query);
auto listener2 = NoopQueryListener(query);

FSTSyncEngine *syncEngineMock = OCMStrictClassMock([FSTSyncEngine class]);
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
Expand All @@ -89,7 +90,7 @@ - (void)testHandlesManyListenersPerQuery {

- (void)testHandlesUnlistenOnUnknownListenerGracefully {
FSTQuery *query = FSTTestQuery("foo/bar");
FSTQueryListener *listener = [self noopListenerForQuery:query];
auto listener = NoopQueryListener(query);

FSTSyncEngine *syncEngineMock = OCMStrictClassMock([FSTSyncEngine class]);
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
Expand All @@ -99,13 +100,6 @@ - (void)testHandlesUnlistenOnUnknownListenerGracefully {
OCMVerifyAll((id)syncEngineMock);
}

- (FSTQueryListener *)queryListenerForQuery:(FSTQuery *)query
withHandler:(ViewSnapshotHandler &&)handler {
return [[FSTQueryListener alloc] initWithQuery:query
options:ListenOptions::DefaultOptions()
viewSnapshotHandler:std::move(handler)];
}

- (ViewSnapshot)makeEmptyViewSnapshotWithQuery:(FSTQuery *)query {
DocumentSet emptyDocs{query.comparator};
// sync_state_changed has to be `true` to prevent an assertion about a meaningless view snapshot.
Expand All @@ -118,23 +112,17 @@ - (void)testNotifiesListenersInTheRightOrder {
FSTQuery *query2 = FSTTestQuery("bar/baz");
NSMutableArray *eventOrder = [NSMutableArray array];

FSTQueryListener *listener1 =
[self queryListenerForQuery:query1
withHandler:[eventOrder](const StatusOr<ViewSnapshot> &) {
[eventOrder addObject:@"listener1"];
}];
auto listener1 = QueryListener::Create(query1, [eventOrder](const StatusOr<ViewSnapshot> &) {
[eventOrder addObject:@"listener1"];
});

FSTQueryListener *listener2 =
[self queryListenerForQuery:query2
withHandler:[eventOrder](const StatusOr<ViewSnapshot> &) {
[eventOrder addObject:@"listener2"];
}];
auto listener2 = QueryListener::Create(query2, [eventOrder](const StatusOr<ViewSnapshot> &) {
[eventOrder addObject:@"listener2"];
});

FSTQueryListener *listener3 =
[self queryListenerForQuery:query1
withHandler:[eventOrder](const StatusOr<ViewSnapshot> &) {
[eventOrder addObject:@"listener3"];
}];
auto listener3 = QueryListener::Create(query1, [eventOrder](const StatusOr<ViewSnapshot> &) {
[eventOrder addObject:@"listener3"];
});

FSTSyncEngine *syncEngineMock = OCMClassMock([FSTSyncEngine class]);
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
Expand All @@ -155,27 +143,31 @@ - (void)testNotifiesListenersInTheRightOrder {

- (void)testWillForwardOnlineStateChanges {
FSTQuery *query = FSTTestQuery("foo/bar");
FSTQueryListener *fakeListener = OCMClassMock([FSTQueryListener class]);
NSMutableArray *events = [NSMutableArray array];
OCMStub([fakeListener query]).andReturn(query);
OCMStub([fakeListener applyChangedOnlineState:OnlineState::Unknown])
.andDo(^(NSInvocation *invocation) {
[events addObject:ToNSNumber(OnlineState::Unknown)];
});
OCMStub([fakeListener applyChangedOnlineState:OnlineState::Online])
.andDo(^(NSInvocation *invocation) {
[events addObject:ToNSNumber(OnlineState::Online)];
});

class FakeQueryListener : public QueryListener {
public:
explicit FakeQueryListener(FSTQuery *query)
: QueryListener(query, ListenOptions::DefaultOptions(), NoopViewSnapshotHandler()) {
}

void OnOnlineStateChanged(OnlineState online_state) override {
events.push_back(online_state);
}

std::vector<OnlineState> events;
};

auto fake_listener = std::make_shared<FakeQueryListener>(query);

FSTSyncEngine *syncEngineMock = OCMClassMock([FSTSyncEngine class]);
OCMExpect([syncEngineMock setSyncEngineDelegate:[OCMArg any]]);
FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];

[eventManager addListener:fakeListener];
XCTAssertEqualObjects(events, @[ ToNSNumber(OnlineState::Unknown) ]);
[eventManager addListener:fake_listener];
XC_ASSERT_THAT(fake_listener->events, ElementsAre(OnlineState::Unknown));

[eventManager applyChangedOnlineState:OnlineState::Online];
XCTAssertEqualObjects(events,
(@[ ToNSNumber(OnlineState::Unknown), ToNSNumber(OnlineState::Online) ]));
XC_ASSERT_THAT(fake_listener->events, ElementsAre(OnlineState::Unknown, OnlineState::Online));
}

@end
Expand Down
Loading