Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package aws-c-sdkutils for openSUSE:Factory 
checked in at 2025-01-12 11:21:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/aws-c-sdkutils (Old)
 and      /work/SRC/openSUSE:Factory/.aws-c-sdkutils.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "aws-c-sdkutils"

Sun Jan 12 11:21:16 2025 rev:8 rq:1236874 version:0.2.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/aws-c-sdkutils/aws-c-sdkutils.changes    
2024-11-14 16:08:53.679294832 +0100
+++ /work/SRC/openSUSE:Factory/.aws-c-sdkutils.new.1881/aws-c-sdkutils.changes  
2025-01-12 11:28:19.757413232 +0100
@@ -1,0 +2,8 @@
+Thu Jan  9 10:39:28 UTC 2025 - John Paul Adrian Glaubitz 
<[email protected]>
+
+- Update to version 0.2.2
+  * Switch CI to use Roles by @DmitriyMusatkin in (#49)
+  * Update Config File Parsing Logic to Parse Services
+    Section by @waahm7 in (#51)
+
+-------------------------------------------------------------------

Old:
----
  v0.2.1.tar.gz

New:
----
  v0.2.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ aws-c-sdkutils.spec ++++++
--- /var/tmp/diff_new_pack.ea2UHD/_old  2025-01-12 11:28:20.201431504 +0100
+++ /var/tmp/diff_new_pack.ea2UHD/_new  2025-01-12 11:28:20.201431504 +0100
@@ -20,7 +20,7 @@
 %define library_pkg 1_0_0
 %define library_soversion 1
 Name:           aws-c-sdkutils
-Version:        0.2.1
+Version:        0.2.2
 Release:        0
 Summary:        AWS C SDK Utils
 License:        Apache-2.0

++++++ v0.2.1.tar.gz -> v0.2.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aws-c-sdkutils-0.2.1/.github/workflows/ci.yml 
new/aws-c-sdkutils-0.2.2/.github/workflows/ci.yml
--- old/aws-c-sdkutils-0.2.1/.github/workflows/ci.yml   2024-11-07 
21:45:25.000000000 +0100
+++ new/aws-c-sdkutils-0.2.2/.github/workflows/ci.yml   2025-01-08 
20:36:20.000000000 +0100
@@ -6,18 +6,20 @@
       - 'main'
 
 env:
-  BUILDER_VERSION: v0.9.62
+  BUILDER_VERSION: v0.9.72
   BUILDER_SOURCE: releases
   BUILDER_HOST: https://d19elf31gohf1l.cloudfront.net
   PACKAGE_NAME: aws-c-sdkutils
   LINUX_BASE_IMAGE: ubuntu-18-x64
-  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
-  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
-  AWS_REGION: us-east-1
+  CRT_CI_ROLE: ${{ secrets.CRT_CI_ROLE_ARN }}
+  AWS_DEFAULT_REGION: us-east-1
+
+permissions:
+  id-token: write # This is required for requesting the JWT
 
 jobs:
   linux-compat:
-    runs-on: ubuntu-20.04 # latest
+    runs-on: ubuntu-24.04 # latest
     strategy:
       fail-fast: false
       matrix:
@@ -31,14 +33,18 @@
           - rhel8-x64
           - al2-x64
     steps:
-        # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
+    # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
     - name: Build ${{ env.PACKAGE_NAME }}
       run: |
         aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
         ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
matrix.image }} build -p ${{ env.PACKAGE_NAME }}
 
   linux-compiler-compat:
-    runs-on: ubuntu-20.04 # latest
+    runs-on: ubuntu-24.04 # latest
     strategy:
       matrix:
         compiler:
@@ -48,42 +54,62 @@
           - clang-9
           - clang-10
           - clang-11
+          - clang-15
+          - clang-17
           - gcc-4.8
           - gcc-5
           - gcc-6
           - gcc-7
           - gcc-8
+          - gcc-11
+          - gcc-13
     steps:
-      # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
-      - name: Build ${{ env.PACKAGE_NAME }}
-        run: |
-          aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
-          ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ 
matrix.compiler }}
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
+    # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
+    - name: Build ${{ env.PACKAGE_NAME }}
+      run: |
+        aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
+        ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ 
matrix.compiler }}
 
   clang-sanitizers:
-    runs-on: ubuntu-20.04 # latest
+    runs-on: ubuntu-24.04 # latest
     strategy:
       matrix:
         sanitizers: [",thread", ",address,undefined"]
     steps:
-      # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
-      - name: Build ${{ env.PACKAGE_NAME }}
-        run: |
-          aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
-          ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=clang-11 
--cmake-extra=-DENABLE_SANITIZERS=ON --cmake-extra=-DSANITIZERS="${{ 
matrix.sanitizers }}"
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
+    # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
+    - name: Build ${{ env.PACKAGE_NAME }}
+      run: |
+        aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
+        ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=clang-11 
--cmake-extra=-DENABLE_SANITIZERS=ON --cmake-extra=-DSANITIZERS="${{ 
matrix.sanitizers }}"
 
   linux-shared-libs:
-    runs-on: ubuntu-20.04 # latest
+    runs-on: ubuntu-24.04 # latest
     steps:
-      # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
-      - name: Build ${{ env.PACKAGE_NAME }}
-        run: |
-          aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
-          ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} 
--cmake-extra=-DBUILD_SHARED_LIBS=ON
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
+    # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
+    - name: Build ${{ env.PACKAGE_NAME }}
+      run: |
+        aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
+        ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} 
--cmake-extra=-DBUILD_SHARED_LIBS=ON
 
   windows:
     runs-on: windows-2022 # latest
     steps:
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
     - name: Build ${{ env.PACKAGE_NAME }} + consumers
       run: |
         python -c "from urllib.request import urlretrieve; urlretrieve('${{ 
env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION 
}}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')"
@@ -95,6 +121,10 @@
       matrix:
         arch: [x86, x64]
     steps:
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
     - name: Build ${{ env.PACKAGE_NAME }} + consumers
       run: |
         python -c "from urllib.request import urlretrieve; urlretrieve('${{ 
env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION 
}}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')"
@@ -103,6 +133,10 @@
   windows-shared-libs:
     runs-on: windows-2022 # latest
     steps:
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
     - name: Build ${{ env.PACKAGE_NAME }} + consumers
       run: |
         python -c "from urllib.request import urlretrieve; urlretrieve('${{ 
env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION 
}}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')"
@@ -111,6 +145,10 @@
   windows-app-verifier:
     runs-on: windows-2022 # latest
     steps:
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
     - name: Build ${{ env.PACKAGE_NAME }} + consumers
       run: |
         python -c "from urllib.request import urlretrieve; urlretrieve('${{ 
