Firebase Storage: Implement List and ListAll API for StorageReference by jonsimantov · Pull Request #1726 · firebase/firebase-cpp-sdk

@google-labs-jules

Adds the `List(max_results, page_token)` and `ListAll()` methods to the
`firebase::storage::StorageReference` C++ API.

These methods allow you to list objects and common prefixes (directories)
within a storage location.

Features:
- Paginated listing using `List(max_results, page_token)`.
- Comprehensive listing using `ListAll()`.
- Returns a `Future<ListResult>`, where `ListResult` contains a list of
  `StorageReference` objects for items and prefixes, and a page token
  for continuation.
- Implemented for Android by calling the underlying Firebase Android SDK's
  list operations via JNI.
- Implemented for iOS by calling the underlying Firebase iOS SDK's list
  operations.
- Desktop platform provides stubs that return `kErrorUnimplemented`.
- Includes comprehensive integration tests covering various scenarios such
  as basic listing, pagination, empty folders, and listing non-existent
  paths.

jonsimantov

Here's a summary of the changes:

- Integration Tests:
    - I removed `SKIP_TEST_ON_ANDROID_EMULATOR` from the `ListAllBasic` and `ListPaginated` tests.
    - I refactored the list tests so they create their own unique root folders instead of using a shared one in the test fixture. This improves test isolation.
- Code Style:
    - I removed unnecessary comments that were explaining header includes.
    - I removed placeholder comments from public headers.
    - I updated the copyright year to 2025 in all newly added files.
- Android Performance:
    - I optimized Android's `ListResultInternal` to cache converted items, prefixes, and the page token. This will avoid repeated JNI calls on subsequent accesses.
- Cleanup Mechanism:
    - I simplified the `ListResult` cleanup by removing the `ListResultInternalCommon` class. `ListResult` now directly manages the cleanup registration of its `internal_` member, similar to `StorageReference`.
Incorporates feedback from the initial review of the List API:

- Build Fix:
    - Explicitly namespaced StorageReference in list_result.h to resolve undeclared identifier error.
- Integration Tests:
    - Removed SKIP_TEST_ON_ANDROID_EMULATOR from ListAllBasic and ListPaginated tests.
    - Refactored list tests to create their own unique root folders instead of using a shared one in the test fixture, improving test isolation.
- Code Style:
    - Removed unnecessary comments explaining header includes.
    - Removed placeholder comments from public headers.
    - Updated copyright year to 2025 in all newly added files.
    - Ran code formatter (scripts/format_code.py -git_diff) on all changed files.
- Android Performance:
    - Optimized Android's ListResultInternal to cache converted items, prefixes, and page token. This avoids repeated JNI calls on subsequent accesses.
- Cleanup Mechanism:
    - Simplified ListResult cleanup by removing the ListResultInternalCommon class. ListResult now directly manages the cleanup registration of its internal_ member, similar to StorageReference.
…etween `storage_reference.h` and `list_result.h` by forward-declaring `ListResult` in `storage_reference.h`.

This commit also incorporates your previous feedback from the initial review of the List API:

- Build Fixes:
    - Forward-declared `ListResult` in `storage_reference.h`.
    - Reverted non-standard include placement in `list_result.h`.
    - Explicitly namespaced `StorageReference` in `list_result.h` (previous attempt, kept).
- Integration Tests:
    - Removed `SKIP_TEST_ON_ANDROID_EMULATOR` from `ListAllBasic` and `ListPaginated` tests.
    - Refactored list tests to create their own unique root folders instead of using a shared one in the test fixture, improving test isolation.
- Code Style:
    - Removed unnecessary comments explaining header includes.
    - Removed placeholder comments from public headers.
    - Updated copyright year to 2025 in all newly added files.
    - Ran the code formatter on all changed files.
- Android Performance:
    - Optimized Android's `ListResultInternal` to cache converted items, prefixes, and page token. This avoids repeated JNI calls on subsequent accesses.
