Add Android to the OS list (#45834)

Resolves #45711

- [X] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.

## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually.

<img width="1216" height="527" alt="Screenshot 2026-05-19 at 5 30 48 PM"
src="https://github.com/user-attachments/assets/05a0a93f-3b5b-4ba9-80c5-b0a91b9de1f3"
/>
<img width="1216" height="527" alt="Screenshot 2026-05-19 at 5 30 37 PM"
src="https://github.com/user-attachments/assets/3e23e88e-6a95-46f6-a68f-12fb98f1aefe"
/>
<img width="1216" height="527" alt="Screenshot 2026-05-19 at 5 29 45 PM"
src="https://github.com/user-attachments/assets/417ca981-0781-4df5-811b-dafaabbd61a9"
/>
<img width="1216" height="527" alt="Screenshot 2026-05-19 at 5 29 30 PM"
src="https://github.com/user-attachments/assets/cf13985d-5cb3-414a-9135-5cf4c5ee0dd1"
/>
<img width="1216" height="527" alt="Screenshot 2026-05-19 at 5 31 33 PM"
src="https://github.com/user-attachments/assets/8500e7b2-cc7b-425d-b6b7-bbbf128faac4"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Fixed host listing so filtering by Android OS name and version returns
matching hosts.

* **New Features**
* Android hosts are now included in the operating systems aggregation
and UI, with a dedicated Android icon.
* Android OS version information is captured during device enrollment
and on status reports.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/45834?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Lucas Manuel Rodriguez
2026-05-20 10:43:10 -03:00
committed by GitHub
parent 4d34119531
commit b4e907801f
8 changed files with 203 additions and 19 deletions
+1
View File
@@ -0,0 +1 @@
- Fixed the `GET /api/v1/fleet/hosts` endpoint so that filtering Android hosts by `os_name=Android` and `os_version=<version>` returns the matching hosts. Android hosts now populate the `operating_systems` table on enrollment and on every status report, and also appear in the `GET /api/v1/fleet/os_versions` aggregation and OS list in the UI with the Android logo.
@@ -82,6 +82,11 @@ const PLATFORM_FILTER_OPTIONS = [
label: "iPadOS",
value: "ipados",
},
{
disabled: false,
label: "Android",
value: "android",
},
];
const SoftwareOSTable = ({
@@ -0,0 +1,18 @@
import React from "react";
import type { SVGProps } from "react";
const AndroidOS = (props: SVGProps<SVGSVGElement>) => (
<svg fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
<path fill="#F9FAFC" d="M0 0h32v32H0z" />
<g transform="translate(4, 4) scale(0.667)">
<path
fillRule="evenodd"
clipRule="evenodd"
d="M36.2229 27.609C36.2264 27.6311 36.2299 27.6532 36.2334 27.6755L36.2308 27.6771C36.2708 27.9395 36.3052 28.2038 36.334 28.4697H0.333984C0.362614 28.2048 0.397264 27.9406 0.437906 27.6773L0.441441 27.6544C0.451523 27.589 0.461687 27.5231 0.472641 27.4579C0.547458 27.0082 0.638975 26.5615 0.747 26.1186C1.09124 24.714 1.60318 23.356 2.2718 22.0737C2.65903 21.3295 3.09792 20.6134 3.58523 19.9305C4.47919 18.6776 5.52815 17.5429 6.70711 16.5534C7.3662 16.0006 8.06372 15.4953 8.79441 15.0413C8.79303 15.0386 8.7914 15.0359 8.78975 15.0332C8.7882 15.0307 8.78663 15.0281 8.78527 15.0255C8.60378 14.7119 8.42216 14.3985 8.24054 14.0851C8.05879 13.7715 7.87703 13.4578 7.69542 13.144C7.59975 12.979 7.50411 12.814 7.40846 12.649C7.14896 12.2014 6.88945 11.7538 6.62948 11.3061C6.37513 10.8658 6.12018 10.4259 5.86462 9.98624C5.8043 9.88189 5.75719 9.77389 5.72077 9.66336C5.59985 9.28573 5.61806 8.8773 5.77209 8.51192C5.80163 8.44077 5.83692 8.37144 5.87644 8.30478C6.01706 8.06962 6.21412 7.87324 6.44977 7.73342C6.66437 7.60538 6.90529 7.52786 7.1543 7.50674C7.4671 7.47933 7.78122 7.54172 8.0598 7.68659C8.33838 7.83146 8.56986 8.05279 8.72705 8.32461C8.98116 8.76435 9.23625 9.20492 9.49191 9.64452L10.5573 11.4825C10.747 11.8104 10.9371 12.138 11.1271 12.4657C11.3007 12.7651 11.4744 13.0645 11.6478 13.364C11.6703 13.4037 11.6933 13.4433 11.7164 13.4829C11.7306 13.5074 11.7449 13.5318 11.7589 13.5563C11.9646 13.4752 12.1718 13.3982 12.3805 13.3254C14.1903 12.6954 16.1302 12.3442 18.1492 12.3241C18.2118 12.3233 18.2732 12.3233 18.3354 12.3233C20.6062 12.3233 22.7786 12.7409 24.7811 13.5045C24.8326 13.5241 24.8836 13.5446 24.9351 13.5652L24.9459 13.5695C24.9738 13.5204 25.0021 13.4718 25.0302 13.4233C25.0419 13.4033 25.0535 13.3832 25.0651 13.3632C25.2549 13.0353 25.4449 12.7077 25.6349 12.38C25.8086 12.0806 25.9823 11.7812 26.1557 11.4816L27.2211 9.64382L27.238 9.61462C27.4869 9.18471 27.7363 8.75391 27.9858 8.32391C28.1165 8.09796 28.299 7.90625 28.5183 7.76452C28.7375 7.62278 28.9872 7.53506 29.2469 7.50857C29.3506 7.49806 29.455 7.49722 29.5588 7.50603C29.8074 7.52787 30.0478 7.60524 30.2625 7.73244C30.5665 7.91219 30.8043 8.18522 30.9407 8.51094C31.0404 8.74712 31.0838 9.00322 31.0677 9.25905C31.0515 9.51489 30.9762 9.76348 30.8476 9.98525C30.5937 10.4248 30.3386 10.8656 30.0829 11.3052L29.0175 13.1428C28.8348 13.4587 28.6517 13.7742 28.4687 14.0898C28.288 14.4013 28.1074 14.7128 27.927 15.0244C27.9235 15.0302 27.9203 15.0361 27.9171 15.0421C27.9139 15.048 27.9108 15.0539 27.9073 15.0596C29.0636 15.781 30.135 16.6304 31.1013 17.5915C32.4247 18.9062 33.5371 20.4175 34.399 22.0718C35.2795 23.7602 35.8867 25.5775 36.1981 27.4561C36.2067 27.507 36.2147 27.5578 36.2229 27.609ZM27.9322 21.0133C28.5237 21.9021 28.4189 23.0116 27.6987 23.4911C26.9788 23.9706 25.9154 23.6388 25.3243 22.7497C24.7329 21.8609 24.8378 20.7513 25.5581 20.2718C26.2781 19.7924 27.3412 20.1241 27.9322 21.0133ZM11.1423 20.275C11.8626 20.7546 11.9675 21.8639 11.376 22.7528C10.785 23.6419 9.72172 23.9737 9.00144 23.4942C8.28144 23.0147 8.17667 21.9053 8.76772 21.0161C9.35919 20.1274 10.4219 19.7955 11.1423 20.275Z"
fill="#515774"
/>
</g>
</svg>
);
export default AndroidOS;
@@ -40,6 +40,7 @@ import Airtame from "./Airtame";
import AmazonChime from "./AmazonChime";
import AmazonDCV from "./AmazonDCV";
import AndroidApp from "./AndroidApp";
import AndroidOS from "./AndroidOS";
import AndroidPlayStore from "./AndroidPlayStore";
import AndroidStudio from "./AndroidStudio";
import Anka from "./Anka";
@@ -543,6 +544,7 @@ export const PLATFORM_NAME_TO_ICON_MAP = {
chrome: ChromeOS,
ios: iOS,
ipados: iPadOS,
android: AndroidOS,
} as const;
// SOFTWARE_SOURCE_TO_ICON_MAP maps different software sources to a defined
@@ -12,6 +12,7 @@ export const OS_VERSIONS_API_SUPPORTED_PLATFORMS = [
"chrome",
"ios",
"ipados",
"android",
];
export interface IGetOSVersionsQueryParams {
@@ -219,6 +219,9 @@ func InitCommonDSMocks() *AndroidMockDS {
ds.Store.CreatePendingCertificateTemplatesForNewHostFunc = func(ctx context.Context, hostUUID string, teamID uint) (int64, error) {
return 0, nil
}
ds.Store.UpdateHostOperatingSystemFunc = func(ctx context.Context, hostID uint, hostOS fleet.OperatingSystem) error {
return nil
}
return &ds
}
+32
View File
@@ -497,6 +497,13 @@ func (svc *Service) updateHost(ctx context.Context, device *androidmanagement.De
return ctxerr.Wrap(ctx, err, "enrolling Android host")
}
// Populate the operating_systems table so the host can be filtered via
// `GET /api/v1/fleet/hosts?os_name=Android&os_version=<version>` and show
// up in the /os_versions aggregation alongside other platforms.
if err := svc.updateHostOperatingSystem(ctx, host.Host.ID, device); err != nil {
return err
}
if fromEnroll {
// Delete any existing certificate template records for this host. The device has
// lost all certificates on re-enrollment (work profile removed and re-installed, or
@@ -533,6 +540,24 @@ func (svc *Service) updateHost(ctx context.Context, device *androidmanagement.De
return nil
}
// updateHostOperatingSystem upserts the host's OS into the operating_systems
// and host_operating_system tables. Without this, Android hosts cannot be
// filtered via the os_name/os_version host list parameters and do not appear
// in the /os_versions aggregation.
func (svc *Service) updateHostOperatingSystem(ctx context.Context, hostID uint, device *androidmanagement.Device) error {
if device.SoftwareInfo == nil || device.SoftwareInfo.AndroidVersion == "" {
return nil
}
if err := svc.fleetDS.UpdateHostOperatingSystem(ctx, hostID, fleet.OperatingSystem{
Name: "Android",
Version: device.SoftwareInfo.AndroidVersion,
Platform: "android",
}); err != nil {
return ctxerr.Wrap(ctx, err, "update Android host operating system")
}
return nil
}
func getAndroidHostKey(device *androidmanagement.Device) string {
if device.HardwareInfo.EnterpriseSpecificId != "" {
return device.HardwareInfo.EnterpriseSpecificId
@@ -620,6 +645,13 @@ func (svc *Service) addNewHost(ctx context.Context, device *androidmanagement.De
return ctxerr.Wrap(ctx, err, "enrolling Android host")
}
// Populate the operating_systems table so the host can be filtered via
// `GET /api/v1/fleet/hosts?os_name=Android&os_version=<version>` and show
// up in the /os_versions aggregation alongside other platforms.
if err := svc.updateHostOperatingSystem(ctx, fleetHost.Host.ID, device); err != nil {
return err
}
if enrollmentTokenRequest.IdpUUID != "" {
svc.logger.InfoContext(ctx, "associating android host with idp account", "host_uuid", host.UUID, "idp_uuid", enrollmentTokenRequest.IdpUUID)
err := svc.ds.AssociateHostMDMIdPAccount(ctx, host.UUID, enrollmentTokenRequest.IdpUUID)
+141 -19
View File
@@ -19,14 +19,13 @@ import (
"github.com/fleetdm/fleet/v4/server/mdm/android"
android_mock "github.com/fleetdm/fleet/v4/server/mdm/android/mock"
common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql"
"github.com/fleetdm/fleet/v4/server/ptr"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
"google.golang.org/api/androidmanagement/v1"
)
// sha256 of "TestBrand:test-serial". Will need to be updated if our test enrollment message changes
const testBrandTestSerialHashed = "9c311e05af14f958bd65188796e41fcc8a7b0ff913bfea4f11f31c96c6f052b0"
var testBrandTestSerialHashed = "9c311e05af14f958bd65188796e41fcc8a7b0ff913bfea4f11f31c96c6f052b0"
func createAndroidService(t *testing.T) (android.Service, *AndroidMockDS) {
androidAPIClient := android_mock.Client{}
@@ -257,6 +256,58 @@ func TestPubSubEnrollment(t *testing.T) {
require.Equal(t, expectedHostID, capturedScimHostID)
})
t.Run("populates operating_systems with Android name and version on enrollment", func(t *testing.T) {
// Regression test for https://github.com/fleetdm/fleet/issues/45711.
// Without this, filtering hosts with `os_name=Android&os_version=<v>`
// returns nothing because the operating_systems table is empty for
// Android hosts.
mockDS.AppConfigFunc = func(ctx context.Context) (*fleet.AppConfig, error) {
return &fleet.AppConfig{
MDM: fleet.MDM{AndroidEnabledAndConfigured: true},
}, nil
}
expectedHostID := uint(99)
mockDS.NewAndroidHostFunc = func(ctx context.Context, host *fleet.AndroidHost, companyOwned bool) (*fleet.AndroidHost, error) {
return &fleet.AndroidHost{Host: &fleet.Host{ID: expectedHostID}}, nil
}
var capturedHostID uint
var capturedOS fleet.OperatingSystem
mockDS.UpdateHostOperatingSystemFunc = func(ctx context.Context, hostID uint, hostOS fleet.OperatingSystem) error {
capturedHostID = hostID
capturedOS = hostOS
return nil
}
enrollmentToken := enrollmentTokenRequest{EnrollSecret: "global"}
enrollTokenData, err := json.Marshal(enrollmentToken)
require.NoError(t, err)
deviceInfo := androidmanagement.Device{
Name: createAndroidDeviceId("test-android-os"),
EnrollmentTokenData: string(enrollTokenData),
}
enrollmentMessage := createEnrollmentMessage(t, deviceInfo)
// createEnrollmentMessage sets AndroidVersion="1"; override to a more
// realistic version so we verify it's passed through unchanged.
data, err := base64.StdEncoding.DecodeString(enrollmentMessage.Data)
require.NoError(t, err)
var decoded androidmanagement.Device
require.NoError(t, json.Unmarshal(data, &decoded))
decoded.SoftwareInfo.AndroidVersion = "16"
reEncoded, err := json.Marshal(decoded)
require.NoError(t, err)
enrollmentMessage.Data = base64.StdEncoding.EncodeToString(reEncoded)
err = svc.ProcessPubSubPush(t.Context(), "value", enrollmentMessage)
require.NoError(t, err)
require.True(t, mockDS.UpdateHostOperatingSystemFuncInvoked)
require.Equal(t, expectedHostID, capturedHostID)
require.Equal(t, "Android", capturedOS.Name)
require.Equal(t, "16", capturedOS.Version)
require.Equal(t, "android", capturedOS.Platform)
})
t.Run("creates device as company-owned if specified in enrollment message", func(t *testing.T) {
mockDS.AppConfigFunc = func(ctx context.Context) (*fleet.AppConfig, error) {
return &fleet.AppConfig{
@@ -321,7 +372,7 @@ func TestStatusReportPolicyValidation(t *testing.T) {
}
t.Run("single install pending profile with empty compliance details", func(t *testing.T) {
policyVersion := ptr.Int(1)
policyVersion := new(1)
installPendingProfile := &fleet.MDMAndroidProfilePayload{
ProfileUUID: uuid.NewString(),
@@ -364,7 +415,7 @@ func TestStatusReportPolicyValidation(t *testing.T) {
})
t.Run("compliance details has failure", func(t *testing.T) {
policyVersion := ptr.Int(1)
policyVersion := new(1)
policyRequestUUID := uuid.NewString()
installPendingProfile1 := &fleet.MDMAndroidProfilePayload{
@@ -461,7 +512,7 @@ func TestStatusReportPolicyValidation(t *testing.T) {
})
t.Run("profile failed due to non-compliance but is reverified", func(t *testing.T) {
policyVersion := ptr.Int(1)
policyVersion := new(1)
policyRequestUUID := uuid.NewString()
installPendingProfile1 := &fleet.MDMAndroidProfilePayload{
@@ -582,7 +633,7 @@ func TestStatusReportPolicyValidation(t *testing.T) {
func TestUpdateHostEmptyUUIDGetsPopulated(t *testing.T) {
svc, mockDS := createAndroidService(t)
const enterpriseSpecificID = "SHOULD-BE-THIS-UUID"
enterpriseSpecificID := "SHOULD-BE-THIS-UUID"
const deviceName = "test-empty-uuid-bug"
// Mock AppConfig
@@ -605,7 +656,7 @@ func TestUpdateHostEmptyUUIDGetsPopulated(t *testing.T) {
Device: &android.Device{
HostID: 200,
DeviceID: "buggy-device",
EnterpriseSpecificID: ptr.String(enterpriseSpecificID),
EnterpriseSpecificID: &enterpriseSpecificID,
},
}
existingHostWithEmptyUUID.SetNodeKey(enterpriseSpecificID)
@@ -672,9 +723,80 @@ func TestUpdateHostEmptyUUIDGetsPopulated(t *testing.T) {
"Host UUID is properly populated from device.EnterpriseSpecificId")
}
// TestStatusReportPopulatesOperatingSystem is a regression test for
// https://github.com/fleetdm/fleet/issues/45711. Status reports for existing
// Android hosts must populate the operating_systems table so the hosts can be
// filtered via GET /api/v1/fleet/hosts?os_name=Android&os_version=<v>.
func TestStatusReportPopulatesOperatingSystem(t *testing.T) {
svc, mockDS := createAndroidService(t)
const enterpriseSpecificID = "ESI-OS-TEST"
mockDS.AppConfigFunc = func(ctx context.Context) (*fleet.AppConfig, error) {
return &fleet.AppConfig{
MDM: fleet.MDM{AndroidEnabledAndConfigured: true},
}, nil
}
expectedHostID := uint(321)
mockDS.AndroidHostLiteFunc = func(ctx context.Context, esID string) (*fleet.AndroidHost, error) {
return &fleet.AndroidHost{
Host: &fleet.Host{
ID: expectedHostID,
UUID: enterpriseSpecificID,
},
Device: &android.Device{
HostID: expectedHostID,
DeviceID: "device",
EnterpriseSpecificID: new(enterpriseSpecificID),
},
}, nil
}
mockDS.UpdateAndroidHostFunc = func(ctx context.Context, host *fleet.AndroidHost, fromEnroll, companyOwned bool) error {
return nil
}
var capturedHostID uint
var capturedOS fleet.OperatingSystem
mockDS.UpdateHostOperatingSystemFunc = func(ctx context.Context, hostID uint, hostOS fleet.OperatingSystem) error {
capturedHostID = hostID
capturedOS = hostOS
return nil
}
device := androidmanagement.Device{
Name: createAndroidDeviceId("test-android-status-os"),
HardwareInfo: &androidmanagement.HardwareInfo{
EnterpriseSpecificId: enterpriseSpecificID,
Brand: "Google",
Model: "Pixel 8a",
},
SoftwareInfo: &androidmanagement.SoftwareInfo{
AndroidVersion: "16",
},
MemoryInfo: &androidmanagement.MemoryInfo{
TotalRam: int64(8 * 1024 * 1024 * 1024),
},
LastStatusReportTime: "2024-01-01T12:00:00Z",
}
deviceBytes, err := json.Marshal(device)
require.NoError(t, err)
message := &android.PubSubMessage{
Attributes: map[string]string{"notificationType": string(android.PubSubStatusReport)},
Data: base64.StdEncoding.EncodeToString(deviceBytes),
}
err = svc.ProcessPubSubPush(t.Context(), "value", message)
require.NoError(t, err)
require.True(t, mockDS.UpdateHostOperatingSystemFuncInvoked)
require.Equal(t, expectedHostID, capturedHostID)
require.Equal(t, "Android", capturedOS.Name)
require.Equal(t, "16", capturedOS.Version)
require.Equal(t, "android", capturedOS.Platform)
}
func TestHostPayloadUUIDForFrontend(t *testing.T) {
svc, mockDS := createAndroidService(t)
const enterpriseSpecificID = "ANDROID-DEVICE-UUID-123"
enterpriseSpecificID := "ANDROID-DEVICE-UUID-123"
const deviceName = "test-frontend-payload"
// Mock AppConfig
@@ -721,7 +843,7 @@ func TestHostPayloadUUIDForFrontend(t *testing.T) {
Device: &android.Device{
HostID: 100,
DeviceID: "test-device",
EnterpriseSpecificID: ptr.String(enterpriseSpecificID),
EnterpriseSpecificID: &enterpriseSpecificID,
},
}, nil
}
@@ -775,7 +897,7 @@ func TestHostPayloadUUIDForFrontend(t *testing.T) {
func TestUpdateHost(t *testing.T) {
svc, mockDS := createAndroidService(t)
const enterpriseSpecificID = "TEST-UUID-12345"
enterpriseSpecificID := "TEST-UUID-12345"
const deviceName = "test-update-host"
// Mock AppConfig
@@ -798,7 +920,7 @@ func TestUpdateHost(t *testing.T) {
Device: &android.Device{
HostID: 1,
DeviceID: "old-device-id",
EnterpriseSpecificID: ptr.String(enterpriseSpecificID),
EnterpriseSpecificID: &enterpriseSpecificID,
},
}
existingHost.SetNodeKey(enterpriseSpecificID)
@@ -942,7 +1064,7 @@ func TestUpdateHost(t *testing.T) {
Device: &android.Device{
HostID: 2,
DeviceID: "device-2",
EnterpriseSpecificID: ptr.String(testBrandTestSerialHashed),
EnterpriseSpecificID: &testBrandTestSerialHashed,
},
}, nil
}
@@ -1393,7 +1515,7 @@ func TestStatusReportAppInstallVerification(t *testing.T) {
mockDS.BulkSetVPPInstallsAsFailedFuncInvoked = false
})
policyVersion := ptr.Int(1)
policyVersion := new(1)
mockDS.ListHostMDMAndroidVPPAppsPendingInstallWithVersionFunc = func(ctx context.Context, hostUUID string, version int64) ([]*fleet.HostAndroidVPPSoftwareInstall, error) {
return nil, nil
@@ -1440,7 +1562,7 @@ func TestStatusReportAppInstallVerification(t *testing.T) {
return nil
}
policyVersion := ptr.Int(1)
policyVersion := new(1)
enrollmentMessage := createStatusReportMessage(t, androidDevice.UUID, "test", createAndroidDeviceId("test"), policyVersion, nil)
err := svc.ProcessPubSubPush(context.Background(), "value", &enrollmentMessage)
require.NoError(t, err)
@@ -1478,7 +1600,7 @@ func TestStatusReportAppInstallVerification(t *testing.T) {
return nil
}
policyVersion := ptr.Int(2)
policyVersion := new(2)
enrollmentMessage := createStatusAppReportMessage(t, androidDevice.UUID, "test", createAndroidDeviceId("test"), policyVersion, []*androidmanagement.ApplicationReport{
{PackageName: pendingApp.AdamID, State: "INSTALLED"},
}, nil)
@@ -1518,7 +1640,7 @@ func TestStatusReportAppInstallVerification(t *testing.T) {
return nil
}
policyVersion := ptr.Int(2)
policyVersion := new(2)
enrollmentMessage := createStatusAppReportMessage(t, androidDevice.UUID, "test", createAndroidDeviceId("test"), policyVersion, []*androidmanagement.ApplicationReport{
{PackageName: pendingApp.AdamID, State: "INSTALLED"},
}, []*androidmanagement.NonComplianceDetail{
@@ -1560,7 +1682,7 @@ func TestStatusReportAppInstallVerification(t *testing.T) {
return nil
}
policyVersion := ptr.Int(2)
policyVersion := new(2)
enrollmentMessage := createStatusAppReportMessage(t, androidDevice.UUID, "test", createAndroidDeviceId("test"), policyVersion, []*androidmanagement.ApplicationReport{
{PackageName: pendingApp.AdamID, State: "APPLICATION_STATE_UNSPECIFIED"},
}, []*androidmanagement.NonComplianceDetail{
@@ -1602,7 +1724,7 @@ func TestStatusReportAppInstallVerification(t *testing.T) {
return nil
}
policyVersion := ptr.Int(2)
policyVersion := new(2)
enrollmentMessage := createStatusAppReportMessage(t, androidDevice.UUID, "test", createAndroidDeviceId("test"), policyVersion, nil, []*androidmanagement.NonComplianceDetail{
{PackageName: pendingApp.AdamID, NonComplianceReason: "PENDING", InstallationFailureReason: "IN_PROGRESS"},
})
@@ -1683,7 +1805,7 @@ func TestStatusReportAppInstallVerification(t *testing.T) {
return &fleet.User{}, &fleet.ActivityInstalledAppStoreApp{CommandUUID: cmdUUID, Status: string(status)}, nil
}
policyVersion := ptr.Int(2)
policyVersion := new(2)
// app1 and app2 verified, app3 not reported at all so failed, app4 failed with compliance report
enrollmentMessage := createStatusAppReportMessage(t, androidDevice.UUID, "test", createAndroidDeviceId("test"), policyVersion, []*androidmanagement.ApplicationReport{
{PackageName: pendingApps[0].AdamID, State: "INSTALLED"},