env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION 
}}/builder.pyz?run=${{ env.RUN }}', 'builder.pyz')"
@@ -122,6 +160,10 @@
   macos:
     runs-on: macos-14 # latest
     steps:
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
     - name: Build ${{ env.PACKAGE_NAME }} + consumers
       run: |
         python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ 
env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION 
}}/builder.pyz', 'builder')"
@@ -131,6 +173,10 @@
   macos-x64:
     runs-on: macos-14-large # latest
     steps:
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
     - name: Build ${{ env.PACKAGE_NAME }} + consumers
       run: |
         python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ 
env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION 
}}/builder.pyz', 'builder')"
@@ -140,10 +186,14 @@
   # Test downstream repos.
   # This should not be required because we can run into a chicken and egg 
problem if there is a change that needs some fix in a downstream repo.
   downstream:
-    runs-on: ubuntu-20.04 # latest
+    runs-on: ubuntu-24.04 # latest
     steps:
-      # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
-      - name: Build ${{ env.PACKAGE_NAME }}
-        run: |
-          aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
-          ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
env.LINUX_BASE_IMAGE }} build downstream -p ${{ env.PACKAGE_NAME }}
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
+    # We can't use the `uses: docker://image` version yet, GitHub lacks 
authentication for actions -> packages
+    - name: Build ${{ env.PACKAGE_NAME }}
+      run: |
+        aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION 
}}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x 
./linux-container-ci.sh
+        ./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ 
env.LINUX_BASE_IMAGE }} build downstream -p ${{ env.PACKAGE_NAME }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aws-c-sdkutils-0.2.1/.github/workflows/codecov.yml 
new/aws-c-sdkutils-0.2.2/.github/workflows/codecov.yml
--- old/aws-c-sdkutils-0.2.1/.github/workflows/codecov.yml      2024-11-07 
21:45:25.000000000 +0100
+++ new/aws-c-sdkutils-0.2.2/.github/workflows/codecov.yml      2025-01-08 
20:36:20.000000000 +0100
@@ -4,22 +4,28 @@
   push:
 
 env:
-  BUILDER_VERSION: v0.9.55
+  BUILDER_VERSION: v0.9.72
   BUILDER_HOST: https://d19elf31gohf1l.cloudfront.net
   BUILDER_SOURCE: releases
   PACKAGE_NAME: aws-c-sdkutils
-  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
-  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
-  AWS_REGION: us-east-1
+  CRT_CI_ROLE: ${{ secrets.CRT_CI_ROLE_ARN }}
+  AWS_DEFAULT_REGION: us-east-1
+
+permissions:
+  id-token: write # This is required for requesting the JWT
 
 jobs:
   codecov-linux:
-    runs-on: ubuntu-22.04
+    runs-on: ubuntu-24.04
     steps:
-      - name: Checkout Sources
-        uses: actions/checkout@v3
-      - name: Build ${{ env.PACKAGE_NAME }} + consumers
-        run: |
-          python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ 
env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION 
}}/builder.pyz?run=${{ env.RUN }}', 'builder')"
-          chmod a+x builder
-          ./builder build -p ${{ env.PACKAGE_NAME }} --compiler=gcc-9 
--coverage
+    - uses: aws-actions/configure-aws-credentials@v4
+      with:
+        role-to-assume: ${{ env.CRT_CI_ROLE }}
+        aws-region: ${{ env.AWS_DEFAULT_REGION }}
+    - name: Checkout Sources
+      uses: actions/checkout@v4
+    - name: Build ${{ env.PACKAGE_NAME }} + consumers
+      run: |
+        python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ 
env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION 
}}/builder.pyz?run=${{ env.RUN }}', 'builder')"
+        chmod a+x builder
+        ./builder build -p ${{ env.PACKAGE_NAME }} --compiler=gcc-9 --coverage
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/aws-c-sdkutils-0.2.1/include/aws/sdkutils/aws_profile.h 
new/aws-c-sdkutils-0.2.2/include/aws/sdkutils/aws_profile.h
--- old/aws-c-sdkutils-0.2.1/include/aws/sdkutils/aws_profile.h 2024-11-07 
21:45:25.000000000 +0100
+++ new/aws-c-sdkutils-0.2.2/include/aws/sdkutils/aws_profile.h 2025-01-08 
20:36:20.000000000 +0100
@@ -43,6 +43,7 @@
 enum aws_profile_section_type {
     AWS_PROFILE_SECTION_TYPE_PROFILE,
     AWS_PROFILE_SECTION_TYPE_SSO_SESSION,
+    AWS_PROFILE_SECTION_TYPE_SERVICES,
 
     AWS_PROFILE_SECTION_TYPE_COUNT,
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aws-c-sdkutils-0.2.1/source/aws_profile.c 
new/aws-c-sdkutils-0.2.2/source/aws_profile.c
--- old/aws-c-sdkutils-0.2.1/source/aws_profile.c       2024-11-07 
21:45:25.000000000 +0100
+++ new/aws-c-sdkutils-0.2.2/source/aws_profile.c       2025-01-08 
20:36:20.000000000 +0100
@@ -612,6 +612,7 @@
 
 AWS_STATIC_STRING_FROM_LITERAL(s_profile_token, "profile");
 AWS_STATIC_STRING_FROM_LITERAL(s_sso_session_token, "sso-session");
+AWS_STATIC_STRING_FROM_LITERAL(s_services_token, "services");
 
 const struct aws_profile *aws_profile_collection_get_profile(
     const struct aws_profile_collection *profile_collection,
@@ -635,7 +636,7 @@
     struct aws_profile_collection *profile_collection,
     const enum aws_profile_section_type section_type,
     const struct aws_byte_cursor *profile_name,
-    bool has_prefix,
+    bool has_profile_prefix,
     const struct profile_file_parse_context *context,
     struct aws_profile **current_profile_out) {
 
@@ -660,7 +661,7 @@
         /*
          *  In a config file, "profile default" always supercedes "default"
          */
-        if (!has_prefix && existing_profile && 
existing_profile->has_profile_prefix) {
+        if (!has_profile_prefix && existing_profile && 
existing_profile->has_profile_prefix) {
             /*
              * existing one supercedes: ignore this (and its properties) 
completely by failing the add
              * which sets the current profile to NULL
@@ -673,7 +674,7 @@
             return AWS_OP_SUCCESS;
         }
 
-        if (has_prefix && existing_profile && 
!existing_profile->has_profile_prefix) {
+        if (has_profile_prefix && existing_profile && 
!existing_profile->has_profile_prefix) {
             /*
              * stomp over existing: remove it, then proceed with add
              * element destroy function will clean up the profile and key
@@ -692,7 +693,7 @@
         return AWS_OP_SUCCESS;
     }
 
-    struct aws_profile *new_profile = 
aws_profile_new(profile_collection->allocator, profile_name, has_prefix);
+    struct aws_profile *new_profile = 
aws_profile_new(profile_collection->allocator, profile_name, 
has_profile_prefix);
     if (new_profile == NULL) {
         goto on_aws_profile_new_failure;
     }
@@ -862,6 +863,37 @@
     return trimmed;
 }
 
+static int s_parse_section_type_prefix(
+    struct aws_byte_cursor *profile_cursor,
+    enum aws_profile_section_type *out_section_type) {
+    /* check profile prefix */
+    if (s_parse_by_token(profile_cursor, s_profile_token, NULL)) {
+        if (s_parse_by_character_predicate(profile_cursor, s_is_whitespace, 
NULL, 1)) {
+            *out_section_type = AWS_PROFILE_SECTION_TYPE_PROFILE;
+            return AWS_OP_SUCCESS;
+        }
+        return aws_raise_error(AWS_ERROR_SDKUTILS_PARSE_RECOVERABLE);
+    }
+
+    /* check sso-session prefix */
+    if (s_parse_by_token(profile_cursor, s_sso_session_token, NULL)) {
+        if (s_parse_by_character_predicate(profile_cursor, s_is_whitespace, 
NULL, 1)) {
+            *out_section_type = AWS_PROFILE_SECTION_TYPE_SSO_SESSION;
+            return AWS_OP_SUCCESS;
+        }
+        return aws_raise_error(AWS_ERROR_SDKUTILS_PARSE_RECOVERABLE);
+    }
+    /* check services prefix */
+    if (s_parse_by_token(profile_cursor, s_services_token, NULL)) {
+        if (s_parse_by_character_predicate(profile_cursor, s_is_whitespace, 
NULL, 1)) {
+            *out_section_type = AWS_PROFILE_SECTION_TYPE_SERVICES;
+            return AWS_OP_SUCCESS;
+        }
+        return aws_raise_error(AWS_ERROR_SDKUTILS_PARSE_RECOVERABLE);
+    }
+    return aws_raise_error(AWS_ERROR_SDKUTILS_PARSE_RECOVERABLE);
+}
+
 /**
  * Attempts to parse profile declaration lines
  *
@@ -895,21 +927,20 @@
     enum aws_profile_section_type section_type = 
AWS_PROFILE_SECTION_TYPE_PROFILE;
 
     /*
-     * Check if the profile name starts with the 'profile' keyword.  We need 
to check for
-     * "profile" and at least one whitespace character.  A partial match
+     * Check if the profile name starts with a valid prefix.  We need to check 
for
+     * prefix and at least one whitespace character.  A partial match like
      * ("[profilefoo]" for example) should rewind and use the whole name 
properly.
      */
     struct aws_byte_cursor backtrack_cursor = profile_cursor;
-    bool has_profile_prefix = s_parse_by_token(&profile_cursor, 
s_profile_token, NULL) &&
-                              s_parse_by_character_predicate(&profile_cursor, 
s_is_whitespace, NULL, 1);
-    bool has_sso_session_prefix = !has_profile_prefix && 
s_parse_by_token(&profile_cursor, s_sso_session_token, NULL) &&
-                                  
s_parse_by_character_predicate(&profile_cursor, s_is_whitespace, NULL, 1);
-
-    if (has_profile_prefix) {
+    bool has_valid_section_type_prefix = false;
+    if (s_parse_section_type_prefix(&profile_cursor, &section_type) != 
AWS_OP_SUCCESS) {
+        profile_cursor = backtrack_cursor;
+    } else {
+        has_valid_section_type_prefix = true;
         if (context->profile_collection->profile_source == 
AWS_PST_CREDENTIALS) {
             AWS_LOGF_WARN(
                 AWS_LS_SDKUTILS_PROFILE,
-                "Profile declarations in credentials files are not allowed to 
begin with the \"profile\" keyword");
+                "Profile declarations in credentials files are not allowed to 
begin with the section-type keyword");
             s_log_parse_context(AWS_LL_WARN, context);
 
             context->parse_error = AWS_ERROR_SDKUTILS_PARSE_RECOVERABLE;
@@ -917,20 +948,7 @@
         }
 
         s_parse_by_character_predicate(&profile_cursor, s_is_whitespace, NULL, 
0);
-    } else if (has_sso_session_prefix) {
-        if (context->profile_collection->profile_source == 
AWS_PST_CREDENTIALS) {
-            AWS_LOGF_WARN(AWS_LS_SDKUTILS_PROFILE, "sso-session declarations 
in credentials files are not allowed");
-            s_log_parse_context(AWS_LL_WARN, context);
-
-            context->parse_error = AWS_ERROR_SDKUTILS_PARSE_RECOVERABLE;
-            return true;
-        }
-        section_type = AWS_PROFILE_SECTION_TYPE_SSO_SESSION;
-        s_parse_by_character_predicate(&profile_cursor, s_is_whitespace, NULL, 
0);
-    } else {
-        profile_cursor = backtrack_cursor;
     }
-
     struct aws_byte_cursor profile_name;
     if (!s_parse_by_character_predicate(&profile_cursor, s_is_identifier, 
&profile_name, 0)) {
         AWS_LOGF_WARN(AWS_LS_SDKUTILS_PROFILE, "Profile declarations must 
contain a valid identifier for a name");
@@ -940,8 +958,8 @@
         return true;
     }
 
-    if (context->profile_collection->profile_source == AWS_PST_CONFIG && 
!has_profile_prefix &&
-        !s_is_default_profile_name(&profile_name) && !has_sso_session_prefix) {
+    if (context->profile_collection->profile_source == AWS_PST_CONFIG && 
!has_valid_section_type_prefix &&
+        !s_is_default_profile_name(&profile_name)) {
         AWS_LOGF_WARN(
             AWS_LS_SDKUTILS_PROFILE,
             "Non-default profile declarations in config files must use the 
\"profile\" keyword");
@@ -989,7 +1007,7 @@
             context->profile_collection,
             section_type,
             &profile_name,
-            has_profile_prefix,
+            has_valid_section_type_prefix && section_type == 
AWS_PROFILE_SECTION_TYPE_PROFILE,
             context,
             &context->current_profile)) {
         AWS_LOGF_ERROR(AWS_LS_SDKUTILS_PROFILE, "Failed to add profile to 
profile collection");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aws-c-sdkutils-0.2.1/tests/CMakeLists.txt 
new/aws-c-sdkutils-0.2.2/tests/CMakeLists.txt
--- old/aws-c-sdkutils-0.2.1/tests/CMakeLists.txt       2024-11-07 
21:45:25.000000000 +0100
+++ new/aws-c-sdkutils-0.2.2/tests/CMakeLists.txt       2025-01-08 
20:36:20.000000000 +0100
@@ -29,9 +29,10 @@
 add_test_case(aws_profile_empty_property_profile_test)
 add_test_case(aws_profile_multiple_empty_profile_test)
 add_test_case(aws_profile_multiple_profile_test)
-add_test_case(aws_profile_multiple_profile_with_sso_session_test)
-add_test_case(aws_profile_sso_session_in_credentials_test)
+add_test_case(aws_profile_multiple_sections)
+add_test_case(aws_profile_sections_in_credentials_test)
 add_test_case(aws_profile_sso_session_without_name_test)
+add_test_case(aws_profile_services_invalid_prefix_test)
 add_test_case(aws_profile_blank_lines_ignored_test)
 add_test_case(aws_profile_pound_comments_ignored_test)
 add_test_case(aws_profile_semicolon_comments_ignored_test)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aws-c-sdkutils-0.2.1/tests/aws_profile_tests.c 
new/aws-c-sdkutils-0.2.2/tests/aws_profile_tests.c
--- old/aws-c-sdkutils-0.2.1/tests/aws_profile_tests.c  2024-11-07 
21:45:25.000000000 +0100
+++ new/aws-c-sdkutils-0.2.2/tests/aws_profile_tests.c  2025-01-08 
20:36:20.000000000 +0100
@@ -9,54 +9,59 @@
 #include <aws/common/string.h>
 #include <aws/sdkutils/aws_profile.h>
 
-#define EXPECT_PROFILE_COUNT(profile_collection, profile_count)                
                                        \
-    { ASSERT_TRUE(aws_profile_collection_get_profile_count(profile_collection) 
== (profile_count)); }
+#define EXPECT_SECTION_COUNT(profile_collection, section_type, section_count)  
                                        \
+    { ASSERT_TRUE(aws_profile_collection_get_section_count(profile_collection, 
section_type) == (section_count)); }
 
-#define EXPECT_PROFILE(profile_collection, profile_name)                       
                                        \
+#define EXPECT_SECTION(profile_collection, section_type, section_name)         
                                        \
     {                                                                          
                                        \
-        struct aws_string *profile_name_str = 
aws_string_new_from_c_str(allocator, profile_name);                      \
-        const struct aws_profile *profile = 
aws_profile_collection_get_profile(profile_collection, profile_name_str);  \
-        aws_string_destroy(profile_name_str);                                  
                                        \
+        struct aws_string *section_name_str = 
aws_string_new_from_c_str(allocator, section_name);                      \
+        const struct aws_profile *profile =                                    
                                        \
+            aws_profile_collection_get_section(profile_collection, 
section_type, section_name_str);                    \
+        aws_string_destroy(section_name_str);                                  
                                        \
         ASSERT_TRUE(profile != NULL);                                          
                                        \
     }
 
-#define EXPECT_PROPERTY_COUNT(profile_collection, profile_name, 
expected_property_count)                               \
+#define EXPECT_PROPERTY_COUNT(profile_collection, section_type, section_name, 
expected_property_count)                 \
     {                                                                          
                                        \
-        struct aws_string *profile_name_str = 
aws_string_new_from_c_str(allocator, profile_name);                      \
-        const struct aws_profile *profile = 
aws_profile_collection_get_profile(profile_collection, profile_name_str);  \
-        aws_string_destroy(profile_name_str);                                  
                                        \
+        struct aws_string *section_name_str = 
aws_string_new_from_c_str(allocator, section_name);                      \
+        const struct aws_profile *profile =                                    
                                        \
+            aws_profile_collection_get_section(profile_collection, 
section_type, section_name_str);                    \
+        aws_string_destroy(section_name_str);                                  
                                        \
         ASSERT_TRUE(aws_profile_get_property_count(profile) == 
(expected_property_count));                             \
     }
-
-#define EXPECT_PROPERTY(profile_collection, profile_name, property_name, 
expected_property_value)                      \
+#define EXPECT_PROPERTY(profile_collection, section_type, section_name, 
property_name, expected_property_value)        \
     {                                                                          
                                        \
-        struct aws_string *profile_name_str = 
aws_string_new_from_c_str(allocator, profile_name);                      \
-        const struct aws_profile *profile = 
aws_profile_collection_get_profile(profile_collection, profile_name_str);  \
+        struct aws_string *section_name_str = 
aws_string_new_from_c_str(allocator, section_name);                      \
+        const struct aws_profile *profile =                                    
                                        \
+            aws_profile_collection_get_section(profile_collection, 
section_type, section_name_str);                    \
         struct aws_string *property_name_str = 
aws_string_new_from_c_str(allocator, property_name);                    \
         const struct aws_profile_property *property = 
aws_profile_get_property(profile, property_name_str);            \
         aws_string_destroy(property_name_str);                                 
                                        \
-        aws_string_destroy(profile_name_str);                                  
                                        \
+        aws_string_destroy(section_name_str);                                  
                                        \
         ASSERT_TRUE(                                                           
                                        \
             property != NULL &&                                                
                                        \
             strcmp(expected_property_value, 
aws_string_c_str(aws_profile_property_get_value(property))) == 0);         \
     }
 
-#define EXPECT_SUB_PROPERTY_COUNT(profile_collection, profile_name, 
property_name, expected_sub_property_count)        \
+#define EXPECT_SUB_PROPERTY_COUNT(                                             
                                        \
+    profile_collection, section_type, section_name, property_name, 
expected_sub_property_count)                        \
     {                                                                          
                                        \
-        struct aws_string *profile_name_str = 
aws_string_new_from_c_str(allocator, profile_name);                      \
-        const struct aws_profile *profile = 
aws_profile_collection_get_profile(profile_collection, profile_name_str);  \
+        struct aws_string *section_name_str = 
aws_string_new_from_c_str(allocator, section_name);                      \
+        const struct aws_profile *profile =                                    
                                        \
+            aws_profile_collection_get_section(profile_collection, 
section_type, section_name_str);                    \
         struct aws_string *property_name_str = 
aws_string_new_from_c_str(allocator, property_name);                    \
         const struct aws_profile_property *property = 
aws_profile_get_property(profile, property_name_str);            \
         aws_string_destroy(property_name_str);                                 
                                        \
-        aws_string_destroy(profile_name_str);                                  
                                        \
+        aws_string_destroy(section_name_str);                                  
                                        \
         ASSERT_UINT_EQUALS((expected_sub_property_count), 
aws_profile_property_get_sub_property_count(property));      \
     }
 
 #define EXPECT_SUB_PROPERTY(                                                   
                                        \
-    profile_collection, profile_name, property_name, sub_property_name, 
expected_sub_property_value)                   \
+    profile_collection, section_type, profile_name, property_name, 
sub_property_name, expected_sub_property_value)     \
     {                                                                          
                                        \
         struct aws_string *profile_name_str = 
aws_string_new_from_c_str(allocator, profile_name);                      \
-        const struct aws_profile *profile = 
aws_profile_collection_get_profile(profile_collection, profile_name_str);  \
+        const struct aws_profile *profile =                                    
                                        \
+            aws_profile_collection_get_section(profile_collection, 
section_type, profile_name_str);                    \
         struct aws_string *property_name_str = 
aws_string_new_from_c_str(allocator, property_name);                    \
         const struct aws_profile_property *property = 
aws_profile_get_property(profile, property_name_str);            \
         struct aws_string *sub_property_name_str = 
aws_string_new_from_c_str(allocator, sub_property_name);            \
@@ -68,74 +73,6 @@
         ASSERT_TRUE(strcmp(expected_sub_property_value, 
aws_string_c_str(sub_property_value)) == 0);                   \
     }
 
