Skip to content

Commit ab32603

Browse files
committed
fix(app_check): fix an issue with debug token that would sometime not be passed to native properly
1 parent 7ce191c commit ab32603

3 files changed

Lines changed: 165 additions & 13 deletions

File tree

packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/method_channel/method_channel_firebase_app_check.dart

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,6 @@ class MethodChannelFirebaseAppCheck extends FirebaseAppCheckPlatform {
9292
WindowsAppCheckProvider? providerWindows,
9393
}) async {
9494
try {
95-
String? debugToken;
96-
if (providerAndroid is AndroidDebugProvider &&
97-
providerAndroid.debugToken != null) {
98-
debugToken = providerAndroid.debugToken;
99-
} else if (providerApple is AppleDebugProvider &&
100-
providerApple.debugToken != null) {
101-
debugToken = providerApple.debugToken;
102-
} else if (providerWindows is WindowsDebugProvider &&
103-
providerWindows.debugToken != null) {
104-
debugToken = providerWindows.debugToken;
105-
}
106-
10795
await _pigeonApi.activate(
10896
app.name,
10997
defaultTargetPlatform == TargetPlatform.android || kDebugMode
@@ -120,7 +108,11 @@ class MethodChannelFirebaseAppCheck extends FirebaseAppCheckPlatform {
120108
newProvider: providerApple,
121109
)
122110
: null,
123-
debugToken,
111+
_getDebugToken(
112+
providerAndroid: providerAndroid,
113+
providerApple: providerApple,
114+
providerWindows: providerWindows,
115+
),
124116
);
125117
} on PlatformException catch (e, s) {
126118
convertPlatformException(e, s);
@@ -164,3 +156,28 @@ class MethodChannelFirebaseAppCheck extends FirebaseAppCheckPlatform {
164156
}
165157
}
166158
}
159+
160+
String? _getDebugToken({
161+
AndroidAppCheckProvider? providerAndroid,
162+
AppleAppCheckProvider? providerApple,
163+
WindowsAppCheckProvider? providerWindows,
164+
}) {
165+
switch (defaultTargetPlatform) {
166+
case TargetPlatform.android:
167+
return providerAndroid is AndroidDebugProvider
168+
? providerAndroid.debugToken
169+
: null;
170+
case TargetPlatform.iOS:
171+
case TargetPlatform.macOS:
172+
return providerApple is AppleDebugProvider
173+
? providerApple.debugToken
174+
: null;
175+
case TargetPlatform.windows:
176+
return providerWindows is WindowsDebugProvider
177+
? providerWindows.debugToken
178+
: null;
179+
case TargetPlatform.fuchsia:
180+
case TargetPlatform.linux:
181+
return null;
182+
}
183+
}

packages/firebase_app_check/firebase_app_check_platform_interface/test/method_channel_tests/method_channel_firebase_app_check_test.dart

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
// found in the LICENSE file.
44

55
import 'package:firebase_app_check_platform_interface/firebase_app_check_platform_interface.dart';
6+
import 'package:firebase_app_check_platform_interface/src/pigeon/messages.pigeon.dart';
67
import 'package:firebase_core/firebase_core.dart';
8+
import 'package:flutter/foundation.dart';
9+
import 'package:flutter/services.dart';
710
import 'package:flutter_test/flutter_test.dart';
811

912
import '../mock.dart';
@@ -26,6 +29,15 @@ void main() {
2629
);
2730
});
2831

