Skip to content

Commit b0bc6e8

Browse files
authored
fix(app_check): fix an issue with debug token that would sometime not be passed properly (#18258)
1 parent 57d4c3d commit b0bc6e8

3 files changed

Lines changed: 164 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: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
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';
79
import 'package:flutter_test/flutter_test.dart';
810

911
import '../mock.dart';
@@ -26,6 +28,15 @@ void main() {
2628
);
2729
});
2830

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

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)