-#define EXPECT_SSO_SESSION_COUNT(profile_collection, sso_session_count)        
                                        \
-    {                                                                          
                                        \
-        ASSERT_TRUE(                                                           
                                        \
-            aws_profile_collection_get_section_count(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION) ==      \
-            (sso_session_count));                                              
                                        \
-    }
-
-#define EXPECT_SSO_SESSION(profile_collection, sso_session_name)               
                                        \
-    {                                                                          
                                        \
-        struct aws_string *sso_session_name_str = 
aws_string_new_from_c_str(allocator, sso_session_name);              \
-        const struct aws_profile *sso_session = 
aws_profile_collection_get_section(                                    \
-            profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
sso_session_name_str);                           \
-        aws_string_destroy(sso_session_name_str);                              
                                        \
-        ASSERT_TRUE(sso_session != NULL);                                      
                                        \
-    }
-#define EXPECT_SSO_SESSION_PROPERTY_COUNT(profile_collection, 
sso_session_name, expected_sso_session_count)            \
-    {                                                                          
                                        \
-        struct aws_string *sso_session_name_str = 
aws_string_new_from_c_str(allocator, sso_session_name);              \
-        const struct aws_profile *sso_session = 
aws_profile_collection_get_section(                                    \
-            profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
sso_session_name_str);                           \
-        aws_string_destroy(sso_session_name_str);                              
                                        \
-        ASSERT_TRUE(aws_profile_get_property_count(sso_session) == 
(expected_sso_session_count));                      \
-    }
-
-#define EXPECT_SSO_SESSION_PROPERTY(profile_collection, sso_session_name, 
property_name, expected_property_value)      \
-    {                                                                          
                                        \
-        struct aws_string *sso_session_name_str = 
aws_string_new_from_c_str(allocator, sso_session_name);              \
-        const struct aws_profile *sso_session = 
aws_profile_collection_get_section(                                    \
-            profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
sso_session_name_str);                           \
-        struct aws_string *property_name_str = 
aws_string_new_from_c_str(allocator, property_name);                    \
-        const struct aws_profile_property *property = 
aws_profile_get_property(sso_session, property_name_str);        \
-        aws_string_destroy(property_name_str);                                 
                                        \
-        aws_string_destroy(sso_session_name_str);                              
                                        \
-        ASSERT_TRUE(                                                           
                                        \
-            property != NULL &&                                                
                                        \
-            strcmp(expected_property_value, 
aws_string_c_str(aws_profile_property_get_value(property))) == 0);         \
-    }
-
-#define EXPECT_SSO_SESSION_SUB_PROPERTY_COUNT(                                 
                                        \