32+
tearDown(() {
33+
debugDefaultTargetPlatformOverride = null;
34+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
35+
.setMockMessageHandler(
36+
'dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate',
37+
null,
38+
);
39+
});
40+
2941
group('delegateFor()', () {
3042
test('returns a [FirebaseAppCheckPlatform]', () {
3143
final appCheck = FirebaseAppCheckPlatform.instance;
@@ -44,5 +56,71 @@ void main() {
4456
expect(appCheck.setInitialValues(), appCheck);
4557
});
4658
});
59+
60+
group('activate()', () {
61+
test('passes the Apple debug token on Apple platforms', () async {
62+
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
63+
final calls = <List<Object?>>[];
64+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
65+
.setMockMessageHandler(
66+
'dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate',
67+
(ByteData? message) async {
68+
calls.add(
69+
FirebaseAppCheckHostApi.pigeonChannelCodec.decodeMessage(message)
70+
as List<Object?>,
71+
);
72+
return FirebaseAppCheckHostApi.pigeonChannelCodec.encodeMessage(
73+
<Object?>[],
74+
);
75+
},
76+
);
77+
78+
final appCheck = MethodChannelFirebaseAppCheck(app: secondaryApp);
79+
80+
await appCheck.activate(
81+
providerAndroid: const AndroidDebugProvider(
82+
debugToken: 'android-debug-token',
83+
),
84+
providerApple: const AppleDebugProvider(
85+
debugToken: 'apple-debug-token',
86+
),
87+
);
88+
89+
expect(calls, hasLength(1));
90+
expect(calls.single[3], 'apple-debug-token');
91+
});
92+
93+
test('passes the Android debug token on Android', () async {
94+
debugDefaultTargetPlatformOverride = TargetPlatform.android;
95+
final calls = <List<Object?>>[];
96+
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
97+
.setMockMessageHandler(
98+
'dev.flutter.pigeon.firebase_app_check_platform_interface.FirebaseAppCheckHostApi.activate',
99+
(ByteData? message) async {
100+
calls.add(
101+
FirebaseAppCheckHostApi.pigeonChannelCodec.decodeMessage(message)
102+
as List<Object?>,
103+
);
104+
return FirebaseAppCheckHostApi.pigeonChannelCodec.encodeMessage(
105+
<Object?>[],
106+
);
107+
},
108+
);
109+
110+
final appCheck = MethodChannelFirebaseAppCheck(app: secondaryApp);
111+
112+
await appCheck.activate(
113+
providerAndroid: const AndroidDebugProvider(
114+
debugToken: 'android-debug-token',
115+
),
116+
providerApple: const AppleDebugProvider(
117+
debugToken: 'apple-debug-token',
118+
),
119+
);
120+
121+
expect(calls, hasLength(1));
122+
expect(calls.single[3], 'android-debug-token');
123+
});
124+
});
47125
});
48126
}

tests/integration_test/firebase_app_check/firebase_app_check_e2e_test.dart

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
// ignore_for_file: do_not_use_environment
6+
57
import 'package:firebase_app_check/firebase_app_check.dart';
68
import 'package:firebase_core/firebase_core.dart';
79
import 'package:flutter/foundation.dart';
810
import 'package:flutter_test/flutter_test.dart';
911
import 'package:integration_test/integration_test.dart';
1012
import 'package:tests/firebase_options.dart';
1113

14+
const androidDebugToken =
15+
String.fromEnvironment('APP_CHECK_ANDROID_DEBUG_TOKEN');
16+
17+
const appleDebugToken = String.fromEnvironment('APP_CHECK_APPLE_DEBUG_TOKEN');
18+
1219
void main() {
1320
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
1421

@@ -99,6 +106,56 @@ void main() {
99106
},
100107
skip: defaultTargetPlatform != TargetPlatform.iOS,
101108
);
109+
110+
test(
111+
'uses Apple debug token when both Android and Apple debug tokens are configured',
112+
() async {
113+
await FirebaseAppCheck.instance.activate(
114+
providerAndroid: const AndroidDebugProvider(
115+
debugToken: androidDebugToken,
116+
),
117+
providerApple: const AppleDebugProvider(
118+
debugToken: appleDebugToken,
119+
),
120+
);
121+
122+
await expectLater(
123+
FirebaseAppCheck.instance.getToken(true),
124+
completes,
125+
);
126+
},
127+
skip: defaultTargetPlatform != TargetPlatform.iOS ||
128+
androidDebugToken.isEmpty ||
129+
appleDebugToken.isEmpty
130+
? 'Requires iOS plus APP_CHECK_ANDROID_DEBUG_TOKEN and '
131+
'APP_CHECK_APPLE_DEBUG_TOKEN dart-defines.'
132+
: null,
133+
);
134+
135+
test(
136+
'uses Android debug token when both Android and Apple debug tokens are configured',
137+
() async {
138+
await FirebaseAppCheck.instance.activate(
139+
providerAndroid: const AndroidDebugProvider(
140+
debugToken: androidDebugToken,
141+
),
142+
providerApple: const AppleDebugProvider(
143+
debugToken: appleDebugToken,
144+
),
145+
);
146+
147+
await expectLater(
148+
FirebaseAppCheck.instance.getToken(true),
149+
completes,
150+
);
151+
},
152+
skip: defaultTargetPlatform != TargetPlatform.android ||
153+
androidDebugToken.isEmpty ||
154+
appleDebugToken.isEmpty
155+
? 'Requires Android plus APP_CHECK_ANDROID_DEBUG_TOKEN and '
156+
'APP_CHECK_APPLE_DEBUG_TOKEN dart-defines.'
157+
: null,
158+
);
102159
},
103160
);
104161
}

0 commit comments

Comments
 (0)