- Cleanup Mechanism:
    - Simplified `ListResult` cleanup by removing the `ListResultInternalCommon` class. `ListResult` now directly manages the cleanup registration of its `internal_` member, similar to `StorageReference`.

@google-labs-jules

…ack for the List API.

Here's a summary of the changes:

I resolved build errors related to includes and circular dependencies for the Storage List API. Specifically:
- I fixed a circular include dependency between `storage_reference.h` and `list_result.h` by forward-declaring `ListResult` in `storage_reference.h`.
- I corrected the include path for platform-specific `StorageInternal` in `list_result.cc`.

This update also incorporates your previous feedback from the initial review:

- Build Fixes:
    - I forward-declared `ListResult` in `storage_reference.h`.
    - I reverted non-standard include placement in `list_result.h`.
    - I explicitly namespaced `StorageReference` in `list_result.h` (this was a previous attempt that I kept).
    - I corrected the `StorageInternal` include in `list_result.cc`.
- Integration Tests:
    - I removed `SKIP_TEST_ON_ANDROID_EMULATOR` from `ListAllBasic` and `ListPaginated` tests.
    - I refactored list tests to create their own unique root folders instead of using a shared one in the test fixture, which should improve test isolation.
- Code Style:
    - I removed unnecessary comments explaining header includes.
    - I removed placeholder comments from public headers.
    - I updated the copyright year to 2025 in all newly added files.
    - I applied code formatting to all changed files.
- Android Performance:
    - I optimized Android's `ListResultInternal` to cache converted items, prefixes, and page token. This should avoid repeated JNI calls on subsequent accesses.
- Cleanup Mechanism:
    - I simplified `ListResult` cleanup by removing the `ListResultInternalCommon` class. `ListResult` now directly manages the cleanup registration of its `internal_` member, similar to `StorageReference`.
Corrects include directives for platform-specific StorageInternal
definitions in list_result_android.h, list_result_ios.h, and
list_result_desktop.h. Removes includes for the deleted
ListResultInternalCommon class.

This commit also incorporates previous feedback and build fixes:

- Build Fixes:
    - Resolved circular include dependency between storage_reference.h and
      list_result.h by forward-declaring ListResult in storage_reference.h.
    - Corrected includes in list_result.cc and platform-specific
      list_result_*.h files to use appropriate platform-specific
      headers for StorageInternal definitions.
- Integration Tests:
    - Removed SKIP_TEST_ON_ANDROID_EMULATOR from ListAllBasic and ListPaginated tests.
    - Refactored list tests to create their own unique root folders.
- Code Style:
    - Removed unnecessary comments.
    - Updated copyright years to 2025.
    - Ran code formatter on all changed files.
- Android Performance:
    - Optimized Android's ListResultInternal to cache converted data.
- Cleanup Mechanism:
    - Simplified ListResult cleanup logic.
Addresses all outstanding review comments and build errors for the
Storage List API feature. This includes:

- Build Fixes:
    - Resolved circular include dependency between storage_reference.h and
      list_result.h by forward-declaring ListResult in storage_reference.h.
    - Corrected includes in list_result.cc and platform-specific
      list_result_*.h files to use appropriate platform-specific
      headers for StorageInternal definitions.
- Code Cleanup:
    - Thoroughly removed commented-out code and unused includes.
    - Removed all explanatory comments next to #include directives.
    - Eliminated stray or development-related comments.
- Integration Tests:
    - Removed SKIP_TEST_ON_ANDROID_EMULATOR from ListAllBasic and ListPaginated tests.
    - Refactored list tests to create their own unique root folders.
- Code Style:
    - Updated copyright year to 2025 in all newly added files.
    - Ran code formatter (scripts/format_code.py -git_diff) on all changed files.
- Android Performance:
    - Optimized Android's ListResultInternal to cache converted data.
- Cleanup Mechanism:
    - Simplified ListResult cleanup logic by removing ListResultInternalCommon.