-    profile_collection, sso_session_name, property_name, 
expected_sub_property_count)                                  \
-    {                                                                          
                                        \
-        struct aws_string *sso_session_name_str = 
aws_string_new_from_c_str(allocator, sso_session_name);              \
-        const struct aws_profile *sso_session = 
aws_profile_collection_get_section(                                    \
-            profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
sso_session_name_str);                           \
-        struct aws_string *property_name_str = 
aws_string_new_from_c_str(allocator, property_name);                    \
-        const struct aws_profile_property *property = 
aws_profile_get_property(sso_session, property_name_str);        \
-        aws_string_destroy(property_name_str);                                 
                                        \
-        aws_string_destroy(sso_session_name_str);                              
                                        \
-        ASSERT_UINT_EQUALS((expected_sub_property_count), 
aws_profile_property_get_sub_property_count(property));      \
-    }
-
-#define EXPECT_SSO_SESSION_SUB_PROPERTY(                                       
                                        \
-    profile_collection, sso_session_name, property_name, sub_property_name, 
expected_sub_property_value)               \
-    {                                                                          
                                        \
-        struct aws_string *sso_session_name_str = 
aws_string_new_from_c_str(allocator, sso_session_name);              \
-        const struct aws_profile *sso_session = 
aws_profile_collection_get_section(                                    \
-            profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
sso_session_name_str);                           \
-        struct aws_string *property_name_str = 
aws_string_new_from_c_str(allocator, property_name);                    \
-        const struct aws_profile_property *property = 
aws_profile_get_property(sso_session, property_name_str);        \
-        struct aws_string *sub_property_name_str = 
aws_string_new_from_c_str(allocator, sub_property_name);            \
-        const struct aws_string *sub_property_value =                          
                                        \
-            aws_profile_property_get_sub_property(property, 
sub_property_name_str);                                    \
-        aws_string_destroy(sub_property_name_str);                             
                                        \
-        aws_string_destroy(property_name_str);                                 
                                        \
-        aws_string_destroy(sso_session_name_str);                              
                                        \
-        ASSERT_TRUE(strcmp(expected_sub_property_value, 
aws_string_c_str(sub_property_value)) == 0);                   \
-    }
-
 /*
  * profile collection setup
  */
