From 7a4a2ea10844afd6a58dace46854fae74399f55c Mon Sep 17 00:00:00 2001 From: zxu Date: Tue, 20 Feb 2018 12:25:39 -0500 Subject: replacing FSTGetTokenResult by C++ Token implementation (#805) * replacing Auth/FSTUser by C++ auth implementation * address changes * replacing FSTGetTokenResult by C++ Token implementation * address changes * address changes * fix another const& v.s. dispatch bug * fix more const& v.s. dispatch bug zxu123 committed * fix * passing by value in callback --- .../firebase/firestore/auth/credentials_provider.h | 4 ++-- Firestore/core/src/firebase/firestore/auth/token.cc | 10 +++++++++- Firestore/core/src/firebase/firestore/auth/token.h | 19 +++++++++++++++++++ .../core/src/firebase/firestore/util/string_apple.h | 11 ++++++++++- .../firestore/auth/credentials_provider_test.cc | 6 ++---- .../firestore/auth/empty_credentials_provider_test.cc | 5 ++--- .../auth/firebase_credentials_provider_test.mm | 5 ++--- .../core/test/firebase/firestore/auth/token_test.cc | 8 ++++++++ 8 files changed, 54 insertions(+), 14 deletions(-) (limited to 'Firestore/core') diff --git a/Firestore/core/src/firebase/firestore/auth/credentials_provider.h b/Firestore/core/src/firebase/firestore/auth/credentials_provider.h index 2a52c99..917f8e1 100644 --- a/Firestore/core/src/firebase/firestore/auth/credentials_provider.h +++ b/Firestore/core/src/firebase/firestore/auth/credentials_provider.h @@ -31,11 +31,11 @@ namespace auth { // `TokenErrorListener` is a listener that gets a token or an error. // token: An auth token as a string, or nullptr if error occurred. // error: The error if one occurred, or else nullptr. -typedef std::function +typedef std::function TokenListener; // Listener notified with a User change. -typedef std::function UserChangeListener; +typedef std::function UserChangeListener; /** * Provides methods for getting the uid and token for the current user and diff --git a/Firestore/core/src/firebase/firestore/auth/token.cc b/Firestore/core/src/firebase/firestore/auth/token.cc index 0618ddb..4ee1b69 100644 --- a/Firestore/core/src/firebase/firestore/auth/token.cc +++ b/Firestore/core/src/firebase/firestore/auth/token.cc @@ -21,7 +21,15 @@ namespace firestore { namespace auth { Token::Token(const absl::string_view token, const User& user) - : token_(token), user_(user) { + : token_(token), user_(user), is_valid_(true) { +} + +Token::Token() : token_(), user_(User::Unauthenticated()), is_valid_(false) { +} + +const Token& Token::Invalid() { + static const Token kInvalidToken; + return kInvalidToken; } } // namespace auth diff --git a/Firestore/core/src/firebase/firestore/auth/token.h b/Firestore/core/src/firebase/firestore/auth/token.h index f3b7363..ff8d2f0 100644 --- a/Firestore/core/src/firebase/firestore/auth/token.h +++ b/Firestore/core/src/firebase/firestore/auth/token.h @@ -20,6 +20,7 @@ #include #include "Firestore/core/src/firebase/firestore/auth/user.h" +#include "Firestore/core/src/firebase/firestore/util/firebase_assert.h" #include "absl/strings/string_view.h" namespace firebase { @@ -45,6 +46,7 @@ class Token { /** The actual raw token. */ const std::string& token() const { + FIREBASE_ASSERT(is_valid_); return token_; } @@ -56,9 +58,26 @@ class Token { return user_; } + /** + * Whether the token is a valid one. + * + * ## Portability notes: Invalid token is the equivalent of nil in the iOS + * token implementation. We use value instead of pointer for Token instance in + * the C++ migration. + */ + bool is_valid() const { + return is_valid_; + } + + /** Returns an invalid token. */ + static const Token& Invalid(); + private: + Token(); + const std::string token_; const User user_; + const bool is_valid_; }; } // namespace auth diff --git a/Firestore/core/src/firebase/firestore/util/string_apple.h b/Firestore/core/src/firebase/firestore/util/string_apple.h index fe2a487..3f6b814 100644 --- a/Firestore/core/src/firebase/firestore/util/string_apple.h +++ b/Firestore/core/src/firebase/firestore/util/string_apple.h @@ -42,7 +42,16 @@ inline NSString* WrapNSStringNoCopy(const absl::string_view str) { return WrapNSStringNoCopy(str.data()); } -// Creates an absl::string_view wrapper for the contents of the given NSString. +// Translates a string_view string to the equivalent NSString by making a copy. +inline NSString* WrapNSString(const absl::string_view str) { + return [[NSString alloc] + initWithBytes:const_cast(static_cast(str.data())) + length:str.length() + encoding:NSUTF8StringEncoding]; +} + +// Creates an absl::string_view wrapper for the contents of the given +// NSString. inline absl::string_view MakeStringView(NSString* str) { return absl::string_view( [str UTF8String], [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); diff --git a/Firestore/core/test/firebase/firestore/auth/credentials_provider_test.cc b/Firestore/core/test/firebase/firestore/auth/credentials_provider_test.cc index 1748422..9ae71ba 100644 --- a/Firestore/core/test/firebase/firestore/auth/credentials_provider_test.cc +++ b/Firestore/core/test/firebase/firestore/auth/credentials_provider_test.cc @@ -25,7 +25,7 @@ namespace auth { #define UNUSED(x) (void)(x) TEST(CredentialsProvider, Typedef) { - TokenListener token_listener = [](const Token& token, + TokenListener token_listener = [](Token token, const absl::string_view error) { UNUSED(token); UNUSED(error); @@ -37,9 +37,7 @@ TEST(CredentialsProvider, Typedef) { EXPECT_EQ(nullptr, token_listener); EXPECT_FALSE(token_listener); - UserChangeListener user_change_listener = [](const User& user) { - UNUSED(user); - }; + UserChangeListener user_change_listener = [](User user) { UNUSED(user); }; EXPECT_NE(nullptr, user_change_listener); EXPECT_TRUE(user_change_listener); diff --git a/Firestore/core/test/firebase/firestore/auth/empty_credentials_provider_test.cc b/Firestore/core/test/firebase/firestore/auth/empty_credentials_provider_test.cc index 123f952..39012f0 100644 --- a/Firestore/core/test/firebase/firestore/auth/empty_credentials_provider_test.cc +++ b/Firestore/core/test/firebase/firestore/auth/empty_credentials_provider_test.cc @@ -25,8 +25,7 @@ namespace auth { TEST(EmptyCredentialsProvider, GetToken) { EmptyCredentialsProvider credentials_provider; credentials_provider.GetToken( - /*force_refresh=*/true, - [](const Token& token, const absl::string_view error) { + /*force_refresh=*/true, [](Token token, const absl::string_view error) { EXPECT_EQ("", token.token()); const User& user = token.user(); EXPECT_EQ("", user.uid()); @@ -37,7 +36,7 @@ TEST(EmptyCredentialsProvider, GetToken) { TEST(EmptyCredentialsProvider, SetListener) { EmptyCredentialsProvider credentials_provider; - credentials_provider.SetUserChangeListener([](const User& user) { + credentials_provider.SetUserChangeListener([](User user) { EXPECT_EQ("", user.uid()); EXPECT_FALSE(user.is_authenticated()); }); diff --git a/Firestore/core/test/firebase/firestore/auth/firebase_credentials_provider_test.mm b/Firestore/core/test/firebase/firestore/auth/firebase_credentials_provider_test.mm index 8d2b361..e98d3d8 100644 --- a/Firestore/core/test/firebase/firestore/auth/firebase_credentials_provider_test.mm +++ b/Firestore/core/test/firebase/firestore/auth/firebase_credentials_provider_test.mm @@ -65,8 +65,7 @@ TEST_F(FirebaseCredentialsProviderTest, GetToken) { FirebaseCredentialsProvider credentials_provider([FIRApp defaultApp]); credentials_provider.GetToken( - /*force_refresh=*/true, - [](const Token& token, const absl::string_view error) { + /*force_refresh=*/true, [](Token token, const absl::string_view error) { EXPECT_EQ("", token.token()); const User& user = token.user(); EXPECT_EQ("I'm a fake uid.", user.uid()); @@ -82,7 +81,7 @@ TEST_F(FirebaseCredentialsProviderTest, SetListener) { } FirebaseCredentialsProvider credentials_provider([FIRApp defaultApp]); - credentials_provider.SetUserChangeListener([](const User& user) { + credentials_provider.SetUserChangeListener([](User user) { EXPECT_EQ("I'm a fake uid.", user.uid()); EXPECT_TRUE(user.is_authenticated()); }); diff --git a/Firestore/core/test/firebase/firestore/auth/token_test.cc b/Firestore/core/test/firebase/firestore/auth/token_test.cc index a0f2c48..8f784d6 100644 --- a/Firestore/core/test/firebase/firestore/auth/token_test.cc +++ b/Firestore/core/test/firebase/firestore/auth/token_test.cc @@ -26,6 +26,14 @@ TEST(Token, Getter) { Token token("token", User("abc")); EXPECT_EQ("token", token.token()); EXPECT_EQ(User("abc"), token.user()); + EXPECT_TRUE(token.is_valid()); +} + +TEST(Token, InvalidToken) { + const Token& token = Token::Invalid(); + EXPECT_ANY_THROW(token.token()); + EXPECT_EQ(User::Unauthenticated(), token.user()); + EXPECT_FALSE(token.is_valid()); } } // namespace auth -- cgit v1.2.3