- block:
    - name: Set up test yum repo
      yum_repository:
        name: multiarch-test-repo
        description: ansible-test multiarch test repo
        baseurl: "{{ multiarch_repo_baseurl }}"
        gpgcheck: no
        repo_gpgcheck: no

    - name: Install two out of date packages from the repo
      yum:
        name:
          - multiarch-a-1.0
          - multiarch-b-1.0
      register: outdated

    - name: See what we installed
      command: rpm -q multiarch-a multiarch-b
      register: rpm_q

    # Here we assume we're running on x86_64 (and limit to this in main.yml)
    # (avoid comparing ansible_architecture because we only have test RPMs
    # for i686 and x86_64 and ansible_architecture could be other things.)
    - name: Assert that we got the right architecture
      assert:
        that:
          - outdated is changed
          - outdated.changes.installed | length == 2
          - rpm_q.stdout_lines | length == 2
          - rpm_q.stdout_lines[0].endswith('x86_64')
          - rpm_q.stdout_lines[1].endswith('x86_64')

    - name: Install the same versions, but i686 instead
      yum:
        name:
          - multiarch-a-1.0*.i686
          - multiarch-b-1.0*.i686
      register: outdated_i686

    - name: See what we installed
      command: rpm -q multiarch-a multiarch-b
      register: rpm_q

    - name: Assert that all four are installed
      assert:
        that:
          - outdated_i686 is changed
          - outdated.changes.installed | length == 2
          - rpm_q.stdout_lines | length == 4

    - name: Update them all to 2.0
      yum:
        name: multiarch-*
        state: latest
        update_only: true
      register: yum_latest

    - name: Assert that all were updated and shown in results
      assert:
        that:
          - yum_latest is changed
          # This is just testing UI stability. The behavior is arguably not
          # correct, because multiple packages are being updated. But the
          # "because of (at least)..." wording kinda locks us in to only
          # showing one update in this case. :(
          - yum_latest.changes.updated | length == 1

    - name: Downgrade them so we can upgrade them a different way
      yum:
        name:
          - multiarch-a-1.0*
          - multiarch-b-1.0*
        allow_downgrade: true
      register: downgrade

    - name: See what we installed
      command: rpm -q multiarch-a multiarch-b --queryformat '%{name}-%{version}.%{arch}\n'
      register: rpm_q

    - name: Ensure downgrade worked
      assert:
        that:
          - downgrade is changed
          - rpm_q.stdout_lines | sort == ['multiarch-a-1.0.i686', 'multiarch-a-1.0.x86_64', 'multiarch-b-1.0.i686', 'multiarch-b-1.0.x86_64']

    # This triggers a different branch of logic that the partial wildcard
    # above, but we're limited to check_mode here since it's '*'.
    - name: Upgrade with full wildcard
      yum:
        name: '*'
        state: latest
        update_only: true
        update_cache: true
      check_mode: true
      register: full_wildcard

    # https://github.com/ansible/ansible/issues/73284
    - name: Ensure we report things correctly (both arches)
      assert:
        that:
          - full_wildcard is changed
          - full_wildcard.changes.updated | filter_list_of_tuples_by_first_param('multiarch', startswith=True) | length == 4

    - name: Downgrade them so we can upgrade them a different way
      yum:
        name:
          - multiarch-a-1.0*
          - multiarch-b-1.0*
        allow_downgrade: true
      register: downgrade

    - name: Try to install again via virtual provides, should be unchanged
      yum:
        name:
          - virtual-provides-multiarch-a
          - virtual-provides-multiarch-b
        state: present
      register: install_vp

    - name: Ensure the above did not change
      assert:
        that:
          - install_vp is not changed

    - name: Try to upgrade via virtual provides
      yum:
        name:
          - virtual-provides-multiarch-a
          - virtual-provides-multiarch-b
        state: latest
        update_only: true
      register: upgrade_vp

    - name: Ensure we report things correctly (both arches)
      assert:
        that:
          - upgrade_vp is changed
          # This is just testing UI stability, like above.
          # We'll only have one package in "updated" per spec, even though
          # (in this case) two are getting updated per spec.
          - upgrade_vp.changes.updated | length == 2

  always:
    - name: Remove test yum repo
      yum_repository:
        name: multiarch-test-repo
        state: absent

    - name: Remove all test packages installed
      yum:
        name:
          - multiarch-*
          - virtual-provides-multiarch-*
        state: absent