@@ -206,7 +143,7 @@
         aws_prepare_profile_test(allocator, s_empty_string, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -227,9 +164,9 @@
         aws_prepare_profile_test(allocator, s_empty_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -250,9 +187,9 @@
         aws_prepare_profile_test(allocator, s_whitespace_empty_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -273,9 +210,9 @@
         aws_prepare_profile_test(allocator, s_tab_empty_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -296,10 +233,10 @@
         aws_prepare_profile_test(allocator, s_single_simple_property_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -320,10 +257,10 @@
         aws_prepare_profile_test(allocator, 
s_equal_containing_property_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "val=ue");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "val=ue");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -344,10 +281,10 @@
         aws_prepare_profile_test(allocator, 
s_unicode_containing_property_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "\xF0\x9F\x98\x82");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "\xF0\x9F\x98\x82");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -370,11 +307,11 @@
         aws_prepare_profile_test(allocator, s_multiple_property_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 2);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
-    EXPECT_PROPERTY(profile_collection, "foo", "name2", "value2");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name2", "value2");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -395,10 +332,10 @@
         aws_prepare_profile_test(allocator, s_trimmable_property_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -419,10 +356,10 @@
         aws_prepare_profile_test(allocator, s_empty_property_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -443,11 +380,11 @@
         aws_prepare_profile_test(allocator, s_multiple_empty_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 2);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 0);
-    EXPECT_PROFILE(profile_collection, "bar");
-    EXPECT_PROPERTY_COUNT(profile_collection, "bar", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
2);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 0);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"bar");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "bar", 0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -468,13 +405,13 @@
         aws_prepare_profile_test(allocator, s_multiple_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 2);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
-    EXPECT_PROFILE(profile_collection, "bar");
-    EXPECT_PROPERTY_COUNT(profile_collection, "bar", 1);
-    EXPECT_PROPERTY(profile_collection, "bar", "name2", "value2");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
2);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"bar");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "bar", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"bar", "name2", "value2");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -488,65 +425,77 @@
  */
 AWS_STATIC_STRING_FROM_LITERAL(
     s_credentials_sso_session,
-    "[profile foo]\nname = value\n[profile bar]\nname2 = value2\n[sso-session 
session]\nname3 = value3\ns3 =\n name4 = "
-    "value4");
+    "[profile foo]\nname = value\n[profile bar]\nname2 = value2\nservices = 
test-service\n"
+    "[sso-session session]\nname3 = value3\ns3 =\n name4 = value4\n"
+    "[services test-service]\nname4 = value4\ns3 =\n name5 = value5\n");
 
