From aa312c6c116d43411950cd601b51a9d32265e5c0 Mon Sep 17 00:00:00 2001 From: Ellet Date: Thu, 3 Jul 2025 00:32:37 +0300 Subject: [PATCH] test: ensure localhost and 10.0.2.2 are handled --- .../firebase_storage/lib/src/utils.dart | 14 ++++---- .../firebase_storage/test/utils_test.dart | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/packages/firebase_storage/firebase_storage/lib/src/utils.dart b/packages/firebase_storage/firebase_storage/lib/src/utils.dart index ae977b53ad81..8100e2e8dd78 100644 --- a/packages/firebase_storage/firebase_storage/lib/src/utils.dart +++ b/packages/firebase_storage/firebase_storage/lib/src/utils.dart @@ -43,13 +43,13 @@ Map? partsFromHttpUrl(String url) { return null; } - // firebase storage url - // 10.0.2.2 is for Android when using firebase emulator - if (decodedUrl.contains(_firebaseStorageHost) || - decodedUrl.contains('localhost') || - decodedUrl.contains('10.0.2.2')) { + // 10.0.2.2 is used on Android emulators for connecting to the host machine's Firebase emulator. + final isEmulatorHost = + decodedUrl.contains('localhost') || decodedUrl.contains('10.0.2.2'); + final isFirebaseStorageUrl = decodedUrl.contains(_firebaseStorageHost); + if (isFirebaseStorageUrl || isEmulatorHost) { String origin; - if (decodedUrl.contains('localhost') || decodedUrl.contains('10.0.2.2')) { + if (isEmulatorHost) { Uri uri = Uri.parse(url); origin = '^http?://${uri.host}:${uri.port}'; } else { @@ -71,8 +71,8 @@ Map? partsFromHttpUrl(String url) { 'bucket': match.group(1), 'path': match.group(3), }; - // google cloud storage url } else { + // Google Cloud storage url RegExp cloudStorageRegExp = RegExp( '^https?://$_cloudStorageHost$_optionalPort/$_bucketDomain/$_cloudStoragePath', caseSensitive: false, diff --git a/packages/firebase_storage/firebase_storage/test/utils_test.dart b/packages/firebase_storage/firebase_storage/test/utils_test.dart index b48546f558af..c79b24fa6197 100644 --- a/packages/firebase_storage/firebase_storage/test/utils_test.dart +++ b/packages/firebase_storage/firebase_storage/test/utils_test.dart @@ -104,6 +104,38 @@ void main() { expect(result?['path'], 'path/to/foo_bar.jpg'); }); + test( + 'parses HTTP URL correctly when using Android emulator localhost (10.0.2.2)', + () { + const androidLocalhost = '10.0.2.2'; + + final result = partsFromHttpUrl( + 'http://$androidLocalhost:9199/v0/b/myapp.appspot.com/o/path/to/foo_bar.jpg'); + + expect( + result, + isNotNull, + reason: + 'partsFromHttpUrl should not return null for Android localhost URLs', + ); + expect(result?['bucket'], 'myapp.appspot.com'); + expect(result?['path'], 'path/to/foo_bar.jpg'); + }); + + test('parses HTTP URL correctly when using standard localhost (127.0.0.1)', + () { + final result = partsFromHttpUrl( + 'http://localhost:9199/v0/b/myapp.appspot.com/o/path/to/foo_bar.jpg'); + + expect( + result, + isNotNull, + reason: 'partsFromHttpUrl should not return null for localhost URLs', + ); + expect(result?['bucket'], 'myapp.appspot.com'); + expect(result?['path'], 'path/to/foo_bar.jpg'); + }); + // TODO(helenaford): regexp can't handle no paths // test('sets path to default if null', () { // String url =