{
  "servicePath": "",
  "mtlsRootUrl": "https://devicerun.mtls.googleapis.com/",
  "schemas": {
    "CatalogAndroidxTestOrchestratorDetails": {
      "description": "AndroidX Test Orchestrator-specific attributes. Reserved for future orchestrator-only fields.",
      "id": "CatalogAndroidxTestOrchestratorDetails",
      "properties": {},
      "type": "object"
    },
    "AllocationConfig": {
      "description": "Allocation config.",
      "properties": {
        "deviceConfigs": {
          "description": "Required. At least one device config is required. If more than one device config is required, the multiple devices are allocated to each shard of the OmniLab job to run multi-device-interaction tests.",
          "type": "array",
          "items": {
            "$ref": "DeviceConfig"
          }
        }
      },
      "id": "AllocationConfig",
      "type": "object"
    },
    "AndroidPushFilesDeviceActionFileConfig": {
      "type": "object",
      "properties": {
        "destinationPath": {
          "description": "Required. The destination path on the device.",
          "type": "string"
        },
        "sourceFile": {
          "$ref": "InputFile",
          "description": "Required. The file to be pushed to the device."
        }
      },
      "id": "AndroidPushFilesDeviceActionFileConfig",
      "description": "The configuration of pushing a file to the device."
    },
    "RetrySettingsFlakyTestRetryStrategy": {
      "properties": {
        "testReductionMode": {
          "type": "string",
          "enum": [
            "TEST_REDUCTION_MODE_UNSPECIFIED",
            "NO_REDUCTION",
            "REDUCE_TO_FAILED_TEST_CASES"
          ],
          "description": "Optional. The mode of test reduction for retry. If the test runner doesn't support the specified test reduction mode, the request will be rejected with an `INVALID_ARGUMENT` error.",
          "enumDescriptions": [
            "The test reduction mode is unspecified. Will default to `NO_REDUCTION`.",
            "Runs the same set of test cases of the previous attempt.",
            "Only runs the failed test cases of the previous attempt. For Android Instrumentation tests, this reduction mode only works when the tests in the test APK use one of the following test runners: - `androidx.test.ext.junit.runners.AndroidJUnit4` - `org.junit.runners.JUnit4` - `com.google.testing.junit.testparameterinjector.TestParameterInjector` - `org.junit.runners.Parameterized` Otherwise, its behavior will fall back to `NO_REDUCTION`."
          ]
        },
        "flakyTestAttempts": {
          "format": "int32",
          "type": "integer",
          "description": "Required. The total attempts for flaky tests, including the initial run. Default value: 1 (no retry). Range: [1, 5]."
        },
        "parallelRetry": {
          "description": "Optional. Whether to retry the test failures in parallel. By default, the test is retried sequentially. If true, when the initial attempt fails, (flaky_test_attempts - 1) attempts will be triggered at the same time to run in parallel.",
          "type": "boolean"
        }
      },
      "id": "RetrySettingsFlakyTestRetryStrategy",
      "type": "object",
      "description": "Default retry strategy. It will retry on test failures for up to flaky_test_attempts (including the initial run). It also retries on infra issues for up to 2 attempts (including the initial run). So in total, an execution can run up to flaky_test_attempts * 2 times in the worst case."
    },
    "GoogleLongrunningCancelOperationRequest": {
      "type": "object",
      "properties": {},
      "description": "The request message for Operations.CancelOperation.",
      "id": "GoogleLongrunningCancelOperationRequest"
    },
    "AndroidPullFilesDeviceAction": {
      "description": "Pulls directories and files from the device at the end of the run. Files will be copied to the '/artifacts' directory, with the absolute path structure preserved. Note that: 1. A clean device is provided for the run. 2. Any existing files in the output directory may be overwritten. 3. Pulling files is best effort. Will skip files if they don't exist on the device.",
      "properties": {
        "paths": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Required. Absolute directory or file paths to pull from the device. Limits: - A maximum of 10 paths are allowed."
        }
      },
      "type": "object",
      "id": "AndroidPullFilesDeviceAction"
    },
    "CatalogSoftwareVersion": {
      "properties": {
        "lifecycle": {
          "description": "Output only. The version lifecycle (maturity stage and removal date).",
          "$ref": "CatalogLifecycle",
          "readOnly": true
        },
        "isDefault": {
          "description": "Output only. Indicates whether the system uses this version when a request does not select one explicitly. Exactly one version per `software_type` is the default, and it may change over time.",
          "type": "boolean",
          "readOnly": true
        },
        "androidxTestOrchestratorDetails": {
          "readOnly": true,
          "description": "Output only. Contains AndroidX Test Orchestrator-specific attributes (set when software_type == ANDROIDX_TEST_ORCHESTRATOR).",
          "$ref": "CatalogAndroidxTestOrchestratorDetails"
        },
        "version": {
          "readOnly": true,
          "type": "string",
          "description": "Output only. Specifies the version identifier, e.g. \"1.4.1\". Unique within a `software_type`."
        },
        "name": {
          "description": "Identifier. Identifies the software version resource. Format: `projects/{project}/locations/{location}/softwareVersions/{software_version}`. The {software_version} segment is an opaque, stable string. Clients must not parse it to derive or assume the version.",
          "type": "string"
        },
        "xcodeDetails": {
          "readOnly": true,
          "$ref": "CatalogXcodeDetails",
          "description": "Output only. Contains Xcode-specific attributes (set when software_type == XCODE)."
        },
        "softwareType": {
          "enumDescriptions": [
            "Software type not specified.",
            "AndroidX Test Orchestrator, which runs each Android instrumentation test case in its own process.",
            "Apple Xcode, the toolchain that builds and runs iOS XCTests."
          ],
          "readOnly": true,
          "type": "string",
          "description": "Output only. Specifies which software this is a version of. Filter on this field to narrow the collection to a single kind of software, for example `software_type = \"ANDROIDX_TEST_ORCHESTRATOR\"`.",
          "enum": [
            "SOFTWARE_TYPE_UNSPECIFIED",
            "ANDROIDX_TEST_ORCHESTRATOR",
            "XCODE"
          ]
        },
        "displayName": {
          "type": "string",
          "description": "Output only. Provides a human-readable name for this version, e.g. \"AndroidX Test Orchestrator 1.4.1\".",
          "readOnly": true
        }
      },
      "type": "object",
      "description": "A single software version in the catalog.",
      "id": "CatalogSoftwareVersion"
    },
    "CatalogAutomationSupport": {
      "properties": {},
      "id": "CatalogAutomationSupport",
      "description": "Per-product metadata for the Automation (DeviceRun) product.",
      "type": "object"
    },
    "SessionConfigSessionNotificationConfig": {
      "properties": {
        "pubsubTopic": {
          "description": "Optional. The Pub/Sub topics to which session events are published. Format: `projects/{project}/topics/{topic}`. See https://cloud.google.com/pubsub/docs/admin#topic_and_subscription_name_restrictions",
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      },
      "description": "Config to control session notification.",
      "id": "SessionConfigSessionNotificationConfig",
      "type": "object"
    },
    "AndroidPushFilesDeviceAction": {
      "description": "Pushes files to the device at the beginning of the run. Files are overwritten if a file with the same path already exists on the device, if device permissions allow.",
      "properties": {
        "fileConfigs": {
          "type": "array",
          "items": {
            "$ref": "AndroidPushFilesDeviceActionFileConfig"
          },
          "description": "Required. Configs of pushing files to the device. Limits: - A maximum of 50 files are allowed."
        }
      },
      "type": "object",
      "id": "AndroidPushFilesDeviceAction"
    },
    "AndroidInstallable": {
      "properties": {
        "files": {
          "items": {
            "$ref": "InputFile"
          },
          "type": "array",
          "description": "Required. Files that make up the package. Supported formats are distinguished by their file extension: - APK: One or more files with extension `.apk`. - App Bundle: A single file with extension `.aab`. - APK Set: A single file with extension `.apks`."
        }
      },
      "description": "An Android Installable represents the file(s) for installing an Android package on a device. This can be an APK, an Android App Bundle (AAB), or an APK Set.",
      "type": "object",
      "id": "AndroidInstallable"
    },
    "RetrySettings": {
      "type": "object",
      "properties": {
        "flakyTestRetryStrategy": {
          "$ref": "RetrySettingsFlakyTestRetryStrategy",
          "description": "Optional. The default retry strategy. Allows an Execution to retry on test failures and infrastructure errors."
        }
      },
      "description": "Retry settings.",
      "id": "RetrySettings"
    },
    "SessionConfigSessionOutputFileDirectoryConfig": {
      "properties": {
        "gcsOutputDirectory": {
          "description": "The Google Cloud Storage path of the output directory (e.g. `gs://my-bucket/output`). The bucket must exist. If the bucket is located in another project or uses fine-grained access controls, ensure the Device Run Service Agent of the project (`service-@gcp-sa-devicerun.iam.gserviceaccount.com`) is granted access to the bucket (such as `roles/storage.objectUser`).",
          "$ref": "GcsPath"
        },
        "flatDirectoryStructure": {
          "description": "Optional. Whether to write output files directly under the output directory instead of nesting them under service-generated subdirectories. By default (`false`), output files are stored under `////`. When `true`, the session ID subdirectory is never appended, and the job display name subdirectory is appended only when the session has more than one job. Output files are therefore stored under: - `//` for a single-job session. - `///` for a multi-job session. Set this to `true` when the output directory is already unique per session (for example, when a CI system generates it), to avoid redundant nesting.",
          "type": "boolean"
        }
      },
      "id": "SessionConfigSessionOutputFileDirectoryConfig",
      "type": "object",
      "description": "Config to control session output file directory."
    },
    "CatalogListDevicesResponse": {
      "description": "Response including listed devices.",
      "id": "CatalogListDevicesResponse",
      "properties": {
        "nextPageToken": {
          "description": "Token to receive the next page of devices. This will be absent if the end of the response list has been reached.",
          "type": "string"
        },
        "devices": {
          "type": "array",
          "items": {
            "$ref": "CatalogDevice"
          },
          "description": "The list of devices."
        }
      },
      "type": "object"
    },
    "JobConfig": {
      "description": "The configuration of a job.",
      "properties": {
        "settings": {
          "description": "Optional. Job settings.",
          "$ref": "JobSettings"
        },
        "action": {
          "$ref": "JobAction",
          "description": "Required. Job action."
        },
        "allocationConfig": {
          "description": "Required. Allocation config.",
          "$ref": "AllocationConfig"
        },
        "labels": {
          "description": "Optional. User-defined metadata for tracking or categorization. These labels do not affect job execution and are surfaced in the JobReport. Limits: - Maximum number of entries: 16. - Maximum key size: 32 bytes (UTF-8). - Maximum value size: 1024 bytes (UTF-8).",
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        "displayName": {
          "type": "string",
          "description": "Optional. User-settable, human-readable name for the job. If set, it must be unique within the session. If not set, the display name will default to `job-`, where `` is the 0-based index of the job in the session formatted as three digits (e.g., job-000, job-001, ...). Maximum size is 63 bytes when encoded as UTF-8. If set, must match regex: `^A-Za-z0-9*$`."
        }
      },
      "id": "JobConfig",
      "type": "object"
    },
    "AndroidBugreportDeviceAction": {
      "properties": {
        "collectOnPass": {
          "type": "boolean",
          "description": "Optional. Whether to deliver the bugreport when the test passes. If false, the bugreport is skipped on pass to save time (default behavior). If true, the bugreport is always delivered."
        }
      },
      "id": "AndroidBugreportDeviceAction",
      "type": "object",
      "description": "Captures a bugreport from the device. The output will be written to a file named `bugreport.zip` in the execution output directory."
    },
    "InputFile": {
      "id": "InputFile",
      "type": "object",
      "properties": {
        "gcsInputFile": {
          "description": "An input file in Google Cloud Storage.",
          "$ref": "GcsPath"
        }
      },
      "description": "Input file."
    },
    "AndroidOrientationDeviceAction": {
      "properties": {
        "orientation": {
          "description": "Required. The orientation to set the device to. One of `portrait` or `landscape`.",
          "type": "string"
        }
      },
      "id": "AndroidOrientationDeviceAction",
      "description": "Sets the orientation of the device.",
      "type": "object"
    },
    "CatalogLifecycle": {
      "description": "Catalog resource lifecycle: maturity state plus key lifecycle dates.",
      "properties": {
        "removalDate": {
          "readOnly": true,
          "$ref": "Date",
          "description": "Output only. Specifies the date the resource is scheduled to be removed from the catalog. Only set when `state == DEPRECATED`."
        },
        "state": {
          "description": "Output only. Specifies the current maturity state of the resource.",
          "enum": [
            "STATE_UNSPECIFIED",
            "PREVIEW",
            "ACTIVE",
            "DEPRECATED"
          ],
          "enumDescriptions": [
            "State not specified.",
            "Early access. This resource may have reduced stability and availability.",
            "Generally available.",
            "Still usable, but scheduled for removal."
          ],
          "type": "string",
          "readOnly": true
        }
      },
      "id": "CatalogLifecycle",
      "type": "object"
    },
    "IosAppPrivacyReportDeviceAction": {
      "description": "Collects the exported iOS App Privacy Report during the test run. When enabled, the iOS device records application activity (such as network access, domain requests, and sensitive resource access like photos, camera, or location) and exports Apple's official App Privacy Report. The report will be written to a file named `AppActivityReport.ndjson` in the execution output directory.",
      "id": "IosAppPrivacyReportDeviceAction",
      "properties": {},
      "type": "object"
    },
    "ExecutionReport": {
      "properties": {
        "outputFiles": {
          "type": "array",
          "readOnly": true,
          "items": {
            "$ref": "OutputFile"
          },
          "description": "Output only. The output files of the execution."
        },
        "displayName": {
          "readOnly": true,
          "type": "string",
          "description": "Output only. The display_name set by users in the ExecutionConfig."
        },
        "startTime": {
          "format": "google-datetime",
          "description": "Output only. The start time of the execution.",
          "type": "string",
          "readOnly": true
        },
        "warnings": {
          "type": "array",
          "items": {
            "$ref": "Warning"
          },
          "description": "Output only. Non-fatal warnings collected during the execution.",
          "readOnly": true
        },
        "endTime": {
          "format": "google-datetime",
          "type": "string",
          "description": "Output only. The end time of the execution.",
          "readOnly": true
        },
        "status": {
          "description": "Output only. The status of the execution.",
          "readOnly": true,
          "$ref": "Status"
        },
        "result": {
          "description": "Output only. The result of the execution.",
          "$ref": "Result",
          "readOnly": true
        },
        "id": {
          "description": "Output only. The unique identifier of the execution.",
          "type": "string",
          "readOnly": true
        }
      },
      "description": "The runtime information and result report of a single on-device execution attempt.",
      "type": "object",
      "id": "ExecutionReport"
    },
    "ListSessionsResponse": {
      "id": "ListSessionsResponse",
      "properties": {
        "sessions": {
          "description": "The list of sessions.",
          "items": {
            "$ref": "Session"
          },
          "type": "array"
        },
        "unreachable": {
          "description": "Unordered list. Sessions that could not be reached.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "nextPageToken": {
          "description": "Token to receive the next page of sessions. This will be absent if the end of the response list has been reached.",
          "type": "string"
        }
      },
      "type": "object",
      "description": "Response including listed sessions."
    },
    "AndroidInstrumentationTestUniformSharding": {
      "properties": {
        "shardCount": {
          "format": "int32",
          "description": "Required. The total number of shards to create. This must always be a positive number that is no greater than the total number of test cases. Limits: - For physical devices, the number of shards must be \u003c= 20. - For virtual devices, the number of shards must be \u003c= 200.",
          "type": "integer"
        }
      },
      "type": "object",
      "description": "Uniformly shards test cases given a total number of shards. It will be translated to `-e numShard` and `-e shardIndex` AndroidJUnitRunner arguments. With uniform sharding enabled, specifying either of these sharding arguments via `environment_variables` is invalid. Based on the sharding mechanism AndroidJUnitRunner uses, there is no guarantee that test cases will be distributed uniformly across all shards.",
      "id": "AndroidInstrumentationTestUniformSharding"
    },
    "IosPullFilesDeviceAction": {
      "id": "IosPullFilesDeviceAction",
      "type": "object",
      "properties": {
        "paths": {
          "type": "array",
          "items": {
            "$ref": "IosPullFilesDeviceActionPathConfig"
          },
          "description": "Required. Absolute directory or file paths to pull from the device. Limits: - A maximum of 10 paths are allowed."
        }
      },
      "description": "Pulls directories and files from the iOS device sandbox at the end of the run."
    },
    "AndroidInstallPackagesDeviceAction": {
      "description": "Installs Android packages on the device. At least one installable is specified when using this device action. Limits: - A maximum of 20 installables in total are allowed. - A maximum of 100 files are allowed in total across all installables.",
      "id": "AndroidInstallPackagesDeviceAction",
      "type": "object",
      "properties": {
        "preTargetAppInstallables": {
          "type": "array",
          "description": "Optional. The Android packages to install on the device before `target_app` (if specified) is installed. The installation will be performed in the order specified.",
          "items": {
            "$ref": "AndroidInstallable"
          }
        },
        "installables": {
          "deprecated": true,
          "type": "array",
          "description": "Optional. Deprecated: use `pre_target_app_installables`, `target_app` and `post_target_app_installables` instead. The Android packages to install on the device. The installation will be performed in the order specified, before the installables of all other fields.",
          "items": {
            "$ref": "AndroidInstallable"
          }
        },
        "postTargetAppInstallables": {
          "description": "Optional. The Android packages to install on the device after `target_app` (if specified) is installed. The installation will be performed in the order specified.",
          "items": {
            "$ref": "AndroidInstallable"
          },
          "type": "array"
        },
        "targetApp": {
          "description": "Optional. The primary Android package to install, serving as the target package for subsequent actions and as the installation ordering anchor. Whether this package is treated as the application under test depends on the job action: - Actions that require an explicit target package (such as performance metrics collection, or accessibility scans) use this package to identify the application to inspect or drive. - Actions that discover or manage targets independently (such as Android instrumentation tests, where target packages are defined in the test runner manifest) treat this field primarily as an installation order anchor between pre- and post-installables. Optional. If omitted, all packages in `pre_target_app_installables` and `post_target_app_installables` are installed without a designated target package.",
          "$ref": "AndroidInstallable"
        }
      }
    },
    "OutputFile": {
      "description": "Output file.",
      "properties": {
        "gcsOutputFile": {
          "$ref": "GcsPath",
          "description": "An output file in Google Cloud Storage."
        }
      },
      "id": "OutputFile",
      "type": "object"
    },
    "DeviceAction": {
      "type": "object",
      "properties": {
        "androidInstallPackages": {
          "description": "Installs Android packages on the device.",
          "$ref": "AndroidInstallPackagesDeviceAction"
        },
        "iosPushFiles": {
          "description": "Pushes files to the iOS device sandbox at the beginning of the run.",
          "$ref": "IosPushFilesDeviceAction"
        },
        "iosPullFiles": {
          "$ref": "IosPullFilesDeviceAction",
          "description": "Pulls directories and files from the iOS device sandbox at the end of the run."
        },
        "androidPushFiles": {
          "description": "Pushes files to the device at the beginning of the run.",
          "$ref": "AndroidPushFilesDeviceAction"
        },
        "iosRecordVideo": {
          "description": "Records a video of the iOS device screen during the run.",
          "$ref": "IosRecordVideoDeviceAction"
        },
        "iosInstallPackages": {
          "description": "Installs additional iOS packages on the device.",
          "$ref": "IosInstallPackagesDeviceAction"
        },
        "androidSwitchLocale": {
          "description": "Switches the locale (language and region) of the device.",
          "$ref": "AndroidSwitchLocaleDeviceAction"
        },
        "iosSwitchLocale": {
          "description": "Switches the locale (language and region) of the iOS application.",
          "$ref": "IosSwitchLocaleDeviceAction"
        },
        "androidPullFiles": {
          "description": "Pulls directories and files from the device at the end of the run.",
          "$ref": "AndroidPullFilesDeviceAction"
        },
        "androidLogcat": {
          "description": "Collects logcat output from the device.",
          "$ref": "AndroidLogcatDeviceAction"
        },
        "androidOrientation": {
          "$ref": "AndroidOrientationDeviceAction",
          "description": "Sets the orientation of the device."
        },
        "androidDumpsys": {
          "$ref": "AndroidDumpsysDeviceAction",
          "description": "Captures a dumpsys from the device."
        },
        "androidRecordVideo": {
          "$ref": "AndroidRecordVideoDeviceAction",
          "description": "Records a video of the device screen during the run."
        },
        "androidBugreport": {
          "description": "Captures a bugreport from the device unless the test result is pass.",
          "$ref": "AndroidBugreportDeviceAction"
        },
        "iosAppPrivacyReport": {
          "description": "Collects the exported iOS App Privacy Report during the run.",
          "$ref": "IosAppPrivacyReportDeviceAction"
        },
        "androidMockLocation": {
          "$ref": "AndroidMockLocationDeviceAction",
          "description": "Mocks the location of the device."
        }
      },
      "description": "The action to be performed on a device.",
      "id": "DeviceAction"
    },
    "IosInstallPackagesDeviceAction": {
      "type": "object",
      "description": "Installs iOS packages on the device.",
      "id": "IosInstallPackagesDeviceAction",
      "properties": {
        "ipas": {
          "type": "array",
          "description": "Required. Additional iOS packages (IPAs) to install on the device. Limits: - A maximum of 20 IPAs are allowed.",
          "items": {
            "$ref": "InputFile"
          }
        }
      }
    },
    "Warning": {
      "properties": {
        "summary": {
          "$ref": "IssueSummary",
          "readOnly": true,
          "description": "Output only. Detailed warning summary."
        }
      },
      "id": "Warning",
      "type": "object",
      "description": "Non-fatal operational anomaly, lint observation, or execution insight."
    },
    "JobReport": {
      "description": "The runtime information and result report of a job.",
      "type": "object",
      "properties": {
        "startTime": {
          "description": "Output only. The start time of the job.",
          "type": "string",
          "readOnly": true,
          "format": "google-datetime"
        },
        "warnings": {
          "readOnly": true,
          "type": "array",
          "items": {
            "$ref": "Warning"
          },
          "description": "Output only. Non-fatal warnings collected during the job."
        },
        "executionReports": {
          "type": "array",
          "readOnly": true,
          "description": "Output only. Reports of the execution attempts of the job.",
          "items": {
            "$ref": "ExecutionReport"
          }
        },
        "result": {
          "$ref": "Result",
          "readOnly": true,
          "description": "Output only. The result of the job."
        },
        "id": {
          "type": "string",
          "description": "Output only. The unique identifier of the job.",
          "readOnly": true
        },
        "labels": {
          "readOnly": true,
          "description": "Output only. The original labels provided by the user during job creation.",
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        "outputFiles": {
          "description": "Output only. The output files of the job.",
          "items": {
            "$ref": "OutputFile"
          },
          "type": "array",
          "readOnly": true
        },
        "displayName": {
          "type": "string",
          "readOnly": true,
          "description": "Output only. The display_name set by users in the JobConfig."
        },
        "endTime": {
          "type": "string",
          "readOnly": true,
          "description": "Output only. The end time of the job.",
          "format": "google-datetime"
        },
        "status": {
          "$ref": "Status",
          "description": "Output only. The status of the job.",
          "readOnly": true
        }
      },
      "id": "JobReport"
    },
    "JobSettings": {
      "id": "JobSettings",
      "type": "object",
      "description": "Job settings to control the job execution.",
      "properties": {
        "retrySettings": {
          "$ref": "RetrySettings",
          "description": "Optional. The retry settings of the job."
        }
      }
    },
    "AndroidMockLocationDeviceAction": {
      "type": "object",
      "properties": {
        "location": {
          "description": "Required. The mock location to set on the device.",
          "$ref": "LatLng"
        }
      },
      "description": "Mocks the location of the Android device.",
      "id": "AndroidMockLocationDeviceAction"
    },
    "Empty": {
      "type": "object",
      "properties": {},
      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); }",
      "id": "Empty"
    },
    "DeviceConfig": {
      "type": "object",
      "id": "DeviceConfig",
      "description": "The configuration of a run on a device.",
      "properties": {
        "requirement": {
          "$ref": "DeviceRequirement",
          "description": "Required. The requirement of the device."
        },
        "actions": {
          "items": {
            "$ref": "DeviceAction"
          },
          "type": "array",
          "description": "Optional. The actions to be performed on the device. Actions will be executed in the order they are specified in the list. Each action type can at most have 1 instance in the list."
        }
      }
    },
    "CatalogIosDeviceDetails": {
      "id": "CatalogIosDeviceDetails",
      "description": "iOS-specific device attributes. Reserved for future iOS-only fields.",
      "properties": {},
      "type": "object"
    },
    "AndroidInstrumentationTestSmartSharding": {
      "description": "The smart sharding strategy to split the job into multiple shards based on the test methods and their recorded execution time.",
      "id": "AndroidInstrumentationTestSmartSharding",
      "properties": {
        "targetedShardDuration": {
          "format": "google-duration",
          "description": "Required. The targeted duration of each shard. Limits: - Must be at least 2 minutes. - Must be at most 3 hours. Shard duration is not guaranteed because smart sharding uses test case history and default durations which may not be accurate. Durations are calculated based on the following inputs: - Timing records from previous runs of the same test case. - For new test cases, the average duration of other known test cases. - A system-chosen, default duration if there are no previous timing records available. Because the actual shard duration can exceed the targeted shard duration, we recommend that you set the targeted value at least 5 minutes less than the maximum allowed instrumentation timeout. This approach avoids cancelling the shard before all tests can finish.",
          "type": "string"
        },
        "timingRecord": {
          "description": "Required. The timing record file to use for smart sharding. If the file does not exist, smart sharding will use default test time (30s) for each test method to shard the job into multiple shards. This file will be overwritten with the latest timing record after the job is completed.",
          "$ref": "InputFile"
        },
        "maxShardCount": {
          "type": "integer",
          "description": "Optional. The maximum number of shards to create. If unset or less than 1, system-defined max limits are used. This limit takes precedence if the targeted_shard_duration cannot be satisfied. Limits: - For physical devices, the number of shards must be \u003c= 20. - For virtual devices, the number of shards must be \u003c= 200.",
          "format": "int32"
        }
      },
      "type": "object"
    },
    "IosRecordVideoDeviceAction": {
      "id": "IosRecordVideoDeviceAction",
      "properties": {
        "discardOnPass": {
          "description": "Optional. Whether to discard the video if the test passes. If not specified, the default is false (always keep the video).",
          "type": "boolean"
        }
      },
      "description": "Records a video of the iOS device screen during the run. The video will be written to a file named `video.mp4` in the execution output directory.",
      "type": "object"
    },
    "CatalogScreenMetrics": {
      "id": "CatalogScreenMetrics",
      "type": "object",
      "properties": {
        "densityDpi": {
          "readOnly": true,
          "format": "int32",
          "description": "Output only. Pixel density in dots per inch (dpi).",
          "type": "integer"
        },
        "heightPx": {
          "format": "int32",
          "type": "integer",
          "description": "Output only. Height in pixels.",
          "readOnly": true
        },
        "widthPx": {
          "type": "integer",
          "description": "Output only. Width in pixels.",
          "format": "int32",
          "readOnly": true
        }
      },
      "description": "Screen measurements of a device."
    },
    "CatalogListSoftwareVersionsResponse": {
      "properties": {
        "softwareVersions": {
          "items": {
            "$ref": "CatalogSoftwareVersion"
          },
          "description": "The list of software versions.",
          "type": "array"
        },
        "nextPageToken": {
          "description": "Token to receive the next page of software versions. This will be absent if the end of the response list has been reached.",
          "type": "string"
        }
      },
      "type": "object",
      "description": "Response including listed software versions.",
      "id": "CatalogListSoftwareVersionsResponse"
    },
    "CatalogSupportedProduct": {
      "type": "object",
      "description": "Declares that a device supports a given Device Cloud product, with optional per-product metadata. Discriminated by which product-specific message is set; adding a new product = new oneof arm + new per-product message.",
      "properties": {
        "deviceStreaming": {
          "readOnly": true,
          "$ref": "CatalogDeviceStreamingSupport",
          "description": "Output only. Represents DeviceStreaming, which is interactive remote device streaming."
        },
        "automation": {
          "readOnly": true,
          "$ref": "CatalogAutomationSupport",
          "description": "Output only. Represents Automation, which is DeviceRun-backed automated test execution."
        }
      },
      "id": "CatalogSupportedProduct"
    },
    "LatLng": {
      "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges.",
      "type": "object",
      "id": "LatLng",
      "properties": {
        "latitude": {
          "type": "number",
          "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
          "format": "double"
        },
        "longitude": {
          "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
          "format": "double",
          "type": "number"
        }
      }
    },
    "CancelSessionResponse": {
      "description": "Response of the cancel session request.",
      "properties": {
        "cancelResult": {
          "type": "string",
          "enumDescriptions": [
            "Unspecified cancel result.",
            "The session is marked as cancelled, but has not finished yet.",
            "The session is finished, either by itself or by the cancel request."
          ],
          "description": "The result of the request.",
          "enum": [
            "CANCEL_RESULT_UNSPECIFIED",
            "SESSION_MARKED_AS_CANCELLED",
            "SESSION_FINISHED"
          ]
        }
      },
      "id": "CancelSessionResponse",
      "type": "object"
    },
    "AndroidSwitchLocaleDeviceAction": {
      "type": "object",
      "id": "AndroidSwitchLocaleDeviceAction",
      "properties": {
        "localeCode": {
          "description": "Required. The locale (language and region) to switch the device to. The format is `language-region`, e.g. \"en-US\", \"zh-CN\", etc. The typical language value is a two or three-letter language code as defined in ISO639. The typical region value is a two-letter ISO 3166 code or a three-digit UN M.49 area code.",
          "type": "string"
        }
      },
      "description": "Switches the locale (language and region) of the device."
    },
    "Status": {
      "type": "object",
      "properties": {
        "statusType": {
          "readOnly": true,
          "enum": [
            "STATUS_TYPE_UNSPECIFIED",
            "PENDING",
            "RUNNING",
            "DONE",
            "SUSPENDED"
          ],
          "type": "string",
          "description": "Output only. The status type of the session/job/execution.",
          "enumDescriptions": [
            "Unknown status type.",
            "The session/job/execution is pending, not started yet.",
            "The session/job/execution is running.",
            "The session/job/execution is finished.",
            "The session/job/execution is suspended due to quota issues."
          ]
        },
        "progressMessages": {
          "readOnly": true,
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Output only. Human-readable, detailed descriptions of the session/job/execution's progress. For example: \"Provisioning a device\", \"Starting Test\". Each message should contain only one line of text. During the course of execution new data may be appended to the end of progress_messages."
        }
      },
      "description": "The status of a session/job/execution.",
      "id": "Status"
    },
    "CatalogDeviceAvailability": {
      "type": "object",
      "properties": {
        "available": {
          "type": "string",
          "readOnly": true,
          "description": "Output only. Specifies the current availability bucket (idle, immediately allocatable devices) for this device configuration. This is a best-effort snapshot, refreshed periodically. It fluctuates depending on traffic as other requests allocate devices.",
          "enum": [
            "AVAILABILITY_UNSPECIFIED",
            "AVAILABILITY_NONE",
            "AVAILABILITY_LOW",
            "AVAILABILITY_MEDIUM",
            "AVAILABILITY_HIGH"
          ],
          "enumDescriptions": [
            "The value of availability is unknown or unset.",
            "No devices of this configuration are currently idle. A request can still be made, but it will queue until a device frees up. Expect longer wait times, and avoid requesting many devices at once (e.g. high shard counts).",
            "A small number of devices are currently idle. Suitable for a few concurrent requests. Larger bursts (e.g. many shards) may queue until devices free up.",
            "A moderate number of devices are currently idle. Suitable for a moderate number of concurrent requests. Very large bursts may still queue.",
            "Many devices are currently idle. Suitable for a large number of concurrent requests with little to no queueing at the moment of observation."
          ]
        },
        "capacity": {
          "readOnly": true,
          "type": "string",
          "enumDescriptions": [
            "The value of device capacity is unknown or unset.",
            "No online devices of this configuration. These devices are unavailable either temporarily or permanently and should not be requested. If the device is also marked as deprecated, this state is very likely permanent.",
            "Devices that are low in capacity (the lab has a small number of these devices). These devices may be used if users need to test on this specific device model and version. Please note that due to low capacity, the tests may take much longer to finish, especially if a large number of tests are invoked at once. These devices are not suitable for test sharding.",
            "Devices that are medium in capacity (the lab has a decent number of these devices, though not as many as high capacity devices). These devices are suitable for fewer test runs (e.g. fewer than 100 tests) and only for low shard counts (e.g. less than 10 shards).",
            "Devices that are high in capacity (the lab has a large number of these devices). These devices are generally suggested for running a large number of simultaneous tests (e.g. more than 100 tests). Please note that high capacity devices do not guarantee short wait times due to several factors: 1. Traffic (how heavily they are used at any given moment). 2. High capacity devices are prioritized for certain usages, which may cause user tests to be slower than selecting other similar device types."
          ],
          "enum": [
            "CAPACITY_UNSPECIFIED",
            "CAPACITY_NONE",
            "CAPACITY_LOW",
            "CAPACITY_MEDIUM",
            "CAPACITY_HIGH"
          ],
          "description": "Output only. Specifies the current capacity bucket for this device configuration. Represents the total number of online devices (idle or in use)."
        }
      },
      "id": "CatalogDeviceAvailability",
      "description": "Fleet availability for a device configuration."
    },
    "AndroidDumpsysDeviceAction": {
      "description": "Captures dumpsys output from the device. The output will be written to a file named `dumpsys.log` in the execution output directory.",
      "properties": {
        "collectOnPass": {
          "description": "Optional. Whether to deliver the dumpsys when the test passes. If false, the dumpsys is skipped on pass to save time (default behavior). If true, the dumpsys is always delivered.",
          "type": "boolean"
        }
      },
      "id": "AndroidDumpsysDeviceAction",
      "type": "object"
    },
    "OperationMetadata": {
      "id": "OperationMetadata",
      "properties": {
        "endTime": {
          "description": "Output only. The time the operation finished running.",
          "readOnly": true,
          "format": "google-datetime",
          "type": "string"
        },
        "apiVersion": {
          "type": "string",
          "description": "Output only. API version used to start the operation.",
          "readOnly": true
        },
        "requestedCancellation": {
          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have been cancelled successfully have google.longrunning.Operation.error value with a google.rpc.Status.code of `1`, corresponding to `Code.CANCELLED`.",
          "readOnly": true,
          "type": "boolean"
        },
        "target": {
          "description": "Output only. Server-defined resource path for the target of the operation.",
          "type": "string",
          "readOnly": true
        },
        "createTime": {
          "description": "Output only. The time the operation was created.",
          "readOnly": true,
          "format": "google-datetime",
          "type": "string"
        },
        "verb": {
          "description": "Output only. Name of the verb executed by the operation.",
          "readOnly": true,
          "type": "string"
        },
        "statusMessage": {
          "readOnly": true,
          "type": "string",
          "description": "Output only. Human-readable status of the operation, if any."
        }
      },
      "description": "Represents the metadata of the long-running operation.",
      "type": "object"
    },
    "ResultCause": {
      "description": "Describes the cause of the non-passed result occurred during the execution.",
      "type": "object",
      "properties": {
        "summary": {
          "description": "Output only. Structured cause detail.",
          "readOnly": true,
          "$ref": "IssueSummary"
        }
      },
      "id": "ResultCause"
    },
    "Result": {
      "id": "Result",
      "description": "The result of a session/job/execution.",
      "type": "object",
      "properties": {
        "resultType": {
          "readOnly": true,
          "enumDescriptions": [
            "Unknown result type.",
            "Finished and passed.",
            "Finished but failed. It is usually caused by the user config, problematic test cases, or real bugs of their apps/platform under test.",
            "Unclassified error, can be caused by user config/tests/AUT, infra, or the tools that the infra is depending on.",
            "Test timeout.",
            "Test is aborted by user."
          ],
          "enum": [
            "RESULT_TYPE_UNSPECIFIED",
            "PASSED",
            "FAILED",
            "ERROR",
            "TIMED_OUT",
            "CANCELLED"
          ],
          "type": "string",
          "description": "Output only. The result type of the session/job/execution."
        },
        "cause": {
          "readOnly": true,
          "description": "Output only. Detailed result cause diagnostics. Set if type is not PASSED.",
          "$ref": "ResultCause"
        }
      }
    },
    "AndroidLogcatDeviceAction": {
      "type": "object",
      "description": "Collects logcat output from the device. The output will be written to a file named `logcat.txt` in the execution output directory.",
      "id": "AndroidLogcatDeviceAction",
      "properties": {}
    },
    "CatalogDevice": {
      "id": "CatalogDevice",
      "type": "object",
      "description": "A single routable device configuration in the catalog.",
      "properties": {
        "iosDetails": {
          "description": "Output only. Contains iOS-specific attributes (set when platform == IOS).",
          "readOnly": true,
          "$ref": "CatalogIosDeviceDetails"
        },
        "accessDeniedReasons": {
          "description": "Output only. Reasons for access denial. This model is accessible/usable if this list is empty, otherwise the model is viewable only.",
          "readOnly": true,
          "items": {
            "enum": [
              "ACCESS_DENIED_REASON_UNSPECIFIED",
              "EULA_NOT_ACCEPTED"
            ],
            "type": "string",
            "enumDescriptions": [
              "Reason not specified.",
              "The device is hosted in a partner lab whose end user license agreement the project has not accepted."
            ]
          },
          "type": "array"
        },
        "manufacturer": {
          "type": "string",
          "description": "Output only. Specifies the hardware manufacturer of the device.",
          "readOnly": true
        },
        "labInfo": {
          "$ref": "CatalogLabInfo",
          "description": "Output only. The lab hosting this device.",
          "readOnly": true
        },
        "primaryScreen": {
          "readOnly": true,
          "$ref": "CatalogScreenMetrics",
          "description": "Output only. Measurements of the primary device screen. Informational only. Unset for devices without a screen (e.g. some wearables)."
        },
        "platform": {
          "description": "Output only. Specifies the platform of the device.",
          "readOnly": true,
          "enumDescriptions": [
            "Platform not specified.",
            "Android.",
            "iOS."
          ],
          "enum": [
            "PLATFORM_UNSPECIFIED",
            "ANDROID",
            "IOS"
          ],
          "type": "string"
        },
        "lifecycle": {
          "description": "Output only. The device lifecycle (maturity stage and removal date).",
          "readOnly": true,
          "$ref": "CatalogLifecycle"
        },
        "androidDetails": {
          "$ref": "CatalogAndroidDeviceDetails",
          "readOnly": true,
          "description": "Output only. Contains Android-specific attributes (set when platform == ANDROID)."
        },
        "labels": {
          "additionalProperties": {
            "type": "string"
          },
          "readOnly": true,
          "type": "object",
          "description": "Output only. Additional information. Informational only. May change over the lifecycle of a device."
        },
        "supportedProducts": {
          "description": "Output only. Products/Services supported by this device.",
          "type": "array",
          "readOnly": true,
          "items": {
            "$ref": "CatalogSupportedProduct"
          }
        },
        "formFactor": {
          "type": "string",
          "description": "Output only. Specifies the form factor of the device.",
          "enum": [
            "FORM_FACTOR_UNSPECIFIED",
            "PHONE",
            "TABLET",
            "WEARABLE",
            "TV"
          ],
          "enumDescriptions": [
            "Form factor not specified.",
            "Phone.",
            "Tablet.",
            "Wearable (e.g. watch).",
            "TV."
          ],
          "readOnly": true
        },
        "modelCode": {
          "description": "Output only. Provides a human-readable model identifier for this device, independent of OS version. May be empty. Platform-dependent: * Android physical: hardware codename (android.os.Build.DEVICE), e.g. \"shiba\". * Android virtual: AVD model identifier, e.g. \"MediumPhone.arm\". * iOS: model identifier, e.g. \"iphone14pro\".",
          "type": "string",
          "readOnly": true
        },
        "osVersion": {
          "type": "string",
          "description": "Output only. Specifies the OS version, e.g. \"30\" (Android API level) or \"17.4\" (iOS).",
          "readOnly": true
        },
        "name": {
          "type": "string",
          "description": "Identifier. Identifies the device resource. Format: `projects/{project}/locations/{location}/devices/{device}`. The {device} segment is an opaque, stable string. Clients must not parse it to derive or assume device-specific details."
        },
        "hardwareType": {
          "enumDescriptions": [
            "Hardware type not specified.",
            "Physical hardware device.",
            "Virtual device (emulator / simulator)."
          ],
          "description": "Output only. Indicates whether the device is physical or virtual.",
          "enum": [
            "HARDWARE_TYPE_UNSPECIFIED",
            "PHYSICAL",
            "VIRTUAL"
          ],
          "readOnly": true,
          "type": "string"
        },
        "availability": {
          "$ref": "CatalogDeviceAvailability",
          "readOnly": true,
          "description": "Output only. Reports the current fleet availability for this device configuration."
        },
        "displayName": {
          "readOnly": true,
          "type": "string",
          "description": "Output only. Provides a human-readable display name, e.g. \"Pixel 5\"."
        }
      }
    },
    "AndroidNativeBinary": {
      "description": "The configuration of an Android native binary execution.",
      "id": "AndroidNativeBinary",
      "type": "object",
      "properties": {
        "args": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "Optional. Arguments for running the binary file. The flags will be appended to the command line that invokes the binary. Limits: - Maximum number of entries: 64 - Maximum entry size: 1024 bytes (UTF-8)"
        },
        "executionTimeout": {
          "format": "google-duration",
          "description": "Optional. The timeout of the execution. Default value: 5 min. Range: [1 min, 3 hours].",
          "type": "string"
        },
        "envVars": {
          "description": "Optional. A map of environment variables to set for the binary process. The keys are the variable names and the values are the variable values. Limits: - Maximum number of entries: 32 - Maximum key size: 64 bytes (UTF-8) - Key regex: `a-zA-Z_*` - Maximum value size: 1024 bytes (UTF-8)",
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        "androidNativeBinary": {
          "$ref": "InputFile",
          "description": "Required. The file path of the Android native binary."
        }
      }
    },
    "JobAction": {
      "description": "The action to be performed in a job.",
      "properties": {
        "androidNativeBinary": {
          "description": "Android native binary execution.",
          "$ref": "AndroidNativeBinary"
        },
        "androidInstrumentationTest": {
          "description": "Android instrumentation test.",
          "$ref": "AndroidInstrumentationTest"
        },
        "iosXcTest": {
          "description": "iOS XCTest.",
          "$ref": "IosXcTest"
        }
      },
      "id": "JobAction",
      "type": "object"
    },
    "CatalogXcodeDetails": {
      "description": "Xcode-specific attributes.",
      "type": "object",
      "id": "CatalogXcodeDetails",
      "properties": {
        "supportedIosVersions": {
          "type": "array",
          "readOnly": true,
          "items": {
            "type": "string"
          },
          "description": "Output only. Lists the iOS versions this Xcode can run tests against, e.g. \"16.6\". This is a property of the toolchain, so it says nothing about whether a device on that iOS version is available; list the `Device` collection to find out."
        }
      }
    },
    "IosSwitchLocaleDeviceAction": {
      "id": "IosSwitchLocaleDeviceAction",
      "properties": {
        "localeCode": {
          "description": "Required. The locale (language and region) to switch the app to. The format is `language-region` or `language`, e.g. \"en-US\", \"zh-CN\", \"ja\", etc.",
          "type": "string"
        }
      },
      "description": "Switches the locale (language and region) of the iOS application.",
      "type": "object"
    },
    "Session": {
      "description": "A session resource in the AutomationSession API. At a high level, `Session` describes the configuration of one or multiple jobs, the state transitions it goes through, and the results.",
      "id": "Session",
      "properties": {
        "sessionReport": {
          "readOnly": true,
          "description": "Output only. The runtime information and result report of the session.",
          "$ref": "SessionReport"
        },
        "name": {
          "description": "Identifier. The resource name of the session. Format: `projects/{project}/locations/{location}/sessions/{session}`.",
          "type": "string"
        },
        "sessionConfig": {
          "description": "Required. Configuration used to create the session.",
          "$ref": "SessionConfig"
        }
      },
      "type": "object"
    },
    "GoogleLongrunningListOperationsResponse": {
      "id": "GoogleLongrunningListOperationsResponse",
      "type": "object",
      "properties": {
        "nextPageToken": {
          "description": "The standard List next-page token.",
          "type": "string"
        },
        "unreachable": {
          "description": "Unordered list. Unreachable resources. Populated when the request sets `ListOperationsRequest.return_partial_success` and reads across collections. For example, when attempting to list all resources across all supported locations.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "operations": {
          "items": {
            "$ref": "GoogleLongrunningOperation"
          },
          "type": "array",
          "description": "A list of operations that matches the specified filter in the request."
        }
      },
      "description": "The response message for Operations.ListOperations."
    },
    "IssueSummary": {
      "id": "IssueSummary",
      "properties": {
        "type": {
          "enum": [
            "ISSUE_TYPE_UNSPECIFIED",
            "INFRA",
            "CUSTOMER"
          ],
          "type": "string",
          "readOnly": true,
          "enumDescriptions": [
            "Unspecified issue type. This value is unused.",
            "Platform infrastructure or operational execution environment failure.",
            "Customer test script failure, malformed APK, or bad user configuration."
          ],
          "description": "Output only. The issue classification based on responsibility."
        },
        "reason": {
          "type": "string",
          "readOnly": true,
          "description": "Output only. The reason of the issue. This is a constant value that identifies the proximate cause of the issue. This should be at most 63 characters and match a regular expression of `A-Z*[A-Z0-9]`, which represents UPPER_SNAKE_CASE."
        },
        "message": {
          "description": "Output only. Human-readable explanation of the issue in English.",
          "readOnly": true,
          "type": "string"
        }
      },
      "type": "object",
      "description": "Describes the summary of an issue (error or warning) with structured details."
    },
    "Date": {
      "id": "Date",
      "type": "object",
      "description": "Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values. * A month and day, with a zero year (for example, an anniversary). * A year on its own, with a zero month and a zero day. * A year and month, with a zero day (for example, a credit card expiration date). Related types: * google.type.TimeOfDay * google.type.DateTime * google.protobuf.Timestamp",
      "properties": {
        "year": {
          "format": "int32",
          "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.",
          "type": "integer"
        },
        "month": {
          "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.",
          "type": "integer",
          "format": "int32"
        },
        "day": {
          "description": "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant.",
          "type": "integer",
          "format": "int32"
        }
      }
    },
    "IosXcTest": {
      "id": "IosXcTest",
      "description": "The configuration of an iOS XCTest.",
      "properties": {
        "testsZip": {
          "description": "Required. The .zip containing the .xctestrun file and the contents of the DerivedData/Build/Products directory.",
          "$ref": "InputFile"
        },
        "xctestrun": {
          "$ref": "InputFile",
          "description": "Optional. An .xctestrun file that will override the .xctestrun file in the tests zip."
        },
        "xcodeVersion": {
          "type": "string",
          "description": "Optional. The Xcode version that should be used for the test. If not set, a system-default Xcode version is used. The available Xcode versions can be retrieved from the catalog service."
        },
        "xcTestTimeout": {
          "type": "string",
          "description": "Optional. The timeout of the test. Default value: 5 min. Range: [1 min, 3 hours].",
          "format": "google-duration"
        }
      },
      "type": "object"
    },
    "AndroidInstrumentationTest": {
      "id": "AndroidInstrumentationTest",
      "properties": {
        "testTargets": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "Optional. A list of test targets or target filters to run. Each target must be fully qualified with the package name or class name, in one of these formats: - `package package_name` - `notPackage com.package.to.skip` - `class package_name.class_name` - `class package_name.class_name#method_name` - `notClass com.foo.ClassToSkip` - `notClass com.foo.ClassName#testMethodToSkip` - `annotation com.foo.AnnotationToRun` - `notAnnotation com.foo.AnnotationToSkip` - `size [small|medium|large]` Formats like `testfile` or `notTestfile` won't be supported. If empty, all targets in the module will be run. Limits: - Maximum number of entries: 1024."
        },
        "enableCodeCoverage": {
          "description": "Optional. Whether to enable code coverage collection for the test. A coverage file `coverage.ec` will be uploaded to the results folder. For this to work, your classes have to be instrumented offline (build time) by EMMA/JaCoCo.",
          "type": "boolean"
        },
        "testInstallable": {
          "description": "Required. The test package to install and run the test.",
          "$ref": "AndroidInstallable"
        },
        "uniformSharding": {
          "description": "Optional. Uniform sharding strategy to split the job into multiple shards with equal number of test methods.",
          "$ref": "AndroidInstrumentationTestUniformSharding"
        },
        "testRunnerClass": {
          "type": "string",
          "description": "Optional. Full class name of the test runner class. The class must be `androidx.test.runner.AndroidJUnitRunner` or a subclass of it. The default value is determined by examining the application's manifest. If multiple instrumentations are found, the first one in the manifest will be used."
        },
        "instrumentationTimeout": {
          "description": "Optional. The timeout of the instrumentation test. Default value: 5 min. Range: [1 min, 3 hours].",
          "format": "google-duration",
          "type": "string"
        },
        "orchestratorVersion": {
          "type": "string",
          "description": "Optional. The version of the Android Test Orchestrator to use for the test. The available orchestrator versions can be retrieved from the catalog service. If set to \"auto\", the default orchestrator is used. If not set, no orchestrator is used."
        },
        "additionalTestOptions": {
          "description": "Optional. Additional test options to pass to the test runner. Passed to `am instrument` command as `-e` options, which will be passed to the instrumentation test runner using its `onCreate()` method. Formats supported in test_targets are not allowed to be used here. Limits: - Maximum number of entries: 32. - Maximum key size: 64 bytes (UTF-8). - Maximum value size: 1024 bytes (UTF-8).",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "smartSharding": {
          "$ref": "AndroidInstrumentationTestSmartSharding",
          "description": "Optional. Smart sharding strategy to split the job into multiple shards based on the test methods and their execution time."
        }
      },
      "description": "The configuration of an Android instrumentation test. See https://developer.android.com/training/testing/instrumented-tests for more information on Android instrumentation tests.",
      "type": "object"
    },
    "GcsPath": {
      "properties": {
        "path": {
          "description": "Required. The Google Cloud Storage path of the file or directory. Format: `gs:///`.",
          "type": "string"
        }
      },
      "description": "A path to a file or directory in Google Cloud Storage.",
      "type": "object",
      "id": "GcsPath"
    },
    "CatalogAndroidDeviceDetails": {
      "properties": {
        "supportedAbis": {
          "type": "array",
          "description": "Output only. Lists ABIs supported by the device (android.os.Build.SUPPORTED_ABIS), most preferred first, e.g. \"arm64-v8a\".",
          "readOnly": true,
          "items": {
            "type": "string"
          }
        },
        "buildType": {
          "description": "Output only. Mirrors the AOSP `ro.build.type` property, e.g. \"user\", \"userdebug\", \"eng\". Empty if unknown.",
          "readOnly": true,
          "type": "string"
        }
      },
      "id": "CatalogAndroidDeviceDetails",
      "description": "Android-specific device attributes.",
      "type": "object"
    },
    "IosPushFilesDeviceAction": {
      "description": "Pushes files to the iOS device sandbox at the beginning of the run.",
      "properties": {
        "fileConfigs": {
          "items": {
            "$ref": "IosPushFilesDeviceActionFileConfig"
          },
          "description": "Required. Configs of pushing files to the device. Limits: - A maximum of 50 files are allowed.",
          "type": "array"
        }
      },
      "id": "IosPushFilesDeviceAction",
      "type": "object"
    },
    "CatalogDeviceStreamingSupport": {
      "properties": {
        "minimumAndroidStudioVersion": {
          "description": "Output only. Specifies the minimum Android Studio version that supports this device. Optional; only set when the device is known to work only at or above a certain Android Studio version. Expected format \"major.minor.micro.patch\", e.g. \"5921.22.2211.8881706\".",
          "readOnly": true,
          "type": "string"
        }
      },
      "type": "object",
      "id": "CatalogDeviceStreamingSupport",
      "description": "Per-product metadata for the DeviceStreaming product."
    },
    "GoogleRpcStatus": {
      "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).",
      "type": "object",
      "properties": {
        "message": {
          "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.",
          "type": "string"
        },
        "details": {
          "type": "array",
          "description": "A list of messages that carry the error details. There is a common set of message types for APIs to use.",
          "items": {
            "type": "object",
            "additionalProperties": {
              "type": "any",
              "description": "Properties of the object. Contains field @type with type URL."
            }
          }
        },
        "code": {
          "type": "integer",
          "format": "int32",
          "description": "The status code, which should be an enum value of google.rpc.Code."
        }
      },
      "id": "GoogleRpcStatus"
    },
    "CancelSessionRequest": {
      "id": "CancelSessionRequest",
      "description": "Request to cancel a session.",
      "properties": {},
      "type": "object"
    },
    "IosPushFilesDeviceActionFileConfig": {
      "description": "The configuration of pushing a file to the iOS device.",
      "id": "IosPushFilesDeviceActionFileConfig",
      "type": "object",
      "properties": {
        "bundleId": {
          "description": "Required. The bundle ID of the application sandbox.",
          "type": "string"
        },
        "sourceFile": {
          "$ref": "InputFile",
          "description": "Required. The file to be pushed."
        },
        "destinationPath": {
          "description": "Required. The destination path relative to the app sandbox, e.g. \"/Documents/file.txt\".",
          "type": "string"
        }
      }
    },
    "AndroidRecordVideoDeviceAction": {
      "properties": {
        "discardOnPass": {
          "description": "Optional. Whether to discard and not upload the recording when the test passes. Default is false.",
          "type": "boolean"
        }
      },
      "description": "Records a video of the device screen during the run. The video will be written to a file named `video.mp4` in the execution output directory.",
      "type": "object",
      "id": "AndroidRecordVideoDeviceAction"
    },
    "SessionConfig": {
      "id": "SessionConfig",
      "properties": {
        "notificationConfig": {
          "description": "Optional. Notification config for the session.",
          "$ref": "SessionConfigSessionNotificationConfig"
        },
        "jobConfigs": {
          "type": "array",
          "description": "Required. Configs of the jobs in the session.",
          "items": {
            "$ref": "JobConfig"
          }
        },
        "displayName": {
          "description": "Optional. User-settable, human-readable name for the session. Maximum size is 63 bytes when encoded as UTF-8. If set, must match regex: `^A-Za-z0-9*$`.",
          "type": "string"
        },
        "outputDirectoryConfig": {
          "description": "Required. Output file directory config for the session.",
          "$ref": "SessionConfigSessionOutputFileDirectoryConfig"
        }
      },
      "type": "object",
      "description": "SessionConfig is used to create a session."
    },
    "GoogleLongrunningOperation": {
      "id": "GoogleLongrunningOperation",
      "type": "object",
      "properties": {
        "metadata": {
          "additionalProperties": {
            "description": "Properties of the object. Contains field @type with type URL.",
            "type": "any"
          },
          "description": "Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.",
          "type": "object"
        },
        "name": {
          "type": "string",
          "description": "The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`."
        },
        "error": {
          "$ref": "GoogleRpcStatus",
          "description": "The error result of the operation in case of failure or cancellation."
        },
        "response": {
          "description": "The normal, successful response of the operation. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.",
          "additionalProperties": {
            "description": "Properties of the object. Contains field @type with type URL.",
            "type": "any"
          },
          "type": "object"
        },
        "done": {
          "description": "If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.",
          "type": "boolean"
        }
      },
      "description": "This resource represents a long-running operation that is the result of a network API call."
    },
    "IosPullFilesDeviceActionPathConfig": {
      "properties": {
        "bundleId": {
          "type": "string",
          "description": "Required. The bundle ID of the application sandbox."
        },
        "devicePath": {
          "type": "string",
          "description": "Required. The device path relative to the app sandbox, e.g. \"/Documents/output/\"."
        }
      },
      "type": "object",
      "description": "The configuration of pulling a file or directory from the iOS device.",
      "id": "IosPullFilesDeviceActionPathConfig"
    },
    "SessionReport": {
      "properties": {
        "endTime": {
          "description": "Output only. The end time of the session.",
          "readOnly": true,
          "format": "google-datetime",
          "type": "string"
        },
        "id": {
          "type": "string",
          "description": "Output only. The unique identifier of the session.",
          "readOnly": true
        },
        "status": {
          "readOnly": true,
          "description": "Output only. The status of the session.",
          "$ref": "Status"
        },
        "result": {
          "description": "Output only. The result of the session.",
          "$ref": "Result",
          "readOnly": true
        },
        "startTime": {
          "type": "string",
          "format": "google-datetime",
          "description": "Output only. The start time of the session.",
          "readOnly": true
        },
        "jobReports": {
          "description": "Output only. Reports of the jobs in the session.",
          "readOnly": true,
          "type": "array",
          "items": {
            "$ref": "JobReport"
          }
        }
      },
      "type": "object",
      "description": "The runtime information and result report of a session.",
      "id": "SessionReport"
    },
    "CatalogLabInfo": {
      "properties": {
        "displayName": {
          "readOnly": true,
          "type": "string",
          "description": "Output only. Display name of the lab where the device is hosted. If empty, the device is hosted in a Google owned lab."
        },
        "regionCode": {
          "type": "string",
          "description": "Output only. The Unicode country/region code (CLDR) of the lab where the device is hosted, e.g. \"US\" for United States, \"KR\" for South Korea. Empty when the hosting region is not published.",
          "readOnly": true
        }
      },
      "type": "object",
      "description": "The lab hosting a device.",
      "id": "CatalogLabInfo"
    },
    "DeviceRequirement": {
      "id": "DeviceRequirement",
      "properties": {
        "deviceId": {
          "description": "The device ID of a device in the catalog. The device ID is the last part of a device's resource name.",
          "type": "string"
        }
      },
      "type": "object",
      "description": "The requirement of a device."
    },
    "ListLocationsResponse": {
      "id": "ListLocationsResponse",
      "description": "The response message for Locations.ListLocations.",
      "type": "object",
      "properties": {
        "locations": {
          "type": "array",
          "items": {
            "$ref": "Location"
          },
          "description": "A list of locations that matches the specified filter in the request."
        },
        "nextPageToken": {
          "description": "The standard List next-page token.",
          "type": "string"
        }
      }
    },
    "Location": {
      "id": "Location",
      "description": "A resource that represents a Google Cloud location.",
      "properties": {
        "locationId": {
          "description": "The canonical id for this location. For example: `\"us-east1\"`.",
          "type": "string"
        },
        "name": {
          "type": "string",
          "description": "Resource name for the location, which may vary between implementations. For example: `\"projects/example-project/locations/us-east1\"`"
        },
        "metadata": {
          "description": "Service-specific metadata. For example the available capacity at the given location.",
          "additionalProperties": {
            "type": "any",
            "description": "Properties of the object. Contains field @type with type URL."
          },
          "type": "object"
        },
        "displayName": {
          "description": "The friendly name for this location, typically a nearby city name. For example, \"Tokyo\".",
          "type": "string"
        },
        "labels": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Cross-service attributes for the location. For example {\"cloud.googleapis.com/region\": \"us-east1\"}"
        }
      },
      "type": "object"
    }
  },
  "title": "Device Run API",
  "ownerName": "Google",
  "kind": "discovery#restDescription",
  "parameters": {
    "$.xgafv": {
      "location": "query",
      "enum": [
        "1",
        "2"
      ],
      "type": "string",
      "description": "V1 error format.",
      "enumDescriptions": [
        "v1 error format",
        "v2 error format"
      ]
    },
    "oauth_token": {
      "type": "string",
      "location": "query",
      "description": "OAuth 2.0 token for the current user."
    },
    "access_token": {
      "location": "query",
      "description": "OAuth access token.",
      "type": "string"
    },
    "callback": {
      "description": "JSONP",
      "location": "query",
      "type": "string"
    },
    "key": {
      "type": "string",
      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
      "location": "query"
    },
    "prettyPrint": {
      "type": "boolean",
      "description": "Returns response with indentations and line breaks.",
      "default": "true",
      "location": "query"
    },
    "fields": {
      "description": "Selector specifying which fields to include in a partial response.",
      "location": "query",
      "type": "string"
    },
    "uploadType": {
      "location": "query",
      "type": "string",
      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")."
    },
    "quotaUser": {
      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
      "location": "query",
      "type": "string"
    },
    "alt": {
      "default": "json",
      "type": "string",
      "description": "Data format for response.",
      "enum": [
        "json",
        "media",
        "proto"
      ],
      "location": "query",
      "enumDescriptions": [
        "Responses with Content-Type of application/json",
        "Media download with context-dependent Content-Type",
        "Responses with Content-Type of application/x-protobuf"
      ]
    },
    "upload_protocol": {
      "location": "query",
      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
      "type": "string"
    }
  },
  "version_module": true,
  "name": "devicerun",
  "basePath": "",
  "documentationLink": "https://docs.cloud.google.com/developer-device-platform/device-run",
  "ownerDomain": "google.com",
  "auth": {
    "oauth2": {
      "scopes": {
        "https://www.googleapis.com/auth/cloud-platform": {
          "description": "See, edit, configure, and delete your Google Cloud data and see the email address for your Google Account."
        }
      }
    }
  },
  "version": "v1alpha",
  "id": "devicerun:v1alpha",
  "description": "The Device Run API allows management, scheduling, and execution of automated sessions and workloads across device catalogs.",
  "protocol": "rest",
  "revision": "20261001",
  "batchPath": "batch",
  "resources": {
    "projects": {
      "resources": {
        "locations": {
          "methods": {
            "get": {
              "id": "devicerun.projects.locations.get",
              "path": "v1alpha/{+name}",
              "parameters": {
                "name": {
                  "location": "path",
                  "required": true,
                  "pattern": "^projects/[^/]+/locations/[^/]+$",
                  "type": "string",
                  "description": "Resource name for the location."
                }
              },
              "response": {
                "$ref": "Location"
              },
              "parameterOrder": [
                "name"
              ],
              "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}",
              "description": "Gets information about a location.",
              "scopes": [
                "https://www.googleapis.com/auth/cloud-platform"
              ],
              "httpMethod": "GET"
            },
            "list": {
              "description": "Lists information about the supported locations for this service. This method lists locations based on the resource scope provided in the ListLocationsRequest.name field: * **Global locations**: If `name` is empty, the method lists the public locations available to all projects. * **Project-specific locations**: If `name` follows the format `projects/{project}`, the method lists locations visible to that specific project. This includes public, private, or other project-specific locations enabled for the project. For gRPC and client library implementations, the resource name is passed as the `name` field. For direct service calls, the resource name is incorporated into the request path based on the specific service implementation and version.",
              "id": "devicerun.projects.locations.list",
              "flatPath": "v1alpha/projects/{projectsId}/locations",
              "scopes": [
                "https://www.googleapis.com/auth/cloud-platform"
              ],
              "httpMethod": "GET",
              "path": "v1alpha/{+name}/locations",
              "parameterOrder": [
                "name"
              ],
              "parameters": {
                "name": {
                  "required": true,
                  "description": "The resource that owns the locations collection, if applicable.",
                  "location": "path",
                  "pattern": "^projects/[^/]+$",
                  "type": "string"
                },
                "extraLocationTypes": {
                  "location": "query",
                  "repeated": true,
                  "type": "string",
                  "description": "Optional. Do not use this field unless explicitly documented otherwise. This is primarily for internal usage."
                },
                "filter": {
                  "description": "A filter to narrow down results to a preferred subset. The filtering language accepts strings like `\"displayName=tokyo\"`, and is documented in more detail in [AIP-160](https://google.aip.dev/160).",
                  "location": "query",
                  "type": "string"
                },
                "pageToken": {
                  "description": "A page token received from the `next_page_token` field in the response. Send that page token to receive the subsequent page.",
                  "type": "string",
                  "location": "query"
                },
                "pageSize": {
                  "location": "query",
                  "format": "int32",
                  "description": "The maximum number of results to return. If not set, the service selects a default.",
                  "type": "integer"
                }
              },
              "response": {
                "$ref": "ListLocationsResponse"
              }
            }
          },
          "resources": {
            "softwareVersions": {
              "methods": {
                "get": {
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/softwareVersions/{softwareVersionsId}",
                  "id": "devicerun.projects.locations.softwareVersions.get",
                  "path": "v1alpha/{+name}",
                  "httpMethod": "GET",
                  "description": "Returns information about a specific software version.",
                  "parameterOrder": [
                    "name"
                  ],
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "parameters": {
                    "name": {
                      "description": "Required. The name of the software version. Format: `projects/{project}/locations/global/softwareVersions/{software_version}`.",
                      "pattern": "^projects/[^/]+/locations/[^/]+/softwareVersions/[^/]+$",
                      "required": true,
                      "location": "path",
                      "type": "string"
                    }
                  },
                  "response": {
                    "$ref": "CatalogSoftwareVersion"
                  }
                },
                "list": {
                  "parameterOrder": [
                    "parent"
                  ],
                  "description": "Lists all software versions.",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "id": "devicerun.projects.locations.softwareVersions.list",
                  "response": {
                    "$ref": "CatalogListSoftwareVersionsResponse"
                  },
                  "httpMethod": "GET",
                  "parameters": {
                    "pageToken": {
                      "description": "Optional. A page token, received from a previous `ListSoftwareVersions` call. Provide this to receive the subsequent page. When paginating, all other parameters provided to `ListSoftwareVersions` must match the call that provided the page token.",
                      "location": "query",
                      "type": "string"
                    },
                    "parent": {
                      "required": true,
                      "location": "path",
                      "description": "Required. The parent of the collection of software versions. Format: `projects/{project}/locations/global`.",
                      "type": "string",
                      "pattern": "^projects/[^/]+/locations/[^/]+$"
                    },
                    "filter": {
                      "location": "query",
                      "type": "string",
                      "description": "Optional. An AIP-160 (https://google.aip.dev/160) filter expression restricting which software versions are returned. An empty filter returns all software versions. Filtering is supported over the `SoftwareVersion` fields, including nested fields via dot-path. Enum and string values must be double-quoted. Examples: * `software_type = \"ANDROIDX_TEST_ORCHESTRATOR\"` * `software_type = \"ANDROIDX_TEST_ORCHESTRATOR\" AND is_default = true` * `lifecycle.state = \"ACTIVE\"` * `version = \"1.4.1\"`"
                    },
                    "pageSize": {
                      "description": "Optional. The maximum number of software versions to return. The server may return fewer items than this value.",
                      "format": "int32",
                      "type": "integer",
                      "location": "query"
                    }
                  },
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/softwareVersions",
                  "path": "v1alpha/{+parent}/softwareVersions"
                }
              }
            },
            "operations": {
              "methods": {
                "list": {
                  "response": {
                    "$ref": "GoogleLongrunningListOperationsResponse"
                  },
                  "httpMethod": "GET",
                  "parameterOrder": [
                    "name"
                  ],
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns `UNIMPLEMENTED`.",
                  "path": "v1alpha/{+name}/operations",
                  "id": "devicerun.projects.locations.operations.list",
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/operations",
                  "parameters": {
                    "name": {
                      "description": "The name of the operation's parent resource.",
                      "pattern": "^projects/[^/]+/locations/[^/]+$",
                      "required": true,
                      "type": "string",
                      "location": "path"
                    },
                    "returnPartialSuccess": {
                      "location": "query",
                      "description": "When set to `true`, operations that are reachable are returned as normal, and those that are unreachable are returned in the ListOperationsResponse.unreachable field. This can only be `true` when reading across collections. For example, when `parent` is set to `\"projects/example/locations/-\"`. This field is not supported by default and will result in an `UNIMPLEMENTED` error if set unless explicitly documented otherwise in service or product specific documentation.",
                      "type": "boolean"
                    },
                    "pageSize": {
                      "type": "integer",
                      "description": "The standard list page size.",
                      "location": "query",
                      "format": "int32"
                    },
                    "filter": {
                      "type": "string",
                      "description": "The standard list filter.",
                      "location": "query"
                    },
                    "pageToken": {
                      "description": "The standard list page token.",
                      "location": "query",
                      "type": "string"
                    }
                  }
                },
                "get": {
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}",
                  "path": "v1alpha/{+name}",
                  "id": "devicerun.projects.locations.operations.get",
                  "httpMethod": "GET",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "description": "Gets the latest state of a long-running operation. Clients can use this method to poll the operation result at intervals as recommended by the API service.",
                  "parameterOrder": [
                    "name"
                  ],
                  "response": {
                    "$ref": "GoogleLongrunningOperation"
                  },
                  "parameters": {
                    "name": {
                      "location": "path",
                      "required": true,
                      "pattern": "^projects/[^/]+/locations/[^/]+/operations/[^/]+$",
                      "type": "string",
                      "description": "The name of the operation resource."
                    }
                  }
                },
                "delete": {
                  "path": "v1alpha/{+name}",
                  "response": {
                    "$ref": "Empty"
                  },
                  "parameters": {
                    "name": {
                      "type": "string",
                      "location": "path",
                      "description": "The name of the operation resource to be deleted.",
                      "required": true,
                      "pattern": "^projects/[^/]+/locations/[^/]+/operations/[^/]+$"
                    }
                  },
                  "id": "devicerun.projects.locations.operations.delete",
                  "parameterOrder": [
                    "name"
                  ],
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}",
                  "httpMethod": "DELETE",
                  "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ]
                },
                "cancel": {
                  "parameters": {
                    "name": {
                      "required": true,
                      "location": "path",
                      "pattern": "^projects/[^/]+/locations/[^/]+/operations/[^/]+$",
                      "type": "string",
                      "description": "The name of the operation resource to be cancelled."
                    }
                  },
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel",
                  "id": "devicerun.projects.locations.operations.cancel",
                  "request": {
                    "$ref": "GoogleLongrunningCancelOperationRequest"
                  },
                  "path": "v1alpha/{+name}:cancel",
                  "httpMethod": "POST",
                  "response": {
                    "$ref": "Empty"
                  },
                  "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use Operations.GetOperation or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an operation with an Operation.error value with a google.rpc.Status.code of `1`, corresponding to `Code.CANCELLED`.",
                  "parameterOrder": [
                    "name"
                  ]
                }
              }
            },
            "devices": {
              "methods": {
                "get": {
                  "description": "Returns information about a specific device.",
                  "parameterOrder": [
                    "name"
                  ],
                  "path": "v1alpha/{+name}",
                  "parameters": {
                    "name": {
                      "location": "path",
                      "pattern": "^projects/[^/]+/locations/[^/]+/devices/[^/]+$",
                      "required": true,
                      "description": "Required. The name of the device. Format: `projects/{project}/locations/global/devices/{device}`.",
                      "type": "string"
                    }
                  },
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/devices/{devicesId}",
                  "response": {
                    "$ref": "CatalogDevice"
                  },
                  "httpMethod": "GET",
                  "id": "devicerun.projects.locations.devices.get",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ]
                },
                "list": {
                  "httpMethod": "GET",
                  "path": "v1alpha/{+parent}/devices",
                  "id": "devicerun.projects.locations.devices.list",
                  "parameterOrder": [
                    "parent"
                  ],
                  "response": {
                    "$ref": "CatalogListDevicesResponse"
                  },
                  "description": "Lists all devices.",
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/devices",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "parameters": {
                    "pageSize": {
                      "format": "int32",
                      "location": "query",
                      "type": "integer",
                      "description": "Optional. The maximum number of devices to return. The server may return fewer items than this value."
                    },
                    "pageToken": {
                      "location": "query",
                      "type": "string",
                      "description": "Optional. A page token, received from a previous `ListDevices` call. Provide this to receive the subsequent page. When paginating, all other parameters provided to `ListDevices` must match the call that provided the page token."
                    },
                    "filter": {
                      "description": "Optional. An AIP-160 (https://google.aip.dev/160) filter expression restricting which devices are returned. An empty filter returns all devices. Filtering is supported over the `Device` fields, including nested fields via dot-path. Enum and string values must be double-quoted. Examples: * `platform = \"ANDROID\"` * `platform = \"ANDROID\" AND os_version = \"34\"` * `hardware_type = \"PHYSICAL\" AND form_factor = \"PHONE\"` * `android_details.build_type = \"userdebug\"` * `availability.capacity = \"HIGH\"`",
                      "type": "string",
                      "location": "query"
                    },
                    "parent": {
                      "pattern": "^projects/[^/]+/locations/[^/]+$",
                      "description": "Required. The parent of the collection of devices. Format: `projects/{project}/locations/global`.",
                      "location": "path",
                      "required": true,
                      "type": "string"
                    }
                  }
                }
              }
            },
            "sessions": {
              "methods": {
                "create": {
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/sessions",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "parameterOrder": [
                    "parent"
                  ],
                  "request": {
                    "$ref": "Session"
                  },
                  "httpMethod": "POST",
                  "id": "devicerun.projects.locations.sessions.create",
                  "description": "Starts an automation session with the specified configuration. This method returns a long-running `Operation`, awaiting the completion of all jobs in the session.",
                  "parameters": {
                    "sessionId": {
                      "location": "query",
                      "description": "Optional. The ID to use for the session, which will become the final component of the resource name. If not provided, the server will generate a value for this field. When provided, this value must be between 4 and 63 characters, and match the following regex: ^a-z{2,61}[a-z0-9]$.",
                      "type": "string"
                    },
                    "parent": {
                      "location": "path",
                      "type": "string",
                      "required": true,
                      "pattern": "^projects/[^/]+/locations/[^/]+$",
                      "description": "Required. The parent resource where this session will be created. Format: `projects/{project}/locations/{location}`."
                    },
                    "requestId": {
                      "type": "string",
                      "location": "query",
                      "description": "Optional. A unique identifier for this request. This request is only idempotent if a `request_id` is provided, i.e. if a request with the same `request_id` is received, then the previous result will be returned. The server will guarantee that for at least 60 minutes after the first request. The value must be a UUID (e.g., 123e4567-e89b-12d3-a456-426655440000). See github.com/google/uuid for more details."
                    }
                  },
                  "path": "v1alpha/{+parent}/sessions",
                  "response": {
                    "$ref": "GoogleLongrunningOperation"
                  }
                },
                "cancel": {
                  "response": {
                    "$ref": "CancelSessionResponse"
                  },
                  "path": "v1alpha/{+name}:cancel",
                  "parameters": {
                    "name": {
                      "pattern": "^projects/[^/]+/locations/[^/]+/sessions/[^/]+$",
                      "description": "Required. The name of the session. Format: \"projects/{project}/locations/{location}/sessions/{session}\"",
                      "required": true,
                      "type": "string",
                      "location": "path"
                    }
                  },
                  "request": {
                    "$ref": "CancelSessionRequest"
                  },
                  "description": "Cancels an in-progress automation session. This RPC returns immediately and cancellation proceeds asynchronously. If the session is already finished, this RPC will have no effect.",
                  "id": "devicerun.projects.locations.sessions.cancel",
                  "parameterOrder": [
                    "name"
                  ],
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/sessions/{sessionsId}:cancel",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "httpMethod": "POST"
                },
                "delete": {
                  "parameters": {
                    "name": {
                      "description": "Required. The name of the session. Format: `projects/{project}/locations/{location}/sessions/{session}`.",
                      "pattern": "^projects/[^/]+/locations/[^/]+/sessions/[^/]+$",
                      "type": "string",
                      "required": true,
                      "location": "path"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Optional. A unique identifier for this request. This request is only idempotent if a `request_id` is provided, i.e. if a request with the same `request_id` is received, then the previous result will be returned. The server will guarantee that for at least 60 minutes after the first request. The value must be a UUID (e.g., 123e4567-e89b-12d3-a456-426655440000). See github.com/google/uuid for more details.",
                      "location": "query"
                    }
                  },
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/sessions/{sessionsId}",
                  "id": "devicerun.projects.locations.sessions.delete",
                  "parameterOrder": [
                    "name"
                  ],
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "response": {
                    "$ref": "GoogleLongrunningOperation"
                  },
                  "description": "Deletes a session. This RPC returns immediately and deletion proceeds asynchronously. It will cancel the session at first if it is still running.",
                  "path": "v1alpha/{+name}",
                  "httpMethod": "DELETE"
                },
                "list": {
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/sessions",
                  "id": "devicerun.projects.locations.sessions.list",
                  "path": "v1alpha/{+parent}/sessions",
                  "parameters": {
                    "orderBy": {
                      "type": "string",
                      "location": "query",
                      "description": "Optional. The order to sort results by. Supported values: `name`, `name desc`, `create_time`, `create_time desc`. Values must use the snake_case field name; `createTime` is not accepted. Ordering by `create_time` is not supported when listing across all locations (`locations/-`). If unspecified, results are returned in an unspecified order."
                    },
                    "parent": {
                      "pattern": "^projects/[^/]+/locations/[^/]+$",
                      "type": "string",
                      "required": true,
                      "description": "Required. Parent value for ListSessionsRequest The parent of the collection of sessions. Format: `projects/{project}/locations/{location}`.",
                      "location": "path"
                    },
                    "pageSize": {
                      "description": "Optional. The maximum number of sessions to return. The server may return fewer items than this value. If unspecified, at most 500 sessions will be returned. The maximum value is 1000, values above will be coerced to 1000.",
                      "format": "int32",
                      "type": "integer",
                      "location": "query"
                    },
                    "filter": {
                      "description": "Optional. The raw filter text to constrain the results.",
                      "location": "query",
                      "type": "string"
                    },
                    "view": {
                      "location": "query",
                      "enumDescriptions": [
                        "The default / unset value. The API will default to the BASIC view.",
                        "Include basic view of the session but not the full contents. Only the uid/display_name/status/result of the session and its jobs/executions will be included. This is the default value (for GetSession).",
                        "Include everything."
                      ],
                      "type": "string",
                      "description": "Optional. The view of the sessions to return. If not set, the `BASIC` view will be returned.",
                      "enum": [
                        "SESSION_VIEW_UNSPECIFIED",
                        "SESSION_VIEW_BASIC",
                        "SESSION_VIEW_FULL"
                      ]
                    },
                    "pageToken": {
                      "location": "query",
                      "description": "Optional. A page token, received from a previous `ListSessions` call. Provide this to receive the subsequent page. When paginating, all other parameters provided to `ListSessions` must match the call that provided the page token.",
                      "type": "string"
                    }
                  },
                  "description": "Lists previously created automation sessions. Sessions may still be in-progress, or may have finished successfully, or unsuccessfully.",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "httpMethod": "GET",
                  "parameterOrder": [
                    "parent"
                  ],
                  "response": {
                    "$ref": "ListSessionsResponse"
                  }
                },
                "get": {
                  "httpMethod": "GET",
                  "flatPath": "v1alpha/projects/{projectsId}/locations/{locationsId}/sessions/{sessionsId}",
                  "id": "devicerun.projects.locations.sessions.get",
                  "parameterOrder": [
                    "name"
                  ],
                  "path": "v1alpha/{+name}",
                  "scopes": [
                    "https://www.googleapis.com/auth/cloud-platform"
                  ],
                  "parameters": {
                    "name": {
                      "pattern": "^projects/[^/]+/locations/[^/]+/sessions/[^/]+$",
                      "required": true,
                      "location": "path",
                      "type": "string",
                      "description": "Required. The name of the session. Format: `projects/{project}/locations/{location}/sessions/{session}`."
                    },
                    "view": {
                      "location": "query",
                      "description": "Optional. The view of the session to return. If not set, the default BASIC view will be returned.",
                      "enumDescriptions": [
                        "The default / unset value. The API will default to the BASIC view.",
                        "Include basic view of the session but not the full contents. Only the uid/display_name/status/result of the session and its jobs/executions will be included. This is the default value (for GetSession).",
                        "Include everything."
                      ],
                      "type": "string",
                      "enum": [
                        "SESSION_VIEW_UNSPECIFIED",
                        "SESSION_VIEW_BASIC",
                        "SESSION_VIEW_FULL"
                      ]
                    }
                  },
                  "description": "Returns information about a previously created automation session.",
                  "response": {
                    "$ref": "Session"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "fullyEncodeReservedExpansion": true,
  "rootUrl": "https://devicerun.googleapis.com/",
  "baseUrl": "https://devicerun.googleapis.com/",
  "icons": {
    "x16": "http://www.google.com/images/icons/product/search-16.gif",
    "x32": "http://www.google.com/images/icons/product/search-32.gif"
  },
  "discoveryVersion": "v1",
  "canonicalName": "Device Run"
}