-static int s_aws_profile_multiple_profile_with_sso_session_test(struct 
aws_allocator *allocator, void *ctx) {
+static int s_aws_profile_multiple_sections(struct aws_allocator *allocator, 
void *ctx) {
     (void)ctx;
 
     struct aws_profile_collection *profile_collection =
         aws_prepare_profile_test(allocator, s_credentials_sso_session, 
AWS_PST_CONFIG);
 
     ASSERT_NOT_NULL(profile_collection);
-    EXPECT_PROFILE_COUNT(profile_collection, 2);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
-    EXPECT_PROFILE(profile_collection, "bar");
-    EXPECT_PROPERTY_COUNT(profile_collection, "bar", 1);
-    EXPECT_PROPERTY(profile_collection, "bar", "name2", "value2");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
2);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"bar");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "bar", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"bar", "name2", "value2");
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"bar", "services", "test-service");
+
+    EXPECT_SECTION_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
"session");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, "session", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
"session", "name3", "value3");
+    EXPECT_SUB_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, "session", "s3", 1);
+    EXPECT_SUB_PROPERTY(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, "session", "s3", "name4", "value4");
+
+    EXPECT_SECTION_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SERVICES, 1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_SERVICES, 
"test-service");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SERVICES, "test-service", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SERVICES, 
"test-service", "name4", "value4");
+    EXPECT_SUB_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SERVICES, "test-service", "s3", 1);
+    EXPECT_SUB_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SERVICES, 
"test-service", "s3", "name5", "value5");
 
-    EXPECT_SSO_SESSION_COUNT(profile_collection, 1);
-    EXPECT_SSO_SESSION(profile_collection, "session");
-    EXPECT_SSO_SESSION_PROPERTY_COUNT(profile_collection, "session", 2);
-    EXPECT_SSO_SESSION_PROPERTY(profile_collection, "session", "name3", 
"value3");
-    EXPECT_SSO_SESSION_SUB_PROPERTY_COUNT(profile_collection, "session", "s3", 
1);
-    EXPECT_SSO_SESSION_SUB_PROPERTY(profile_collection, "session", "s3", 
"name4", "value4");
     aws_profile_collection_destroy(profile_collection);
 
     return 0;
 }
 
-AWS_TEST_CASE(aws_profile_multiple_profile_with_sso_session_test, 
s_aws_profile_multiple_profile_with_sso_session_test);
+AWS_TEST_CASE(aws_profile_multiple_sections, s_aws_profile_multiple_sections);
 
 /*
- * SSO-Session in credentials file is ignored
+ * sections in credentials file are ignored
  */
 AWS_STATIC_STRING_FROM_LITERAL(
     s_sso_session_in_credentials,
-    "[foo]\nname = value\n[sso-session session]\nname3 = value3");
+    "[profile foo]\nname = value\n"
+    "[sso-session session]\nname2 = value2\n"
+    "[services test-service]\nname3 = value3\n");
 
-static int s_aws_profile_sso_session_in_credentials_test(struct aws_allocator 
*allocator, void *ctx) {
+static int s_aws_profile_sections_in_credentials_test(struct aws_allocator 
*allocator, void *ctx) {
     (void)ctx;
 
     struct aws_profile_collection *profile_collection =
         aws_prepare_profile_test(allocator, s_sso_session_in_credentials, 
AWS_PST_CREDENTIALS);
 
     ASSERT_NOT_NULL(profile_collection);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_SSO_SESSION_COUNT(profile_collection, 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
0);
+    EXPECT_SECTION_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 0);
+    EXPECT_SECTION_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SERVICES, 0);
     aws_profile_collection_destroy(profile_collection);
 
     return 0;
 }
 
-AWS_TEST_CASE(aws_profile_sso_session_in_credentials_test, 
s_aws_profile_sso_session_in_credentials_test);
+AWS_TEST_CASE(aws_profile_sections_in_credentials_test, 
s_aws_profile_sections_in_credentials_test);
 
 /*
  * sso-session without name is ignored
  */
 AWS_STATIC_STRING_FROM_LITERAL(s_sso_session_without_name, "[sso-session 
session]\nname = value\n[sso-session ]");
-//"[profile foo]\nname = value\n[sso-session session]\nname3 = value3");
 static int s_aws_profile_sso_session_without_name_test(struct aws_allocator 
*allocator, void *ctx) {
     (void)ctx;
 
@@ -554,11 +503,12 @@
         aws_prepare_profile_test(allocator, s_sso_session_without_name, 
AWS_PST_CONFIG);
 
     ASSERT_NOT_NULL(profile_collection);
-    EXPECT_PROFILE_COUNT(profile_collection, 0);
-    EXPECT_SSO_SESSION_COUNT(profile_collection, 1);
-    EXPECT_SSO_SESSION(profile_collection, "session");
-    EXPECT_SSO_SESSION_PROPERTY_COUNT(profile_collection, "session", 1);
-    EXPECT_SSO_SESSION_PROPERTY(profile_collection, "session", "name", 
"value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
0);
+    EXPECT_SECTION_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
"session");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, "session", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
"session", "name", "value");
+
     aws_profile_collection_destroy(profile_collection);
 
     return 0;
@@ -567,6 +517,33 @@
 AWS_TEST_CASE(aws_profile_sso_session_without_name_test, 
s_aws_profile_sso_session_without_name_test);
 
 /*
+ * services without name is ignored
+ */
+AWS_STATIC_STRING_FROM_LITERAL(
+    s_services_with_invali_prefix,
+    "[services test-service]\nname = value\n"
+    "[services ]\n"
+    "[profilesso-sessionservices test]\nname = value\n"
+    "[services\rtest-service]\nname = value\n");
+static int s_aws_profile_services_invalid_prefix_test(struct aws_allocator 
*allocator, void *ctx) {
+    (void)ctx;
+
+    struct aws_profile_collection *profile_collection =
+        aws_prepare_profile_test(allocator, s_services_with_invali_prefix, 
AWS_PST_CONFIG);
+
+    ASSERT_NOT_NULL(profile_collection);
+    EXPECT_SECTION_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SERVICES, 1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_SERVICES, 
"test-service");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SERVICES, "test-service", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SERVICES, 
"test-service", "name", "value");
+
+    aws_profile_collection_destroy(profile_collection);
+
+    return 0;
+}
+
+AWS_TEST_CASE(aws_profile_services_invalid_prefix_test, 
s_aws_profile_services_invalid_prefix_test);
+/*
  * Blank lines are ignored
  */
 AWS_STATIC_STRING_FROM_LITERAL(
@@ -580,12 +557,12 @@
         aws_prepare_profile_test(allocator, s_blank_lines_ignored_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 2);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
-    EXPECT_PROFILE(profile_collection, "bar");
-    EXPECT_PROPERTY_COUNT(profile_collection, "bar", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
2);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"bar");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "bar", 0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -608,10 +585,10 @@
         aws_prepare_profile_test(allocator, s_pound_comments_ignored_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -634,10 +611,10 @@
         aws_prepare_profile_test(allocator, 
s_semicolon_comments_ignored_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -660,10 +637,10 @@
         aws_prepare_profile_test(allocator, s_mixed_comments_ignored_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -684,10 +661,10 @@
         aws_prepare_profile_test(allocator, s_empty_comments_ignored_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -710,11 +687,11 @@
         aws_prepare_profile_test(allocator, 
s_profile_adjacent_comment_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 2);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 0);
-    EXPECT_PROFILE(profile_collection, "bar");
-    EXPECT_PROPERTY_COUNT(profile_collection, "bar", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
2);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 0);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"bar");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "bar", 0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -737,11 +714,12 @@
         aws_prepare_profile_test(allocator, s_value_adjacent_comment_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 2);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value; Adjacent 
semicolons");
-    EXPECT_PROPERTY(profile_collection, "foo", "name2", "value# Adjacent pound 
signs");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value; Adjacent semicolons");
+    EXPECT_PROPERTY(
+        profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", "name2", 
"value# Adjacent pound signs");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -762,10 +740,10 @@
         aws_prepare_profile_test(allocator, 
s_continued_property_value_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value\n-continued");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value\n-continued");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -788,10 +766,11 @@
         aws_prepare_profile_test(allocator, 
s_multiline_continued_property_value_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", 
"value\n-continued\n-and-continued");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(
+        profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", "name", 
"value\n-continued\n-and-continued");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -816,10 +795,10 @@
         aws_prepare_profile_test(allocator, 
s_continued_property_value_trim_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value\n-continued");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value\n-continued");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -842,10 +821,10 @@
         aws_prepare_profile_test(allocator, 
s_continued_property_value_pound_comment_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value\n-continued # 
Comment");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value\n-continued # Comment");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -870,10 +849,10 @@
         aws_prepare_profile_test(allocator, 
s_continued_property_value_semicolon_comment_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value\n-continued ; 
Comment");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value\n-continued ; Comment");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -885,12 +864,13 @@
     s_aws_profile_continued_property_value_semicolon_comment_test);
 
 /*
- * duplicate profiles and sso-session merge properties
+ * duplicate profiles, sso-session, services merge properties
  */
 AWS_STATIC_STRING_FROM_LITERAL(
     s_duplicate_profiles_merge_profile,
-    "[profile foo]\nname = value\n[profile foo]\nname2 = value2\n[sso-session 
foo]\nname3 = value-3\n[sso-session "
-    "foo]\nname3 = value3\nname4 = value4");
+    "[profile foo]\nname = value\n[profile foo]\nname2 = value2\n"
+    "[sso-session foo]\nname3 = value-3\n[sso-session foo]\nname3 = 
value3\nname4 = value4\n"
+    "[services test-service]\nname5 = value-5\n[services test-service]\nname5 
= value5\nname6 = value6\n");
 
 static int s_aws_profile_duplicate_profiles_merge_test(struct aws_allocator 
*allocator, void *ctx) {
     (void)ctx;
@@ -899,17 +879,23 @@
         aws_prepare_profile_test(allocator, 
s_duplicate_profiles_merge_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 2);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
-    EXPECT_PROPERTY(profile_collection, "foo", "name2", "value2");
-
-    EXPECT_SSO_SESSION_COUNT(profile_collection, 1);
-    EXPECT_SSO_SESSION(profile_collection, "foo");
-    EXPECT_SSO_SESSION_PROPERTY_COUNT(profile_collection, "foo", 2);
-    EXPECT_SSO_SESSION_PROPERTY(profile_collection, "foo", "name3", "value3");
-    EXPECT_SSO_SESSION_PROPERTY(profile_collection, "foo", "name4", "value4");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name2", "value2");
+
+    EXPECT_SECTION_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SSO_SESSION, "foo", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
"foo", "name3", "value3");
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SSO_SESSION, 
"foo", "name4", "value4");
+
+    EXPECT_SECTION_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SERVICES, 1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_SERVICES, 
"test-service");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_SERVICES, "test-service", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SERVICES, 
"test-service", "name5", "value5");
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_SERVICES, 
"test-service", "name6", "value6");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -932,10 +918,10 @@
         aws_prepare_profile_test(allocator, 
s_duplicate_properties_last_property_value_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value2");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value2");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -960,10 +946,10 @@
         aws_prepare_profile_test(allocator, 
s_duplicate_profiles_last_property_value_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value2");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value2");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -990,10 +976,10 @@
         aws_prepare_profile_test(allocator, 
s_duplicate_default_profiles_property_resolution1_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "default");
-    EXPECT_PROPERTY_COUNT(profile_collection, "default", 1);
-    EXPECT_PROPERTY(profile_collection, "default", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"default");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "default", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"default", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1020,10 +1006,10 @@
         aws_prepare_profile_test(allocator, 
s_duplicate_default_profiles_property_resolution2_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "default");
-    EXPECT_PROPERTY_COUNT(profile_collection, "default", 1);
-    EXPECT_PROPERTY(profile_collection, "default", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"default");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "default", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"default", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1047,7 +1033,7 @@
         allocator, s_invalid_profile_names_config_profile, 
s_invalid_profile_names_credentials_profile);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1068,9 +1054,9 @@
         aws_prepare_profile_test(allocator, 
s_invalid_property_names_ignored_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1093,9 +1079,16 @@
         aws_prepare_profile_test(allocator, 
s_all_valid_profile_characters_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
-    EXPECT_PROPERTY_COUNT(profile_collection, 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(
+        profile_collection,
+        AWS_PROFILE_SECTION_TYPE_PROFILE,
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
+    EXPECT_PROPERTY_COUNT(
+        profile_collection,
+        AWS_PROFILE_SECTION_TYPE_PROFILE,
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",
+        0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1118,11 +1111,15 @@
         aws_prepare_profile_test(allocator, 
s_all_valid_property_characters_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
     EXPECT_PROPERTY(
-        profile_collection, "foo", 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", "value");
+        profile_collection,
+        AWS_PROFILE_SECTION_TYPE_PROFILE,
+        "foo",
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",
+        "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1143,12 +1140,12 @@
         aws_prepare_profile_test(allocator, s_basic_sub_property_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "s3", "\nname = value");
-    EXPECT_SUB_PROPERTY_COUNT(profile_collection, "foo", "s3", 1);
-    EXPECT_SUB_PROPERTY(profile_collection, "foo", "s3", "name", "value");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "s3", "\nname = value");
+    EXPECT_SUB_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", "s3", 1);
+    EXPECT_SUB_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "s3", "name", "value");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1170,12 +1167,12 @@
         aws_prepare_profile_test(allocator, s_empty_sub_property_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "s3", "\nname =");
-    EXPECT_SUB_PROPERTY_COUNT(profile_collection, "foo", "s3", 1);
-    EXPECT_SUB_PROPERTY(profile_collection, "foo", "s3", "name", "");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "s3", "\nname =");
+    EXPECT_SUB_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", "s3", 1);
+    EXPECT_SUB_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "s3", "name", "");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1197,11 +1194,11 @@
         aws_prepare_profile_test(allocator, 
s_invalid_sub_property_name_profile, AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "s3", "\nin valid = value");
-    EXPECT_SUB_PROPERTY_COUNT(profile_collection, "foo", "s3", 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "s3", "\nin valid = value");
+    EXPECT_SUB_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", "s3", 0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1225,13 +1222,14 @@
         aws_prepare_profile_test(allocator, s_sub_property_blank_line_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "s3", "\nname = value\nname2 = 
value2");
-    EXPECT_SUB_PROPERTY_COUNT(profile_collection, "foo", "s3", 2);
-    EXPECT_SUB_PROPERTY(profile_collection, "foo", "s3", "name", "value");
-    EXPECT_SUB_PROPERTY(profile_collection, "foo", "s3", "name2", "value2");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(
+        profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", "s3", 
"\nname = value\nname2 = value2");
+    EXPECT_SUB_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", "s3", 2);
+    EXPECT_SUB_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "s3", "name", "value");
+    EXPECT_SUB_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "s3", "name2", "value2");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1253,11 +1251,11 @@
         allocator, s_basic_duplicate_config_profile, 
s_basic_duplicate_credentials_profile);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 2);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value");
-    EXPECT_PROPERTY(profile_collection, "foo", "name2", "value2");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value");
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name2", "value2");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1281,11 +1279,11 @@
         aws_prepare_profile_test(allocator, s_mixed_prefix_default_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "default");
-    EXPECT_PROPERTY_COUNT(profile_collection, "default", 2);
-    EXPECT_PROPERTY(profile_collection, "default", "name", "value");
-    EXPECT_PROPERTY(profile_collection, "default", "name3", "value3");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"default");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "default", 2);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"default", "name", "value");
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"default", "name3", "value3");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1308,10 +1306,10 @@
         allocator, s_override_duplicate_config_profile, 
s_override_duplicate_credentials_profile);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 1);
-    EXPECT_PROFILE(profile_collection, "foo");
-    EXPECT_PROPERTY_COUNT(profile_collection, "foo", 1);
-    EXPECT_PROPERTY(profile_collection, "foo", "name", "value2");
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
1);
+    EXPECT_SECTION(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo");
+    EXPECT_PROPERTY_COUNT(profile_collection, 
AWS_PROFILE_SECTION_TYPE_PROFILE, "foo", 1);
+    EXPECT_PROPERTY(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
"foo", "name", "value2");
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1333,7 +1331,7 @@
         aws_prepare_profile_test(allocator, s_no_prefix_nondefault_profile, 
AWS_PST_CONFIG);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
0);
 
     aws_profile_collection_destroy(profile_collection);
 
@@ -1355,7 +1353,7 @@
         aws_prepare_profile_test(allocator, s_prefix_credentials_profile, 
AWS_PST_CREDENTIALS);
 
     ASSERT_TRUE(profile_collection != NULL);
-    EXPECT_PROFILE_COUNT(profile_collection, 0);
+    EXPECT_SECTION_COUNT(profile_collection, AWS_PROFILE_SECTION_TYPE_PROFILE, 
0);
 
     aws_profile_collection_destroy(profile_collection);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/aws-c-sdkutils-0.2.1/tests/endpoints_regex_tests.c 
new/aws-c-sdkutils-0.2.2/tests/endpoints_regex_tests.c
--- old/aws-c-sdkutils-0.2.1/tests/endpoints_regex_tests.c      2024-11-07 
21:45:25.000000000 +0100
+++ new/aws-c-sdkutils-0.2.2/tests/endpoints_regex_tests.c      2025-01-08 
20:36:20.000000000 +0100
@@ -44,11 +44,11 @@
     (void)ctx;
 
     struct aws_endpoints_regex *regex =
-        aws_endpoints_regex_new(allocator, 
aws_byte_cursor_from_c_str("^us\\-isob\\-\\w+\\-\\d+$"));
+        aws_endpoints_regex_new(allocator, 
aws_byte_cursor_from_c_str("^eu\\-isoe\\-\\w+\\-\\d+$"));
 
     ASSERT_NOT_NULL(regex);
 
-    ASSERT_SUCCESS(aws_endpoints_regex_match(regex, 
aws_byte_cursor_from_c_str("us-isob-east-1")));
+    ASSERT_SUCCESS(aws_endpoints_regex_match(regex, 
aws_byte_cursor_from_c_str("eu-isoe-west-1")));
 
     ASSERT_ERROR(
         AWS_ERROR_SDKUTILS_ENDPOINTS_REGEX_NO_MATCH,

Reply via email to