docs: update docs (#916)

* fix: re-run script

* test: fix noxfile
diff --git a/docs/dyn/toolresults_v1beta3.steps.html b/docs/dyn/toolresults_v1beta3.steps.html
index bb9a051..34a68fa 100644
--- a/docs/dyn/toolresults_v1beta3.steps.html
+++ b/docs/dyn/toolresults_v1beta3.steps.html
@@ -148,28 +148,16 @@
             # have the same SuggestionPriority and belong to the same SuggestionCategory.
             # Suggestions with the same screenshot URL should be adjacent.
           {
-            "title": "A String", # General title for the suggestion, in the user's language, without markup.
-                # Always set.
-            "priority": "A String", # Relative importance of a suggestion.
-                # Always set.
-            "resourceName": "A String", # Reference to a view element, identified by its resource name, if it has
-                # one.
-            "secondaryPriority": 3.14, # Relative importance of a suggestion as compared with other suggestions
-                # that have the same priority and category.
-                # This is a meaningless value that can be used to order suggestions that are
-                # in the same category and have the same priority.
-                # The larger values have higher priority (i.e., are more important).
-                # Optional.
             "region": { # A rectangular region. # Region within the screenshot that is relevant to this suggestion.
                 # Optional.
-              "leftPx": 42, # The left side of the rectangle, in pixels.
-                  # Always set.
               "topPx": 42, # The top of the rectangle, in pixels.
                   # Always set.
               "heightPx": 42, # The height, in pixels.
                   # Always set.
               "widthPx": 42, # The width, in pixels.
                   # Always set.
+              "leftPx": 42, # The left side of the rectangle, in pixels.
+                  # Always set.
             },
             "pseudoResourceId": "A String", # A somewhat human readable identifier of the source view, if it does not
                 # have a resource_name. This is a path within the accessibility hierarchy,
@@ -206,6 +194,18 @@
                 # It is used for getting the corresponding screenshot path. For example,
                 # screen_id "1" corresponds to "1.png" file in GCS.
                 # Always set.
+            "title": "A String", # General title for the suggestion, in the user's language, without markup.
+                # Always set.
+            "priority": "A String", # Relative importance of a suggestion.
+                # Always set.
+            "resourceName": "A String", # Reference to a view element, identified by its resource name, if it has
+                # one.
+            "secondaryPriority": 3.14, # Relative importance of a suggestion as compared with other suggestions
+                # that have the same priority and category.
+                # This is a meaningless value that can be used to order suggestions that are
+                # in the same category and have the same priority.
+                # The larger values have higher priority (i.e., are more important).
+                # Optional.
           },
         ],
         "category": "A String", # Category in which these types of suggestions should appear.
@@ -241,12 +241,858 @@
     The object takes the form of:
 
 { # A Step represents a single operation performed as part of
+    # Execution. A step can be used to represent the execution of a tool (
+    # for example a test runner execution or an execution of a compiler).
+    # 
+    # Steps can overlap (for instance two steps might have the same
+    # start time if some operations are done in parallel).
+    # 
+    # Here is an example, let's consider that we have a continuous build is
+    # executing a test runner for each iteration. The workflow would look like:
+    # - user creates a Execution with id 1
+    # - user creates an TestExecutionStep with id 100 for Execution 1
+    # - user update TestExecutionStep with id 100 to add a raw xml log
+    #     + the service parses the xml logs and returns a TestExecutionStep with
+    #      updated TestResult(s).
+    # - user update the status of TestExecutionStep with id 100 to COMPLETE
+    # 
+    # A Step can be updated until its state is set to COMPLETE at which
+    # points it becomes immutable.
+    # 
+    # Next tag: 27
+  "state": "A String", # The initial state is IN_PROGRESS.
+      # The only legal state transitions are
+      # * IN_PROGRESS -> COMPLETE
+      # 
+      # A PRECONDITION_FAILED will be returned if an invalid transition is
+      # requested.
+      # 
+      # It is valid to create Step with a state set to COMPLETE.
+      # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
+      # returned if the state is set to COMPLETE multiple times.
+      # 
+      # - In response: always set
+      # - In create/update request: optional
+  "name": "A String", # A short human-readable name to display in the UI.
+      # Maximum of 100 characters.
+      # For example: Clean build
+      # 
+      # A PRECONDITION_FAILED will be returned upon creating a new step if it
+      # shares its name and dimension_value with an existing step. If two steps
+      # represent a similar action, but have different dimension values, they
+      # should share the same name. For instance, if the same set of tests is
+      # run on two different platforms, the two steps should have the same name.
+      # 
+      # - In response: always set
+      # - In create request: always set
+      # - In update request: never set
+  "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
+      # then this field allows the child to specify the values of the dimensions.
+      # 
+      # The keys must exactly match the dimension_definition of the execution.
+      # 
+      # For example, if the execution has
+      # `dimension_definition = ['attempt', 'device']`
+      # then a step must define values for those dimensions, eg.
+      # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
+      # 
+      # If a step does not participate in one dimension of the matrix,
+      # the value for that dimension should be empty string.
+      # For example, if one of the tests is executed by a runner which
+      # does not support retries, the step could have
+      # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
+      # 
+      # If the step does not participate in any dimensions of the matrix,
+      # it may leave dimension_value unset.
+      # 
+      # A PRECONDITION_FAILED will be returned if any of the keys do not exist
+      # in the dimension_definition of the execution.
+      # 
+      # A PRECONDITION_FAILED will be returned if another step in this execution
+      # already has the same name and dimension_value, but differs on other data
+      # fields, for example, step field is different.
+      # 
+      # A PRECONDITION_FAILED will be returned if dimension_value is set, and
+      # there is a dimension_definition in the execution which is not specified
+      # as one of the keys.
+      # 
+      # - In response: present if set by create
+      # - In create request: optional
+      # - In update request: never set
+    {
+      "key": "A String",
+      "value": "A String",
+    },
+  ],
+  "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
+      # 
+      # This value will be set automatically when state transitions to
+      # COMPLETE.
+      # 
+      # - In response: set if the execution state is COMPLETE.
+      # - In create/update request: never set
+      # calendar, encoded as a count of seconds and fractions of seconds at
+      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+      # January 1, 1970, in the proleptic Gregorian calendar which extends the
+      # Gregorian calendar backwards to year one.
+      #
+      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+      # second table is needed for interpretation, using a [24-hour linear
+      # smear](https://developers.google.com/time/smear).
+      #
+      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+      # restricting to that range, we ensure that we can convert to and from [RFC
+      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+        # second values with fractions must still have non-negative nanos values
+        # that count forward in time. Must be from 0 to 999,999,999
+        # inclusive.
+    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
+        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+        # 9999-12-31T23:59:59Z inclusive.
+  },
+  "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
+      # These details can be used identify which group this step is part of.
+      # It also identifies the groups 'primary step' which indexes all the group
+      # members.
+      # 
+      # - In response: present if previously set.
+      # - In create request: optional, set iff this step was performed more than
+      # once.
+      # - In update request: optional
+    "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
+        # outcome of each individual step.
+      "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
+          # configuration as a group.
+      "individualOutcome": [ # Step Id and outcome of each individual step.
+        { # Step Id and outcome of each individual step that was run as a group with
+            # other steps with the same configuration.
+          "multistepNumber": 42, # Unique int given to each step.
+              # Ranges from 0(inclusive) to total number of steps(exclusive).
+              # The primary step is 0.
+          "outcomeSummary": "A String",
+          "runDuration": { #  # How long it took for this step to run.
+              # A Duration represents a signed, fixed-length span of time represented
+              # as a count of seconds and fractions of seconds at nanosecond
+              # resolution. It is independent of any calendar and concepts like "day"
+              # or "month". It is related to Timestamp in that the difference between
+              # two Timestamp values is a Duration and it can be added or subtracted
+              # from a Timestamp. Range is approximately +-10,000 years.
+            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+                # of time. Durations less than one second are represented with a 0
+                # `seconds` field and a positive or negative `nanos` field. For durations
+                # of one second or more, a non-zero value for the `nanos` field must be
+                # of the same sign as the `seconds` field. Must be from -999,999,999
+                # to +999,999,999 inclusive.
+          },
+          "stepId": "A String",
+        },
+      ],
+    },
+    "multistepNumber": 42, # Unique int given to each step.
+        # Ranges from 0(inclusive) to total number of steps(exclusive).
+        # The primary step is 0.
+    "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
+  },
+  "stepId": "A String", # A unique identifier within a Execution for this Step.
+      # 
+      # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
+      # 
+      # - In response: always set
+      # - In create/update request: never set
+  "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
+      # 
+      # - In response: present if set by create/update request
+      # - In create/update request: optional
+    "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
+        #
+        # Returns INVALID_ARGUMENT if this field is set
+        # but the summary is not SUCCESS.
+        #
+        # Optional
+        # LINT.IfChange
+      "otherNativeCrash": True or False, # If a native process other than the app crashed.
+    },
+    "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
+        #
+        # Returns INVALID_ARGUMENT if this field is set
+        # but the summary is not SKIPPED.
+        #
+        # Optional
+      "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
+      "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
+      "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
+    },
+    "summary": "A String", # The simplest way to interpret a result.
+        #
+        # Required
+    "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
+        #
+        # Returns INVALID_ARGUMENT if this field is set
+        # but the summary is not FAILURE.
+        #
+        # Optional
+      "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
+      "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
+          # start.
+      "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
+          # This might be caused by trying to run a test on an unsupported platform.
+      "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
+      "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
+    },
+    "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
+        #
+        # Returns INVALID_ARGUMENT if this field is set
+        # but the summary is not INCONCLUSIVE.
+        #
+        # Optional
+      "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
+          # infrastructure failures
+      "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
+          # depends on a component other than the system under test which failed.
+          #
+          # For example, a mobile test requires provisioning a device where the test
+          # executes, and that provisioning can fail.
+      "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
+          # determined.
+          # For example, the user pressed ctrl-c which sent a kill signal to the test
+          # runner while the test was running.
+    },
+  },
+  "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
+      # For example: running cp to copy artifacts from one location to another.
+    "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
+        #
+        # - In response: present if set by create/update request
+        # - In create/update request: optional
+        # copying artifacts or deploying code.
+      "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
+          # argv in a C program).
+          #
+          # - In response: present if set by create request
+          # - In create request: optional
+          # - In update request: never set
+        "A String",
+      ],
+      "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+          # exited.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, a FAILED_PRECONDITION error will be
+          #   returned if an exit_code is already set.
+        "number": 42, # Tool execution exit code. A value of 0 means that the execution was
+            # successful.
+            #
+            # - In response: always set
+            # - In create/update request: always set
+      },
+      "toolLogs": [ # References to any plain text logs output the tool execution.
+          #
+          # This field can be set before the tool has exited in order to be able to
+          # have access to a live view of the logs while the tool is running.
+          #
+          # The maximum allowed number of tool logs per step is 1000.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, any value provided will be appended to the
+          #   existing list
+        { # A reference to a file.
+          "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
+              #
+              # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+              # or in gsutil format: gs://mybucket/path/to/test.xml
+              # with version-specific info,
+              # gs://mybucket/path/to/test.xml#1360383693690000
+              #
+              # An INVALID_ARGUMENT error will be returned if the URI format is not
+              # supported.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+      ],
+      "toolOutputs": [ # References to opaque files of any format output by the tool execution.
+          #
+          # The maximum allowed number of tool outputs per step is 1000.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, any value provided will be appended to the
+          #   existing list
+        { # A reference to a ToolExecution output file.
+          "testCase": { # A reference to a test case. # The test case to which this output file belongs.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              #
+              # Test case references are canonically ordered lexicographically by these three
+              # factors:
+              # * First, by test_suite_name.
+              # * Second, by class_name.
+              # * Third, by name.
+            "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
+            "className": "A String", # The name of the class.
+            "name": "A String", # The name of the test case.
+                #
+                # Required.
+          },
+          "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              # calendar, encoded as a count of seconds and fractions of seconds at
+              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+              # January 1, 1970, in the proleptic Gregorian calendar which extends the
+              # Gregorian calendar backwards to year one.
+              #
+              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+              # second table is needed for interpretation, using a [24-hour linear
+              # smear](https://developers.google.com/time/smear).
+              #
+              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+              # restricting to that range, we ensure that we can convert to and from [RFC
+              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                # second values with fractions must still have non-negative nanos values
+                # that count forward in time. Must be from 0 to 999,999,999
+                # inclusive.
+            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
+                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                # 9999-12-31T23:59:59Z inclusive.
+          },
+          "output": { # A reference to a file. # A FileReference to an output file.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+            "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        },
+      ],
+    },
+  },
+  "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
+      # 
+      # This is the device usage used for billing purpose, which is different from
+      # the run_duration, for example, infrastructure failure won't be charged for
+      # device usage.
+      # 
+      # PRECONDITION_FAILED will be returned if one attempts to set a
+      # device_usage on a step which already has this field set.
+      # 
+      # - In response: present if previously set.
+      # - In create request: optional
+      # - In update request: optional
+      # A Duration represents a signed, fixed-length span of time represented
+      # as a count of seconds and fractions of seconds at nanosecond
+      # resolution. It is independent of any calendar and concepts like "day"
+      # or "month". It is related to Timestamp in that the difference between
+      # two Timestamp values is a Duration and it can be added or subtracted
+      # from a Timestamp. Range is approximately +-10,000 years.
+    "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+    "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+        # of time. Durations less than one second are represented with a 0
+        # `seconds` field and a positive or negative `nanos` field. For durations
+        # of one second or more, a non-zero value for the `nanos` field must be
+        # of the same sign as the `seconds` field. Must be from -999,999,999
+        # to +999,999,999 inclusive.
+  },
+  "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
+      # step.
+      # 
+      # Users are responsible for managing the key namespace such that keys
+      # don't accidentally collide.
+      # 
+      # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
+      # if the length of any of the keys or values exceeds 100 characters.
+      # 
+      # - In response: always set
+      # - In create request: optional
+      # - In update request: optional; any new key/value pair will be added to the
+      #   map, and any new value for an existing key will update that key's value
+    {
+      "key": "A String",
+      "value": "A String",
+    },
+  ],
+  "hasImages": True or False, # Whether any of the outputs of this step are images whose
+      # thumbnails can be fetched with ListThumbnails.
+      # 
+      # - In response: always set
+      # - In create/update request: never set
+  "runDuration": { #  # How long it took for this step to run.
+      # 
+      # If unset, this is set to the difference between creation_time and
+      # completion_time when the step is set to the COMPLETE state. In some cases,
+      # it is appropriate to set this value separately: For instance, if a step is
+      # created, but the operation it represents is queued for a few minutes before
+      # it executes, it would be appropriate not to include the time spent queued
+      # in its run_duration.
+      # 
+      # PRECONDITION_FAILED will be returned if one attempts to set a
+      # run_duration on a step which already has this field set.
+      # 
+      # - In response: present if previously set; always present on COMPLETE step
+      # - In create request: optional
+      # - In update request: optional
+      # A Duration represents a signed, fixed-length span of time represented
+      # as a count of seconds and fractions of seconds at nanosecond
+      # resolution. It is independent of any calendar and concepts like "day"
+      # or "month". It is related to Timestamp in that the difference between
+      # two Timestamp values is a Duration and it can be added or subtracted
+      # from a Timestamp. Range is approximately +-10,000 years.
+    "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+    "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+        # of time. Durations less than one second are represented with a 0
+        # `seconds` field and a positive or negative `nanos` field. For durations
+        # of one second or more, a non-zero value for the `nanos` field must be
+        # of the same sign as the `seconds` field. Must be from -999,999,999
+        # to +999,999,999 inclusive.
+  },
+  "description": "A String", # A description of this tool
+      # For example: mvn clean package -D skipTests=true
+      # 
+      # - In response: present if set by create/update request
+      # - In create/update request: optional
+  "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
+      #
+      # It accepts ant-junit xml files which will be parsed into structured test
+      # results by the service. Xml file paths are updated in order to append more
+      # files, however they can't be deleted.
+      #
+      # Users can also add test results manually by using the test_result field.
+    "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
+        # log by server, or uploaded directly by user. This references should only be
+        # called when test suites are fully parsed or uploaded.
+        #
+        # The maximum allowed number of test suite overviews per step is 1000.
+        #
+        # - In response: always set
+        # - In create request: optional
+        # - In update request: never (use publishXunitXmlFiles custom method instead)
+      { # A summary of a test suite result either parsed from XML or uploaded
+          # directly by a user.
+          #
+          # Note: the API related comments are for StepService only. This message is
+          # also being used in ExecutionService in a read only mode for the corresponding
+          # step.
+        "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
+            # xml_source. May also be set by the user.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        "name": "A String", # The name of the test suite.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        "elapsedTime": { #  # Elapsed time of test suite.
+            # A Duration represents a signed, fixed-length span of time represented
+            # as a count of seconds and fractions of seconds at nanosecond
+            # resolution. It is independent of any calendar and concepts like "day"
+            # or "month". It is related to Timestamp in that the difference between
+            # two Timestamp values is a Duration and it can be added or subtracted
+            # from a Timestamp. Range is approximately +-10,000 years.
+          "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+          "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+              # of time. Durations less than one second are represented with a 0
+              # `seconds` field and a positive or negative `nanos` field. For durations
+              # of one second or more, a non-zero value for the `nanos` field must be
+              # of the same sign as the `seconds` field. Must be from -999,999,999
+              # to +999,999,999 inclusive.
+        },
+        "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
+            # attempts.
+            #
+            # Present only for rollup test suite overview at environment level. A step
+            # cannot have flaky test cases.
+        "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
+            # xml_source.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        "totalCount": 42, # Number of test cases, typically set by the service by parsing the
+            # xml_source.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
+            # xml_source.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
+            # XML file is stored.
+            #
+            # Note: Multiple test suites can share the same xml_source
+            #
+            # Returns INVALID_ARGUMENT if the uri format is not supported.
+            #
+            # - In create/response: optional
+            # - In update request: never
+          "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
+              #
+              # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+              # or in gsutil format: gs://mybucket/path/to/test.xml
+              # with version-specific info,
+              # gs://mybucket/path/to/test.xml#1360383693690000
+              #
+              # An INVALID_ARGUMENT error will be returned if the URI format is not
+              # supported.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+      },
+    ],
+    "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
+        #
+        # - In response: present if set by create or update
+        # - In create/update request: optional
+      "testProcessDuration": { #  # How long it took to run the test process.
+          #
+          # - In response: present if previously set.
+          # - In create/update request: optional
+          # A Duration represents a signed, fixed-length span of time represented
+          # as a count of seconds and fractions of seconds at nanosecond
+          # resolution. It is independent of any calendar and concepts like "day"
+          # or "month". It is related to Timestamp in that the difference between
+          # two Timestamp values is a Duration and it can be added or subtracted
+          # from a Timestamp. Range is approximately +-10,000 years.
+        "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+        "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+            # of time. Durations less than one second are represented with a 0
+            # `seconds` field and a positive or negative `nanos` field. For durations
+            # of one second or more, a non-zero value for the `nanos` field must be
+            # of the same sign as the `seconds` field. Must be from -999,999,999
+            # to +999,999,999 inclusive.
+      },
+    },
+    "testIssues": [ # Issues observed during the test execution.
+        #
+        # For example, if the mobile app under test crashed during the test,
+        # the error message and the stack trace content can be recorded here
+        # to assist debugging.
+        #
+        # - In response: present if set by create or update
+        # - In create/update request: optional
+      { # An issue detected occurring during a test execution.
+        "warning": { #  # Warning message with additional details of the issue.
+            # Should always be a message from com.google.devtools.toolresults.v1.warnings
+            # `Any` contains an arbitrary serialized protocol buffer message along with a
+            # URL that describes the type of the serialized message.
+            #
+            # Protobuf library provides support to pack/unpack Any values in the form
+            # of utility functions or additional generated methods of the Any type.
+            #
+            # Example 1: Pack and unpack a message in C++.
+            #
+            #     Foo foo = ...;
+            #     Any any;
+            #     any.PackFrom(foo);
+            #     ...
+            #     if (any.UnpackTo(&foo)) {
+            #       ...
+            #     }
+            #
+            # Example 2: Pack and unpack a message in Java.
+            #
+            #     Foo foo = ...;
+            #     Any any = Any.pack(foo);
+            #     ...
+            #     if (any.is(Foo.class)) {
+            #       foo = any.unpack(Foo.class);
+            #     }
+            #
+            #  Example 3: Pack and unpack a message in Python.
+            #
+            #     foo = Foo(...)
+            #     any = Any()
+            #     any.Pack(foo)
+            #     ...
+            #     if any.Is(Foo.DESCRIPTOR):
+            #       any.Unpack(foo)
+            #       ...
+            #
+            #  Example 4: Pack and unpack a message in Go
+            #
+            #      foo := &pb.Foo{...}
+            #      any, err := ptypes.MarshalAny(foo)
+            #      ...
+            #      foo := &pb.Foo{}
+            #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
+            #        ...
+            #      }
+            #
+            # The pack methods provided by protobuf library will by default use
+            # 'type.googleapis.com/full.type.name' as the type URL and the unpack
+            # methods only use the fully qualified type name after the last '/'
+            # in the type URL, for example "foo.bar.com/x/y.z" will yield type
+            # name "y.z".
+            #
+            #
+            # # JSON
+            #
+            # The JSON representation of an `Any` value uses the regular
+            # representation of the deserialized, embedded message, with an
+            # additional field `@type` which contains the type URL. Example:
+            #
+            #     package google.profile;
+            #     message Person {
+            #       string first_name = 1;
+            #       string last_name = 2;
+            #     }
+            #
+            #     {
+            #       "@type": "type.googleapis.com/google.profile.Person",
+            #       "firstName": <string>,
+            #       "lastName": <string>
+            #     }
+            #
+            # If the embedded message type is well-known and has a custom JSON
+            # representation, that representation will be embedded adding a field
+            # `value` which holds the custom JSON in addition to the `@type`
+            # field. Example (for message google.protobuf.Duration):
+            #
+            #     {
+            #       "@type": "type.googleapis.com/google.protobuf.Duration",
+            #       "value": "1.212s"
+            #     }
+          "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
+          "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
+              # protocol buffer message. This string must contain at least
+              # one "/" character. The last segment of the URL's path must represent
+              # the fully qualified name of the type (as in
+              # `path/google.protobuf.Duration`). The name should be in a canonical form
+              # (e.g., leading "." is not accepted).
+              #
+              # In practice, teams usually precompile into the binary all types that they
+              # expect it to use in the context of Any. However, for URLs which use the
+              # scheme `http`, `https`, or no scheme, one can optionally set up a type
+              # server that maps type URLs to message definitions as follows:
+              #
+              # * If no scheme is provided, `https` is assumed.
+              # * An HTTP GET on the URL must yield a google.protobuf.Type
+              #   value in binary format, or produce an error.
+              # * Applications are allowed to cache lookup results based on the
+              #   URL, or have them precompiled into a binary to avoid any
+              #   lookup. Therefore, binary compatibility needs to be preserved
+              #   on changes to types. (Use versioned type names to manage
+              #   breaking changes.)
+              #
+              # Note: this functionality is not currently available in the official
+              # protobuf release, and it is not used for type URLs beginning with
+              # type.googleapis.com.
+              #
+              # Schemes other than `http`, `https` (or the empty scheme) might be
+              # used with implementation specific semantics.
+        },
+        "severity": "A String", # Severity of issue.
+            # Required.
+        "stackTrace": { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
+          "exception": "A String", # The stack trace message.
+              #
+              # Required
+        },
+        "type": "A String", # Type of issue.
+            # Required.
+        "errorMessage": "A String", # A brief human-readable message describing the issue.
+            # Required.
+        "category": "A String", # Category of issue.
+            # Required.
+      },
+    ],
+    "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
+        #
+        # The exit code of this tool will be used to determine if the test passed.
+        #
+        # - In response: always set
+        # - In create/update request: optional
+        # copying artifacts or deploying code.
+      "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
+          # argv in a C program).
+          #
+          # - In response: present if set by create request
+          # - In create request: optional
+          # - In update request: never set
+        "A String",
+      ],
+      "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+          # exited.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, a FAILED_PRECONDITION error will be
+          #   returned if an exit_code is already set.
+        "number": 42, # Tool execution exit code. A value of 0 means that the execution was
+            # successful.
+            #
+            # - In response: always set
+            # - In create/update request: always set
+      },
+      "toolLogs": [ # References to any plain text logs output the tool execution.
+          #
+          # This field can be set before the tool has exited in order to be able to
+          # have access to a live view of the logs while the tool is running.
+          #
+          # The maximum allowed number of tool logs per step is 1000.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, any value provided will be appended to the
+          #   existing list
+        { # A reference to a file.
+          "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
+              #
+              # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+              # or in gsutil format: gs://mybucket/path/to/test.xml
+              # with version-specific info,
+              # gs://mybucket/path/to/test.xml#1360383693690000
+              #
+              # An INVALID_ARGUMENT error will be returned if the URI format is not
+              # supported.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+      ],
+      "toolOutputs": [ # References to opaque files of any format output by the tool execution.
+          #
+          # The maximum allowed number of tool outputs per step is 1000.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, any value provided will be appended to the
+          #   existing list
+        { # A reference to a ToolExecution output file.
+          "testCase": { # A reference to a test case. # The test case to which this output file belongs.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              #
+              # Test case references are canonically ordered lexicographically by these three
+              # factors:
+              # * First, by test_suite_name.
+              # * Second, by class_name.
+              # * Third, by name.
+            "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
+            "className": "A String", # The name of the class.
+            "name": "A String", # The name of the test case.
+                #
+                # Required.
+          },
+          "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              # calendar, encoded as a count of seconds and fractions of seconds at
+              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+              # January 1, 1970, in the proleptic Gregorian calendar which extends the
+              # Gregorian calendar backwards to year one.
+              #
+              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+              # second table is needed for interpretation, using a [24-hour linear
+              # smear](https://developers.google.com/time/smear).
+              #
+              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+              # restricting to that range, we ensure that we can convert to and from [RFC
+              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                # second values with fractions must still have non-negative nanos values
+                # that count forward in time. Must be from 0 to 999,999,999
+                # inclusive.
+            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
+                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                # 9999-12-31T23:59:59Z inclusive.
+          },
+          "output": { # A reference to a file. # A FileReference to an output file.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+            "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        },
+      ],
+    },
+  },
+  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
+      # 
+      # - In response: always set
+      # - In create/update request: never set
+      # calendar, encoded as a count of seconds and fractions of seconds at
+      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+      # January 1, 1970, in the proleptic Gregorian calendar which extends the
+      # Gregorian calendar backwards to year one.
+      #
+      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+      # second table is needed for interpretation, using a [24-hour linear
+      # smear](https://developers.google.com/time/smear).
+      #
+      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+      # restricting to that range, we ensure that we can convert to and from [RFC
+      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+        # second values with fractions must still have non-negative nanos values
+        # that count forward in time. Must be from 0 to 999,999,999
+        # inclusive.
+    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
+        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+        # 9999-12-31T23:59:59Z inclusive.
+  },
+}
+
+  requestId: string, A unique request ID for server to detect duplicated requests.
+For example, a UUID.
+
+Optional, but strongly recommended.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A Step represents a single operation performed as part of
       # Execution. A step can be used to represent the execution of a tool (
       # for example a test runner execution or an execution of a compiler).
-      # 
+      #
       # Steps can overlap (for instance two steps might have the same
       # start time if some operations are done in parallel).
-      # 
+      #
       # Here is an example, let's consider that we have a continuous build is
       # executing a test runner for each iteration. The workflow would look like:
       # - user creates a Execution with id 1
@@ -255,28 +1101,400 @@
       #     + the service parses the xml logs and returns a TestExecutionStep with
       #      updated TestResult(s).
       # - user update the status of TestExecutionStep with id 100 to COMPLETE
-      # 
+      #
       # A Step can be updated until its state is set to COMPLETE at which
       # points it becomes immutable.
-      # 
+      #
       # Next tag: 27
+    "state": "A String", # The initial state is IN_PROGRESS.
+        # The only legal state transitions are
+        # * IN_PROGRESS -> COMPLETE
+        #
+        # A PRECONDITION_FAILED will be returned if an invalid transition is
+        # requested.
+        #
+        # It is valid to create Step with a state set to COMPLETE.
+        # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
+        # returned if the state is set to COMPLETE multiple times.
+        #
+        # - In response: always set
+        # - In create/update request: optional
+    "name": "A String", # A short human-readable name to display in the UI.
+        # Maximum of 100 characters.
+        # For example: Clean build
+        #
+        # A PRECONDITION_FAILED will be returned upon creating a new step if it
+        # shares its name and dimension_value with an existing step. If two steps
+        # represent a similar action, but have different dimension values, they
+        # should share the same name. For instance, if the same set of tests is
+        # run on two different platforms, the two steps should have the same name.
+        #
+        # - In response: always set
+        # - In create request: always set
+        # - In update request: never set
+    "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
+        # then this field allows the child to specify the values of the dimensions.
+        #
+        # The keys must exactly match the dimension_definition of the execution.
+        #
+        # For example, if the execution has
+        # `dimension_definition = ['attempt', 'device']`
+        # then a step must define values for those dimensions, eg.
+        # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
+        #
+        # If a step does not participate in one dimension of the matrix,
+        # the value for that dimension should be empty string.
+        # For example, if one of the tests is executed by a runner which
+        # does not support retries, the step could have
+        # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
+        #
+        # If the step does not participate in any dimensions of the matrix,
+        # it may leave dimension_value unset.
+        #
+        # A PRECONDITION_FAILED will be returned if any of the keys do not exist
+        # in the dimension_definition of the execution.
+        #
+        # A PRECONDITION_FAILED will be returned if another step in this execution
+        # already has the same name and dimension_value, but differs on other data
+        # fields, for example, step field is different.
+        #
+        # A PRECONDITION_FAILED will be returned if dimension_value is set, and
+        # there is a dimension_definition in the execution which is not specified
+        # as one of the keys.
+        #
+        # - In response: present if set by create
+        # - In create request: optional
+        # - In update request: never set
+      {
+        "key": "A String",
+        "value": "A String",
+      },
+    ],
+    "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
+        #
+        # This value will be set automatically when state transitions to
+        # COMPLETE.
+        #
+        # - In response: set if the execution state is COMPLETE.
+        # - In create/update request: never set
+        # calendar, encoded as a count of seconds and fractions of seconds at
+        # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+        # January 1, 1970, in the proleptic Gregorian calendar which extends the
+        # Gregorian calendar backwards to year one.
+        #
+        # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+        # second table is needed for interpretation, using a [24-hour linear
+        # smear](https://developers.google.com/time/smear).
+        #
+        # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+        # restricting to that range, we ensure that we can convert to and from [RFC
+        # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+      "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+          # second values with fractions must still have non-negative nanos values
+          # that count forward in time. Must be from 0 to 999,999,999
+          # inclusive.
+      "seconds": "A String", # Represents seconds of UTC time since Unix epoch
+          # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+          # 9999-12-31T23:59:59Z inclusive.
+    },
+    "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
+        # These details can be used identify which group this step is part of.
+        # It also identifies the groups 'primary step' which indexes all the group
+        # members.
+        #
+        # - In response: present if previously set.
+        # - In create request: optional, set iff this step was performed more than
+        # once.
+        # - In update request: optional
+      "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
+          # outcome of each individual step.
+        "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
+            # configuration as a group.
+        "individualOutcome": [ # Step Id and outcome of each individual step.
+          { # Step Id and outcome of each individual step that was run as a group with
+              # other steps with the same configuration.
+            "multistepNumber": 42, # Unique int given to each step.
+                # Ranges from 0(inclusive) to total number of steps(exclusive).
+                # The primary step is 0.
+            "outcomeSummary": "A String",
+            "runDuration": { #  # How long it took for this step to run.
+                # A Duration represents a signed, fixed-length span of time represented
+                # as a count of seconds and fractions of seconds at nanosecond
+                # resolution. It is independent of any calendar and concepts like "day"
+                # or "month". It is related to Timestamp in that the difference between
+                # two Timestamp values is a Duration and it can be added or subtracted
+                # from a Timestamp. Range is approximately +-10,000 years.
+              "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+              "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+                  # of time. Durations less than one second are represented with a 0
+                  # `seconds` field and a positive or negative `nanos` field. For durations
+                  # of one second or more, a non-zero value for the `nanos` field must be
+                  # of the same sign as the `seconds` field. Must be from -999,999,999
+                  # to +999,999,999 inclusive.
+            },
+            "stepId": "A String",
+          },
+        ],
+      },
+      "multistepNumber": 42, # Unique int given to each step.
+          # Ranges from 0(inclusive) to total number of steps(exclusive).
+          # The primary step is 0.
+      "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
+    },
+    "stepId": "A String", # A unique identifier within a Execution for this Step.
+        #
+        # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
+        #
+        # - In response: always set
+        # - In create/update request: never set
+    "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
+        #
+        # - In response: present if set by create/update request
+        # - In create/update request: optional
+      "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not SUCCESS.
+          #
+          # Optional
+          # LINT.IfChange
+        "otherNativeCrash": True or False, # If a native process other than the app crashed.
+      },
+      "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not SKIPPED.
+          #
+          # Optional
+        "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
+        "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
+        "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
+      },
+      "summary": "A String", # The simplest way to interpret a result.
+          #
+          # Required
+      "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not FAILURE.
+          #
+          # Optional
+        "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
+        "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
+            # start.
+        "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
+            # This might be caused by trying to run a test on an unsupported platform.
+        "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
+        "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
+      },
+      "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not INCONCLUSIVE.
+          #
+          # Optional
+        "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
+            # infrastructure failures
+        "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
+            # depends on a component other than the system under test which failed.
+            #
+            # For example, a mobile test requires provisioning a device where the test
+            # executes, and that provisioning can fail.
+        "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
+            # determined.
+            # For example, the user pressed ctrl-c which sent a kill signal to the test
+            # runner while the test was running.
+      },
+    },
+    "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
+        # For example: running cp to copy artifacts from one location to another.
+      "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
+          #
+          # - In response: present if set by create/update request
+          # - In create/update request: optional
+          # copying artifacts or deploying code.
+        "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
+            # argv in a C program).
+            #
+            # - In response: present if set by create request
+            # - In create request: optional
+            # - In update request: never set
+          "A String",
+        ],
+        "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+            # exited.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, a FAILED_PRECONDITION error will be
+            #   returned if an exit_code is already set.
+          "number": 42, # Tool execution exit code. A value of 0 means that the execution was
+              # successful.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+        "toolLogs": [ # References to any plain text logs output the tool execution.
+            #
+            # This field can be set before the tool has exited in order to be able to
+            # have access to a live view of the logs while the tool is running.
+            #
+            # The maximum allowed number of tool logs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a file.
+            "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        ],
+        "toolOutputs": [ # References to opaque files of any format output by the tool execution.
+            #
+            # The maximum allowed number of tool outputs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a ToolExecution output file.
+            "testCase": { # A reference to a test case. # The test case to which this output file belongs.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                #
+                # Test case references are canonically ordered lexicographically by these three
+                # factors:
+                # * First, by test_suite_name.
+                # * Second, by class_name.
+                # * Third, by name.
+              "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
+              "className": "A String", # The name of the class.
+              "name": "A String", # The name of the test case.
+                  #
+                  # Required.
+            },
+            "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                # calendar, encoded as a count of seconds and fractions of seconds at
+                # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+                # January 1, 1970, in the proleptic Gregorian calendar which extends the
+                # Gregorian calendar backwards to year one.
+                #
+                # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
+                # second table is needed for interpretation, using a [24-hour linear
+                # smear](https://developers.google.com/time/smear).
+                #
+                # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+                # restricting to that range, we ensure that we can convert to and from [RFC
+                # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+              "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                  # second values with fractions must still have non-negative nanos values
+                  # that count forward in time. Must be from 0 to 999,999,999
+                  # inclusive.
+              "seconds": "A String", # Represents seconds of UTC time since Unix epoch
+                  # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                  # 9999-12-31T23:59:59Z inclusive.
+            },
+            "output": { # A reference to a file. # A FileReference to an output file.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+              "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
+                  #
+                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                  # or in gsutil format: gs://mybucket/path/to/test.xml
+                  # with version-specific info,
+                  # gs://mybucket/path/to/test.xml#1360383693690000
+                  #
+                  # An INVALID_ARGUMENT error will be returned if the URI format is not
+                  # supported.
+                  #
+                  # - In response: always set
+                  # - In create/update request: always set
+            },
+          },
+        ],
+      },
+    },
+    "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
+        #
+        # This is the device usage used for billing purpose, which is different from
+        # the run_duration, for example, infrastructure failure won't be charged for
+        # device usage.
+        #
+        # PRECONDITION_FAILED will be returned if one attempts to set a
+        # device_usage on a step which already has this field set.
+        #
+        # - In response: present if previously set.
+        # - In create request: optional
+        # - In update request: optional
+        # A Duration represents a signed, fixed-length span of time represented
+        # as a count of seconds and fractions of seconds at nanosecond
+        # resolution. It is independent of any calendar and concepts like "day"
+        # or "month". It is related to Timestamp in that the difference between
+        # two Timestamp values is a Duration and it can be added or subtracted
+        # from a Timestamp. Range is approximately +-10,000 years.
+      "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+      "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+          # of time. Durations less than one second are represented with a 0
+          # `seconds` field and a positive or negative `nanos` field. For durations
+          # of one second or more, a non-zero value for the `nanos` field must be
+          # of the same sign as the `seconds` field. Must be from -999,999,999
+          # to +999,999,999 inclusive.
+    },
+    "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
+        # step.
+        #
+        # Users are responsible for managing the key namespace such that keys
+        # don't accidentally collide.
+        #
+        # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
+        # if the length of any of the keys or values exceeds 100 characters.
+        #
+        # - In response: always set
+        # - In create request: optional
+        # - In update request: optional; any new key/value pair will be added to the
+        #   map, and any new value for an existing key will update that key's value
+      {
+        "key": "A String",
+        "value": "A String",
+      },
+    ],
     "hasImages": True or False, # Whether any of the outputs of this step are images whose
         # thumbnails can be fetched with ListThumbnails.
-        # 
+        #
         # - In response: always set
         # - In create/update request: never set
     "runDuration": { #  # How long it took for this step to run.
-        # 
+        #
         # If unset, this is set to the difference between creation_time and
         # completion_time when the step is set to the COMPLETE state. In some cases,
         # it is appropriate to set this value separately: For instance, if a step is
         # created, but the operation it represents is queued for a few minutes before
         # it executes, it would be appropriate not to include the time spent queued
         # in its run_duration.
-        # 
+        #
         # PRECONDITION_FAILED will be returned if one attempts to set a
         # run_duration on a step which already has this field set.
-        # 
+        #
         # - In response: present if previously set; always present on COMPLETE step
         # - In create request: optional
         # - In update request: optional
@@ -286,19 +1504,19 @@
         # or "month". It is related to Timestamp in that the difference between
         # two Timestamp values is a Duration and it can be added or subtracted
         # from a Timestamp. Range is approximately +-10,000 years.
+      "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
       "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
           # of time. Durations less than one second are represented with a 0
           # `seconds` field and a positive or negative `nanos` field. For durations
           # of one second or more, a non-zero value for the `nanos` field must be
           # of the same sign as the `seconds` field. Must be from -999,999,999
           # to +999,999,999 inclusive.
-      "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
-          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
     },
     "description": "A String", # A description of this tool
         # For example: mvn clean package -D skipTests=true
-        # 
+        #
         # - In response: present if set by create/update request
         # - In create/update request: optional
     "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
@@ -308,6 +1526,116 @@
         # files, however they can't be deleted.
         #
         # Users can also add test results manually by using the test_result field.
+      "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
+          # log by server, or uploaded directly by user. This references should only be
+          # called when test suites are fully parsed or uploaded.
+          #
+          # The maximum allowed number of test suite overviews per step is 1000.
+          #
+          # - In response: always set
+          # - In create request: optional
+          # - In update request: never (use publishXunitXmlFiles custom method instead)
+        { # A summary of a test suite result either parsed from XML or uploaded
+            # directly by a user.
+            #
+            # Note: the API related comments are for StepService only. This message is
+            # also being used in ExecutionService in a read only mode for the corresponding
+            # step.
+          "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
+              # xml_source. May also be set by the user.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          "name": "A String", # The name of the test suite.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          "elapsedTime": { #  # Elapsed time of test suite.
+              # A Duration represents a signed, fixed-length span of time represented
+              # as a count of seconds and fractions of seconds at nanosecond
+              # resolution. It is independent of any calendar and concepts like "day"
+              # or "month". It is related to Timestamp in that the difference between
+              # two Timestamp values is a Duration and it can be added or subtracted
+              # from a Timestamp. Range is approximately +-10,000 years.
+            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+                # of time. Durations less than one second are represented with a 0
+                # `seconds` field and a positive or negative `nanos` field. For durations
+                # of one second or more, a non-zero value for the `nanos` field must be
+                # of the same sign as the `seconds` field. Must be from -999,999,999
+                # to +999,999,999 inclusive.
+          },
+          "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
+              # attempts.
+              #
+              # Present only for rollup test suite overview at environment level. A step
+              # cannot have flaky test cases.
+          "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          "totalCount": 42, # Number of test cases, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
+              # XML file is stored.
+              #
+              # Note: Multiple test suites can share the same xml_source
+              #
+              # Returns INVALID_ARGUMENT if the uri format is not supported.
+              #
+              # - In create/response: optional
+              # - In update request: never
+            "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        },
+      ],
+      "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
+          #
+          # - In response: present if set by create or update
+          # - In create/update request: optional
+        "testProcessDuration": { #  # How long it took to run the test process.
+            #
+            # - In response: present if previously set.
+            # - In create/update request: optional
+            # A Duration represents a signed, fixed-length span of time represented
+            # as a count of seconds and fractions of seconds at nanosecond
+            # resolution. It is independent of any calendar and concepts like "day"
+            # or "month". It is related to Timestamp in that the difference between
+            # two Timestamp values is a Duration and it can be added or subtracted
+            # from a Timestamp. Range is approximately +-10,000 years.
+          "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+          "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
+              # of time. Durations less than one second are represented with a 0
+              # `seconds` field and a positive or negative `nanos` field. For durations
+              # of one second or more, a non-zero value for the `nanos` field must be
+              # of the same sign as the `seconds` field. Must be from -999,999,999
+              # to +999,999,999 inclusive.
+        },
+      },
       "testIssues": [ # Issues observed during the test execution.
           #
           # For example, if the mobile app under test crashed during the test,
@@ -398,6 +1726,7 @@
               #       "@type": "type.googleapis.com/google.protobuf.Duration",
               #       "value": "1.212s"
               #     }
+            "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
             "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
                 # protocol buffer message. This string must contain at least
                 # one "/" character. The last segment of the URL's path must represent
@@ -425,7 +1754,6 @@
                 #
                 # Schemes other than `http`, `https` (or the empty scheme) might be
                 # used with implementation specific semantics.
-            "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
           },
           "severity": "A String", # Severity of issue.
               # Required.
@@ -505,6 +1833,22 @@
             # - In update request: optional, any value provided will be appended to the
             #   existing list
           { # A reference to a ToolExecution output file.
+            "testCase": { # A reference to a test case. # The test case to which this output file belongs.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                #
+                # Test case references are canonically ordered lexicographically by these three
+                # factors:
+                # * First, by test_suite_name.
+                # * Second, by class_name.
+                # * Third, by name.
+              "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
+              "className": "A String", # The name of the class.
+              "name": "A String", # The name of the test case.
+                  #
+                  # Required.
+            },
             "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                 #
                 # - In response: present if set by create/update request
@@ -546,138 +1890,12 @@
                   # - In response: always set
                   # - In create/update request: always set
             },
-            "testCase": { # A reference to a test case. # The test case to which this output file belongs.
-                #
-                # - In response: present if set by create/update request
-                # - In create/update request: optional
-                #
-                # Test case references are canonically ordered lexicographically by these three
-                # factors:
-                # * First, by test_suite_name.
-                # * Second, by class_name.
-                # * Third, by name.
-              "name": "A String", # The name of the test case.
-                  #
-                  # Required.
-              "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
-              "className": "A String", # The name of the class.
-            },
           },
         ],
       },
-      "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
-          # log by server, or uploaded directly by user. This references should only be
-          # called when test suites are fully parsed or uploaded.
-          #
-          # The maximum allowed number of test suite overviews per step is 1000.
-          #
-          # - In response: always set
-          # - In create request: optional
-          # - In update request: never (use publishXunitXmlFiles custom method instead)
-        { # A summary of a test suite result either parsed from XML or uploaded
-            # directly by a user.
-            #
-            # Note: the API related comments are for StepService only. This message is
-            # also being used in ExecutionService in a read only mode for the corresponding
-            # step.
-          "name": "A String", # The name of the test suite.
-              #
-              # - In create/response: always set
-              # - In update request: never
-          "elapsedTime": { #  # Elapsed time of test suite.
-              # A Duration represents a signed, fixed-length span of time represented
-              # as a count of seconds and fractions of seconds at nanosecond
-              # resolution. It is independent of any calendar and concepts like "day"
-              # or "month". It is related to Timestamp in that the difference between
-              # two Timestamp values is a Duration and it can be added or subtracted
-              # from a Timestamp. Range is approximately +-10,000 years.
-            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
-                # of time. Durations less than one second are represented with a 0
-                # `seconds` field and a positive or negative `nanos` field. For durations
-                # of one second or more, a non-zero value for the `nanos` field must be
-                # of the same sign as the `seconds` field. Must be from -999,999,999
-                # to +999,999,999 inclusive.
-            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
-                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-          },
-          "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
-              # attempts.
-              #
-              # Present only for rollup test suite overview at environment level. A step
-              # cannot have flaky test cases.
-          "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
-              # xml_source.
-              #
-              # - In create/response: always set
-              # - In update request: never
-          "totalCount": 42, # Number of test cases, typically set by the service by parsing the
-              # xml_source.
-              #
-              # - In create/response: always set
-              # - In update request: never
-          "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
-              # xml_source.
-              #
-              # - In create/response: always set
-              # - In update request: never
-          "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
-              # XML file is stored.
-              #
-              # Note: Multiple test suites can share the same xml_source
-              #
-              # Returns INVALID_ARGUMENT if the uri format is not supported.
-              #
-              # - In create/response: optional
-              # - In update request: never
-            "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
-                #
-                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                # or in gsutil format: gs://mybucket/path/to/test.xml
-                # with version-specific info,
-                # gs://mybucket/path/to/test.xml#1360383693690000
-                #
-                # An INVALID_ARGUMENT error will be returned if the URI format is not
-                # supported.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
-              # xml_source. May also be set by the user.
-              #
-              # - In create/response: always set
-              # - In update request: never
-        },
-      ],
-      "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
-          #
-          # - In response: present if set by create or update
-          # - In create/update request: optional
-        "testProcessDuration": { #  # How long it took to run the test process.
-            #
-            # - In response: present if previously set.
-            # - In create/update request: optional
-            # A Duration represents a signed, fixed-length span of time represented
-            # as a count of seconds and fractions of seconds at nanosecond
-            # resolution. It is independent of any calendar and concepts like "day"
-            # or "month". It is related to Timestamp in that the difference between
-            # two Timestamp values is a Duration and it can be added or subtracted
-            # from a Timestamp. Range is approximately +-10,000 years.
-          "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
-              # of time. Durations less than one second are represented with a 0
-              # `seconds` field and a positive or negative `nanos` field. For durations
-              # of one second or more, a non-zero value for the `nanos` field must be
-              # of the same sign as the `seconds` field. Must be from -999,999,999
-              # to +999,999,999 inclusive.
-          "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
-              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-        },
-      },
     },
     "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
-        # 
+        #
         # - In response: always set
         # - In create/update request: never set
         # calendar, encoded as a count of seconds and fractions of seconds at
@@ -700,75 +1918,129 @@
           # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
           # 9999-12-31T23:59:59Z inclusive.
     },
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(projectId, historyId, executionId, stepId, x__xgafv=None)</code>
+  <pre>Gets a Step.
+
+May return any of the following canonical error codes:
+
+- PERMISSION_DENIED - if the user is not authorized to read project
+- INVALID_ARGUMENT - if the request is malformed
+- NOT_FOUND - if the Step does not exist
+
+Args:
+  projectId: string, A Project id.
+
+Required. (required)
+  historyId: string, A History id.
+
+Required. (required)
+  executionId: string, A Execution id.
+
+Required. (required)
+  stepId: string, A Step id.
+
+Required. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A Step represents a single operation performed as part of
+      # Execution. A step can be used to represent the execution of a tool (
+      # for example a test runner execution or an execution of a compiler).
+      #
+      # Steps can overlap (for instance two steps might have the same
+      # start time if some operations are done in parallel).
+      #
+      # Here is an example, let&#x27;s consider that we have a continuous build is
+      # executing a test runner for each iteration. The workflow would look like:
+      # - user creates a Execution with id 1
+      # - user creates an TestExecutionStep with id 100 for Execution 1
+      # - user update TestExecutionStep with id 100 to add a raw xml log
+      #     + the service parses the xml logs and returns a TestExecutionStep with
+      #      updated TestResult(s).
+      # - user update the status of TestExecutionStep with id 100 to COMPLETE
+      #
+      # A Step can be updated until its state is set to COMPLETE at which
+      # points it becomes immutable.
+      #
+      # Next tag: 27
     &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
         # The only legal state transitions are
         # * IN_PROGRESS -&gt; COMPLETE
-        # 
+        #
         # A PRECONDITION_FAILED will be returned if an invalid transition is
         # requested.
-        # 
+        #
         # It is valid to create Step with a state set to COMPLETE.
         # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
         # returned if the state is set to COMPLETE multiple times.
-        # 
+        #
         # - In response: always set
         # - In create/update request: optional
     &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
         # Maximum of 100 characters.
         # For example: Clean build
-        # 
+        #
         # A PRECONDITION_FAILED will be returned upon creating a new step if it
         # shares its name and dimension_value with an existing step. If two steps
         # represent a similar action, but have different dimension values, they
         # should share the same name. For instance, if the same set of tests is
         # run on two different platforms, the two steps should have the same name.
-        # 
+        #
         # - In response: always set
         # - In create request: always set
         # - In update request: never set
     &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
         # then this field allows the child to specify the values of the dimensions.
-        # 
+        #
         # The keys must exactly match the dimension_definition of the execution.
-        # 
+        #
         # For example, if the execution has
         # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
         # then a step must define values for those dimensions, eg.
         # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-        # 
+        #
         # If a step does not participate in one dimension of the matrix,
         # the value for that dimension should be empty string.
         # For example, if one of the tests is executed by a runner which
         # does not support retries, the step could have
         # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-        # 
+        #
         # If the step does not participate in any dimensions of the matrix,
         # it may leave dimension_value unset.
-        # 
+        #
         # A PRECONDITION_FAILED will be returned if any of the keys do not exist
         # in the dimension_definition of the execution.
-        # 
+        #
         # A PRECONDITION_FAILED will be returned if another step in this execution
         # already has the same name and dimension_value, but differs on other data
         # fields, for example, step field is different.
-        # 
+        #
         # A PRECONDITION_FAILED will be returned if dimension_value is set, and
         # there is a dimension_definition in the execution which is not specified
         # as one of the keys.
-        # 
+        #
         # - In response: present if set by create
         # - In create request: optional
         # - In update request: never set
       {
-        &quot;value&quot;: &quot;A String&quot;,
         &quot;key&quot;: &quot;A String&quot;,
+        &quot;value&quot;: &quot;A String&quot;,
       },
     ],
     &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
-        # 
+        #
         # This value will be set automatically when state transitions to
         # COMPLETE.
-        # 
+        #
         # - In response: set if the execution state is COMPLETE.
         # - In create/update request: never set
         # calendar, encoded as a count of seconds and fractions of seconds at
@@ -795,15 +2067,11 @@
         # These details can be used identify which group this step is part of.
         # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
         # members.
-        # 
+        #
         # - In response: present if previously set.
         # - In create request: optional, set iff this step was performed more than
         # once.
         # - In update request: optional
-      &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-          # Ranges from 0(inclusive) to total number of steps(exclusive).
-          # The primary step is 0.
-      &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
       &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
           # outcome of each individual step.
         &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
@@ -811,6 +2079,10 @@
         &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
           { # Step Id and outcome of each individual step that was run as a group with
               # other steps with the same configuration.
+            &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+                # Ranges from 0(inclusive) to total number of steps(exclusive).
+                # The primary step is 0.
+            &quot;outcomeSummary&quot;: &quot;A String&quot;,
             &quot;runDuration&quot;: { #  # How long it took for this step to run.
                 # A Duration represents a signed, fixed-length span of time represented
                 # as a count of seconds and fractions of seconds at nanosecond
@@ -818,70 +2090,35 @@
                 # or &quot;month&quot;. It is related to Timestamp in that the difference between
                 # two Timestamp values is a Duration and it can be added or subtracted
                 # from a Timestamp. Range is approximately +-10,000 years.
+              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
               &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
                   # of time. Durations less than one second are represented with a 0
                   # `seconds` field and a positive or negative `nanos` field. For durations
                   # of one second or more, a non-zero value for the `nanos` field must be
                   # of the same sign as the `seconds` field. Must be from -999,999,999
                   # to +999,999,999 inclusive.
-              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
             },
             &quot;stepId&quot;: &quot;A String&quot;,
-            &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-                # Ranges from 0(inclusive) to total number of steps(exclusive).
-                # The primary step is 0.
-            &quot;outcomeSummary&quot;: &quot;A String&quot;,
           },
         ],
       },
+      &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+          # Ranges from 0(inclusive) to total number of steps(exclusive).
+          # The primary step is 0.
+      &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
     },
     &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
-        # 
+        #
         # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
-        # 
+        #
         # - In response: always set
         # - In create/update request: never set
     &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
-        # 
+        #
         # - In response: present if set by create/update request
         # - In create/update request: optional
-      &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
-          #
-          # Required
-      &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
-          #
-          # Returns INVALID_ARGUMENT if this field is set
-          # but the summary is not FAILURE.
-          #
-          # Optional
-        &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
-            # start.
-        &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
-            # This might be caused by trying to run a test on an unsupported platform.
-        &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
-        &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
-        &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
-      },
-      &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
-          #
-          # Returns INVALID_ARGUMENT if this field is set
-          # but the summary is not INCONCLUSIVE.
-          #
-          # Optional
-        &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
-            # infrastructure failures
-        &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
-            # depends on a component other than the system under test which failed.
-            #
-            # For example, a mobile test requires provisioning a device where the test
-            # executes, and that provisioning can fail.
-        &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
-            # determined.
-            # For example, the user pressed ctrl-c which sent a kill signal to the test
-            # runner while the test was running.
-      },
       &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
           #
           # Returns INVALID_ARGUMENT if this field is set
@@ -901,6 +2138,41 @@
         &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
         &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
       },
+      &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
+          #
+          # Required
+      &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not FAILURE.
+          #
+          # Optional
+        &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
+        &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
+            # start.
+        &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
+            # This might be caused by trying to run a test on an unsupported platform.
+        &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
+        &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
+      },
+      &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not INCONCLUSIVE.
+          #
+          # Optional
+        &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
+            # infrastructure failures
+        &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
+            # depends on a component other than the system under test which failed.
+            #
+            # For example, a mobile test requires provisioning a device where the test
+            # executes, and that provisioning can fail.
+        &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
+            # determined.
+            # For example, the user pressed ctrl-c which sent a kill signal to the test
+            # runner while the test was running.
+      },
     },
     &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
         # For example: running cp to copy artifacts from one location to another.
@@ -965,6 +2237,22 @@
             # - In update request: optional, any value provided will be appended to the
             #   existing list
           { # A reference to a ToolExecution output file.
+            &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                #
+                # Test case references are canonically ordered lexicographically by these three
+                # factors:
+                # * First, by test_suite_name.
+                # * Second, by class_name.
+                # * Third, by name.
+              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+              &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                  #
+                  # Required.
+            },
             &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                 #
                 # - In response: present if set by create/update request
@@ -1006,6 +2294,411 @@
                   # - In response: always set
                   # - In create/update request: always set
             },
+          },
+        ],
+      },
+    },
+    &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
+        #
+        # This is the device usage used for billing purpose, which is different from
+        # the run_duration, for example, infrastructure failure won&#x27;t be charged for
+        # device usage.
+        #
+        # PRECONDITION_FAILED will be returned if one attempts to set a
+        # device_usage on a step which already has this field set.
+        #
+        # - In response: present if previously set.
+        # - In create request: optional
+        # - In update request: optional
+        # A Duration represents a signed, fixed-length span of time represented
+        # as a count of seconds and fractions of seconds at nanosecond
+        # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+        # or &quot;month&quot;. It is related to Timestamp in that the difference between
+        # two Timestamp values is a Duration and it can be added or subtracted
+        # from a Timestamp. Range is approximately +-10,000 years.
+      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+      &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+          # of time. Durations less than one second are represented with a 0
+          # `seconds` field and a positive or negative `nanos` field. For durations
+          # of one second or more, a non-zero value for the `nanos` field must be
+          # of the same sign as the `seconds` field. Must be from -999,999,999
+          # to +999,999,999 inclusive.
+    },
+    &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
+        # step.
+        #
+        # Users are responsible for managing the key namespace such that keys
+        # don&#x27;t accidentally collide.
+        #
+        # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
+        # if the length of any of the keys or values exceeds 100 characters.
+        #
+        # - In response: always set
+        # - In create request: optional
+        # - In update request: optional; any new key/value pair will be added to the
+        #   map, and any new value for an existing key will update that key&#x27;s value
+      {
+        &quot;key&quot;: &quot;A String&quot;,
+        &quot;value&quot;: &quot;A String&quot;,
+      },
+    ],
+    &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
+        # thumbnails can be fetched with ListThumbnails.
+        #
+        # - In response: always set
+        # - In create/update request: never set
+    &quot;runDuration&quot;: { #  # How long it took for this step to run.
+        #
+        # If unset, this is set to the difference between creation_time and
+        # completion_time when the step is set to the COMPLETE state. In some cases,
+        # it is appropriate to set this value separately: For instance, if a step is
+        # created, but the operation it represents is queued for a few minutes before
+        # it executes, it would be appropriate not to include the time spent queued
+        # in its run_duration.
+        #
+        # PRECONDITION_FAILED will be returned if one attempts to set a
+        # run_duration on a step which already has this field set.
+        #
+        # - In response: present if previously set; always present on COMPLETE step
+        # - In create request: optional
+        # - In update request: optional
+        # A Duration represents a signed, fixed-length span of time represented
+        # as a count of seconds and fractions of seconds at nanosecond
+        # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+        # or &quot;month&quot;. It is related to Timestamp in that the difference between
+        # two Timestamp values is a Duration and it can be added or subtracted
+        # from a Timestamp. Range is approximately +-10,000 years.
+      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+      &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+          # of time. Durations less than one second are represented with a 0
+          # `seconds` field and a positive or negative `nanos` field. For durations
+          # of one second or more, a non-zero value for the `nanos` field must be
+          # of the same sign as the `seconds` field. Must be from -999,999,999
+          # to +999,999,999 inclusive.
+    },
+    &quot;description&quot;: &quot;A String&quot;, # A description of this tool
+        # For example: mvn clean package -D skipTests=true
+        #
+        # - In response: present if set by create/update request
+        # - In create/update request: optional
+    &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
+        #
+        # It accepts ant-junit xml files which will be parsed into structured test
+        # results by the service. Xml file paths are updated in order to append more
+        # files, however they can&#x27;t be deleted.
+        #
+        # Users can also add test results manually by using the test_result field.
+      &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
+          # log by server, or uploaded directly by user. This references should only be
+          # called when test suites are fully parsed or uploaded.
+          #
+          # The maximum allowed number of test suite overviews per step is 1000.
+          #
+          # - In response: always set
+          # - In create request: optional
+          # - In update request: never (use publishXunitXmlFiles custom method instead)
+        { # A summary of a test suite result either parsed from XML or uploaded
+            # directly by a user.
+            #
+            # Note: the API related comments are for StepService only. This message is
+            # also being used in ExecutionService in a read only mode for the corresponding
+            # step.
+          &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
+              # xml_source. May also be set by the user.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
+              # A Duration represents a signed, fixed-length span of time represented
+              # as a count of seconds and fractions of seconds at nanosecond
+              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+              # or &quot;month&quot;. It is related to Timestamp in that the difference between
+              # two Timestamp values is a Duration and it can be added or subtracted
+              # from a Timestamp. Range is approximately +-10,000 years.
+            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+                # of time. Durations less than one second are represented with a 0
+                # `seconds` field and a positive or negative `nanos` field. For durations
+                # of one second or more, a non-zero value for the `nanos` field must be
+                # of the same sign as the `seconds` field. Must be from -999,999,999
+                # to +999,999,999 inclusive.
+          },
+          &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
+              # attempts.
+              #
+              # Present only for rollup test suite overview at environment level. A step
+              # cannot have flaky test cases.
+          &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
+              # XML file is stored.
+              #
+              # Note: Multiple test suites can share the same xml_source
+              #
+              # Returns INVALID_ARGUMENT if the uri format is not supported.
+              #
+              # - In create/response: optional
+              # - In update request: never
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        },
+      ],
+      &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
+          #
+          # - In response: present if set by create or update
+          # - In create/update request: optional
+        &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
+            #
+            # - In response: present if previously set.
+            # - In create/update request: optional
+            # A Duration represents a signed, fixed-length span of time represented
+            # as a count of seconds and fractions of seconds at nanosecond
+            # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+            # or &quot;month&quot;. It is related to Timestamp in that the difference between
+            # two Timestamp values is a Duration and it can be added or subtracted
+            # from a Timestamp. Range is approximately +-10,000 years.
+          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+          &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+              # of time. Durations less than one second are represented with a 0
+              # `seconds` field and a positive or negative `nanos` field. For durations
+              # of one second or more, a non-zero value for the `nanos` field must be
+              # of the same sign as the `seconds` field. Must be from -999,999,999
+              # to +999,999,999 inclusive.
+        },
+      },
+      &quot;testIssues&quot;: [ # Issues observed during the test execution.
+          #
+          # For example, if the mobile app under test crashed during the test,
+          # the error message and the stack trace content can be recorded here
+          # to assist debugging.
+          #
+          # - In response: present if set by create or update
+          # - In create/update request: optional
+        { # An issue detected occurring during a test execution.
+          &quot;warning&quot;: { #  # Warning message with additional details of the issue.
+              # Should always be a message from com.google.devtools.toolresults.v1.warnings
+              # `Any` contains an arbitrary serialized protocol buffer message along with a
+              # URL that describes the type of the serialized message.
+              #
+              # Protobuf library provides support to pack/unpack Any values in the form
+              # of utility functions or additional generated methods of the Any type.
+              #
+              # Example 1: Pack and unpack a message in C++.
+              #
+              #     Foo foo = ...;
+              #     Any any;
+              #     any.PackFrom(foo);
+              #     ...
+              #     if (any.UnpackTo(&amp;foo)) {
+              #       ...
+              #     }
+              #
+              # Example 2: Pack and unpack a message in Java.
+              #
+              #     Foo foo = ...;
+              #     Any any = Any.pack(foo);
+              #     ...
+              #     if (any.is(Foo.class)) {
+              #       foo = any.unpack(Foo.class);
+              #     }
+              #
+              #  Example 3: Pack and unpack a message in Python.
+              #
+              #     foo = Foo(...)
+              #     any = Any()
+              #     any.Pack(foo)
+              #     ...
+              #     if any.Is(Foo.DESCRIPTOR):
+              #       any.Unpack(foo)
+              #       ...
+              #
+              #  Example 4: Pack and unpack a message in Go
+              #
+              #      foo := &amp;pb.Foo{...}
+              #      any, err := ptypes.MarshalAny(foo)
+              #      ...
+              #      foo := &amp;pb.Foo{}
+              #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
+              #        ...
+              #      }
+              #
+              # The pack methods provided by protobuf library will by default use
+              # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
+              # methods only use the fully qualified type name after the last &#x27;/&#x27;
+              # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
+              # name &quot;y.z&quot;.
+              #
+              #
+              # # JSON
+              #
+              # The JSON representation of an `Any` value uses the regular
+              # representation of the deserialized, embedded message, with an
+              # additional field `@type` which contains the type URL. Example:
+              #
+              #     package google.profile;
+              #     message Person {
+              #       string first_name = 1;
+              #       string last_name = 2;
+              #     }
+              #
+              #     {
+              #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
+              #       &quot;firstName&quot;: &lt;string&gt;,
+              #       &quot;lastName&quot;: &lt;string&gt;
+              #     }
+              #
+              # If the embedded message type is well-known and has a custom JSON
+              # representation, that representation will be embedded adding a field
+              # `value` which holds the custom JSON in addition to the `@type`
+              # field. Example (for message google.protobuf.Duration):
+              #
+              #     {
+              #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
+              #       &quot;value&quot;: &quot;1.212s&quot;
+              #     }
+            &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
+            &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
+                # protocol buffer message. This string must contain at least
+                # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
+                # the fully qualified name of the type (as in
+                # `path/google.protobuf.Duration`). The name should be in a canonical form
+                # (e.g., leading &quot;.&quot; is not accepted).
+                #
+                # In practice, teams usually precompile into the binary all types that they
+                # expect it to use in the context of Any. However, for URLs which use the
+                # scheme `http`, `https`, or no scheme, one can optionally set up a type
+                # server that maps type URLs to message definitions as follows:
+                #
+                # * If no scheme is provided, `https` is assumed.
+                # * An HTTP GET on the URL must yield a google.protobuf.Type
+                #   value in binary format, or produce an error.
+                # * Applications are allowed to cache lookup results based on the
+                #   URL, or have them precompiled into a binary to avoid any
+                #   lookup. Therefore, binary compatibility needs to be preserved
+                #   on changes to types. (Use versioned type names to manage
+                #   breaking changes.)
+                #
+                # Note: this functionality is not currently available in the official
+                # protobuf release, and it is not used for type URLs beginning with
+                # type.googleapis.com.
+                #
+                # Schemes other than `http`, `https` (or the empty scheme) might be
+                # used with implementation specific semantics.
+          },
+          &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
+              # Required.
+          &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
+            &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
+                #
+                # Required
+          },
+          &quot;type&quot;: &quot;A String&quot;, # Type of issue.
+              # Required.
+          &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
+              # Required.
+          &quot;category&quot;: &quot;A String&quot;, # Category of issue.
+              # Required.
+        },
+      ],
+      &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
+          #
+          # The exit code of this tool will be used to determine if the test passed.
+          #
+          # - In response: always set
+          # - In create/update request: optional
+          # copying artifacts or deploying code.
+        &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
+            # argv in a C program).
+            #
+            # - In response: present if set by create request
+            # - In create request: optional
+            # - In update request: never set
+          &quot;A String&quot;,
+        ],
+        &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+            # exited.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, a FAILED_PRECONDITION error will be
+            #   returned if an exit_code is already set.
+          &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
+              # successful.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+        &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+            #
+            # This field can be set before the tool has exited in order to be able to
+            # have access to a live view of the logs while the tool is running.
+            #
+            # The maximum allowed number of tool logs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a file.
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        ],
+        &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
+            #
+            # The maximum allowed number of tool outputs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a ToolExecution output file.
             &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
                 #
                 # - In response: present if set by create/update request
@@ -1016,1775 +2709,82 @@
                 # * First, by test_suite_name.
                 # * Second, by class_name.
                 # * Third, by name.
+              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
               &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
                   #
                   # Required.
-              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+            },
+            &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                # calendar, encoded as a count of seconds and fractions of seconds at
+                # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+                # January 1, 1970, in the proleptic Gregorian calendar which extends the
+                # Gregorian calendar backwards to year one.
+                #
+                # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+                # second table is needed for interpretation, using a [24-hour linear
+                # smear](https://developers.google.com/time/smear).
+                #
+                # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+                # restricting to that range, we ensure that we can convert to and from [RFC
+                # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+              &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                  # second values with fractions must still have non-negative nanos values
+                  # that count forward in time. Must be from 0 to 999,999,999
+                  # inclusive.
+              &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+                  # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                  # 9999-12-31T23:59:59Z inclusive.
+            },
+            &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                  #
+                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                  # or in gsutil format: gs://mybucket/path/to/test.xml
+                  # with version-specific info,
+                  # gs://mybucket/path/to/test.xml#1360383693690000
+                  #
+                  # An INVALID_ARGUMENT error will be returned if the URI format is not
+                  # supported.
+                  #
+                  # - In response: always set
+                  # - In create/update request: always set
             },
           },
         ],
       },
     },
-    &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
-        # 
-        # This is the device usage used for billing purpose, which is different from
-        # the run_duration, for example, infrastructure failure won&#x27;t be charged for
-        # device usage.
-        # 
-        # PRECONDITION_FAILED will be returned if one attempts to set a
-        # device_usage on a step which already has this field set.
-        # 
-        # - In response: present if previously set.
-        # - In create request: optional
-        # - In update request: optional
-        # A Duration represents a signed, fixed-length span of time represented
-        # as a count of seconds and fractions of seconds at nanosecond
-        # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-        # or &quot;month&quot;. It is related to Timestamp in that the difference between
-        # two Timestamp values is a Duration and it can be added or subtracted
-        # from a Timestamp. Range is approximately +-10,000 years.
-      &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-          # of time. Durations less than one second are represented with a 0
-          # `seconds` field and a positive or negative `nanos` field. For durations
-          # of one second or more, a non-zero value for the `nanos` field must be
-          # of the same sign as the `seconds` field. Must be from -999,999,999
-          # to +999,999,999 inclusive.
-      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-    },
-    &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
-        # step.
-        # 
-        # Users are responsible for managing the key namespace such that keys
-        # don&#x27;t accidentally collide.
-        # 
-        # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
-        # if the length of any of the keys or values exceeds 100 characters.
-        # 
+    &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
+        #
         # - In response: always set
-        # - In create request: optional
-        # - In update request: optional; any new key/value pair will be added to the
-        #   map, and any new value for an existing key will update that key&#x27;s value
-      {
-        &quot;value&quot;: &quot;A String&quot;,
-        &quot;key&quot;: &quot;A String&quot;,
-      },
-    ],
-  }
-
-  requestId: string, A unique request ID for server to detect duplicated requests.
-For example, a UUID.
-
-Optional, but strongly recommended.
-  x__xgafv: string, V1 error format.
-    Allowed values
-      1 - v1 error format
-      2 - v2 error format
-
-Returns:
-  An object of the form:
-
-    { # A Step represents a single operation performed as part of
-        # Execution. A step can be used to represent the execution of a tool (
-        # for example a test runner execution or an execution of a compiler).
+        # - In create/update request: never set
+        # calendar, encoded as a count of seconds and fractions of seconds at
+        # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+        # January 1, 1970, in the proleptic Gregorian calendar which extends the
+        # Gregorian calendar backwards to year one.
         #
-        # Steps can overlap (for instance two steps might have the same
-        # start time if some operations are done in parallel).
+        # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+        # second table is needed for interpretation, using a [24-hour linear
+        # smear](https://developers.google.com/time/smear).
         #
-        # Here is an example, let&#x27;s consider that we have a continuous build is
-        # executing a test runner for each iteration. The workflow would look like:
-        # - user creates a Execution with id 1
-        # - user creates an TestExecutionStep with id 100 for Execution 1
-        # - user update TestExecutionStep with id 100 to add a raw xml log
-        #     + the service parses the xml logs and returns a TestExecutionStep with
-        #      updated TestResult(s).
-        # - user update the status of TestExecutionStep with id 100 to COMPLETE
-        #
-        # A Step can be updated until its state is set to COMPLETE at which
-        # points it becomes immutable.
-        #
-        # Next tag: 27
-      &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
-          # thumbnails can be fetched with ListThumbnails.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-      &quot;runDuration&quot;: { #  # How long it took for this step to run.
-          #
-          # If unset, this is set to the difference between creation_time and
-          # completion_time when the step is set to the COMPLETE state. In some cases,
-          # it is appropriate to set this value separately: For instance, if a step is
-          # created, but the operation it represents is queued for a few minutes before
-          # it executes, it would be appropriate not to include the time spent queued
-          # in its run_duration.
-          #
-          # PRECONDITION_FAILED will be returned if one attempts to set a
-          # run_duration on a step which already has this field set.
-          #
-          # - In response: present if previously set; always present on COMPLETE step
-          # - In create request: optional
-          # - In update request: optional
-          # A Duration represents a signed, fixed-length span of time represented
-          # as a count of seconds and fractions of seconds at nanosecond
-          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-          # or &quot;month&quot;. It is related to Timestamp in that the difference between
-          # two Timestamp values is a Duration and it can be added or subtracted
-          # from a Timestamp. Range is approximately +-10,000 years.
-        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-            # of time. Durations less than one second are represented with a 0
-            # `seconds` field and a positive or negative `nanos` field. For durations
-            # of one second or more, a non-zero value for the `nanos` field must be
-            # of the same sign as the `seconds` field. Must be from -999,999,999
-            # to +999,999,999 inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-      },
-      &quot;description&quot;: &quot;A String&quot;, # A description of this tool
-          # For example: mvn clean package -D skipTests=true
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-      &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
-          #
-          # It accepts ant-junit xml files which will be parsed into structured test
-          # results by the service. Xml file paths are updated in order to append more
-          # files, however they can&#x27;t be deleted.
-          #
-          # Users can also add test results manually by using the test_result field.
-        &quot;testIssues&quot;: [ # Issues observed during the test execution.
-            #
-            # For example, if the mobile app under test crashed during the test,
-            # the error message and the stack trace content can be recorded here
-            # to assist debugging.
-            #
-            # - In response: present if set by create or update
-            # - In create/update request: optional
-          { # An issue detected occurring during a test execution.
-            &quot;warning&quot;: { #  # Warning message with additional details of the issue.
-                # Should always be a message from com.google.devtools.toolresults.v1.warnings
-                # `Any` contains an arbitrary serialized protocol buffer message along with a
-                # URL that describes the type of the serialized message.
-                #
-                # Protobuf library provides support to pack/unpack Any values in the form
-                # of utility functions or additional generated methods of the Any type.
-                #
-                # Example 1: Pack and unpack a message in C++.
-                #
-                #     Foo foo = ...;
-                #     Any any;
-                #     any.PackFrom(foo);
-                #     ...
-                #     if (any.UnpackTo(&amp;foo)) {
-                #       ...
-                #     }
-                #
-                # Example 2: Pack and unpack a message in Java.
-                #
-                #     Foo foo = ...;
-                #     Any any = Any.pack(foo);
-                #     ...
-                #     if (any.is(Foo.class)) {
-                #       foo = any.unpack(Foo.class);
-                #     }
-                #
-                #  Example 3: Pack and unpack a message in Python.
-                #
-                #     foo = Foo(...)
-                #     any = Any()
-                #     any.Pack(foo)
-                #     ...
-                #     if any.Is(Foo.DESCRIPTOR):
-                #       any.Unpack(foo)
-                #       ...
-                #
-                #  Example 4: Pack and unpack a message in Go
-                #
-                #      foo := &amp;pb.Foo{...}
-                #      any, err := ptypes.MarshalAny(foo)
-                #      ...
-                #      foo := &amp;pb.Foo{}
-                #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
-                #        ...
-                #      }
-                #
-                # The pack methods provided by protobuf library will by default use
-                # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
-                # methods only use the fully qualified type name after the last &#x27;/&#x27;
-                # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
-                # name &quot;y.z&quot;.
-                #
-                #
-                # # JSON
-                #
-                # The JSON representation of an `Any` value uses the regular
-                # representation of the deserialized, embedded message, with an
-                # additional field `@type` which contains the type URL. Example:
-                #
-                #     package google.profile;
-                #     message Person {
-                #       string first_name = 1;
-                #       string last_name = 2;
-                #     }
-                #
-                #     {
-                #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
-                #       &quot;firstName&quot;: &lt;string&gt;,
-                #       &quot;lastName&quot;: &lt;string&gt;
-                #     }
-                #
-                # If the embedded message type is well-known and has a custom JSON
-                # representation, that representation will be embedded adding a field
-                # `value` which holds the custom JSON in addition to the `@type`
-                # field. Example (for message google.protobuf.Duration):
-                #
-                #     {
-                #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
-                #       &quot;value&quot;: &quot;1.212s&quot;
-                #     }
-              &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
-                  # protocol buffer message. This string must contain at least
-                  # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
-                  # the fully qualified name of the type (as in
-                  # `path/google.protobuf.Duration`). The name should be in a canonical form
-                  # (e.g., leading &quot;.&quot; is not accepted).
-                  #
-                  # In practice, teams usually precompile into the binary all types that they
-                  # expect it to use in the context of Any. However, for URLs which use the
-                  # scheme `http`, `https`, or no scheme, one can optionally set up a type
-                  # server that maps type URLs to message definitions as follows:
-                  #
-                  # * If no scheme is provided, `https` is assumed.
-                  # * An HTTP GET on the URL must yield a google.protobuf.Type
-                  #   value in binary format, or produce an error.
-                  # * Applications are allowed to cache lookup results based on the
-                  #   URL, or have them precompiled into a binary to avoid any
-                  #   lookup. Therefore, binary compatibility needs to be preserved
-                  #   on changes to types. (Use versioned type names to manage
-                  #   breaking changes.)
-                  #
-                  # Note: this functionality is not currently available in the official
-                  # protobuf release, and it is not used for type URLs beginning with
-                  # type.googleapis.com.
-                  #
-                  # Schemes other than `http`, `https` (or the empty scheme) might be
-                  # used with implementation specific semantics.
-              &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
-            },
-            &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
-                # Required.
-            &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
-              &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
-                  #
-                  # Required
-            },
-            &quot;type&quot;: &quot;A String&quot;, # Type of issue.
-                # Required.
-            &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
-                # Required.
-            &quot;category&quot;: &quot;A String&quot;, # Category of issue.
-                # Required.
-          },
-        ],
-        &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
-            #
-            # The exit code of this tool will be used to determine if the test passed.
-            #
-            # - In response: always set
-            # - In create/update request: optional
-            # copying artifacts or deploying code.
-          &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-              # argv in a C program).
-              #
-              # - In response: present if set by create request
-              # - In create request: optional
-              # - In update request: never set
-            &quot;A String&quot;,
-          ],
-          &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-              # exited.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, a FAILED_PRECONDITION error will be
-              #   returned if an exit_code is already set.
-            &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                # successful.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-              #
-              # This field can be set before the tool has exited in order to be able to
-              # have access to a live view of the logs while the tool is running.
-              #
-              # The maximum allowed number of tool logs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a file.
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-          ],
-          &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-              #
-              # The maximum allowed number of tool outputs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a ToolExecution output file.
-              &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  # calendar, encoded as a count of seconds and fractions of seconds at
-                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                  # Gregorian calendar backwards to year one.
-                  #
-                  # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                  # second table is needed for interpretation, using a [24-hour linear
-                  # smear](https://developers.google.com/time/smear).
-                  #
-                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                  # restricting to that range, we ensure that we can convert to and from [RFC
-                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                    # second values with fractions must still have non-negative nanos values
-                    # that count forward in time. Must be from 0 to 999,999,999
-                    # inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                    # 9999-12-31T23:59:59Z inclusive.
-              },
-              &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                    #
-                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                    # or in gsutil format: gs://mybucket/path/to/test.xml
-                    # with version-specific info,
-                    # gs://mybucket/path/to/test.xml#1360383693690000
-                    #
-                    # An INVALID_ARGUMENT error will be returned if the URI format is not
-                    # supported.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  #
-                  # Test case references are canonically ordered lexicographically by these three
-                  # factors:
-                  # * First, by test_suite_name.
-                  # * Second, by class_name.
-                  # * Third, by name.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                    #
-                    # Required.
-                &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-              },
-            },
-          ],
-        },
-        &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
-            # log by server, or uploaded directly by user. This references should only be
-            # called when test suites are fully parsed or uploaded.
-            #
-            # The maximum allowed number of test suite overviews per step is 1000.
-            #
-            # - In response: always set
-            # - In create request: optional
-            # - In update request: never (use publishXunitXmlFiles custom method instead)
-          { # A summary of a test suite result either parsed from XML or uploaded
-              # directly by a user.
-              #
-              # Note: the API related comments are for StepService only. This message is
-              # also being used in ExecutionService in a read only mode for the corresponding
-              # step.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
-                # A Duration represents a signed, fixed-length span of time represented
-                # as a count of seconds and fractions of seconds at nanosecond
-                # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                # two Timestamp values is a Duration and it can be added or subtracted
-                # from a Timestamp. Range is approximately +-10,000 years.
-              &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                  # of time. Durations less than one second are represented with a 0
-                  # `seconds` field and a positive or negative `nanos` field. For durations
-                  # of one second or more, a non-zero value for the `nanos` field must be
-                  # of the same sign as the `seconds` field. Must be from -999,999,999
-                  # to +999,999,999 inclusive.
-              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-            },
-            &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
-                # attempts.
-                #
-                # Present only for rollup test suite overview at environment level. A step
-                # cannot have flaky test cases.
-            &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
-                # XML file is stored.
-                #
-                # Note: Multiple test suites can share the same xml_source
-                #
-                # Returns INVALID_ARGUMENT if the uri format is not supported.
-                #
-                # - In create/response: optional
-                # - In update request: never
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-            &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
-                # xml_source. May also be set by the user.
-                #
-                # - In create/response: always set
-                # - In update request: never
-          },
-        ],
-        &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
-            #
-            # - In response: present if set by create or update
-            # - In create/update request: optional
-          &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
-              #
-              # - In response: present if previously set.
-              # - In create/update request: optional
-              # A Duration represents a signed, fixed-length span of time represented
-              # as a count of seconds and fractions of seconds at nanosecond
-              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-              # or &quot;month&quot;. It is related to Timestamp in that the difference between
-              # two Timestamp values is a Duration and it can be added or subtracted
-              # from a Timestamp. Range is approximately +-10,000 years.
-            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                # of time. Durations less than one second are represented with a 0
-                # `seconds` field and a positive or negative `nanos` field. For durations
-                # of one second or more, a non-zero value for the `nanos` field must be
-                # of the same sign as the `seconds` field. Must be from -999,999,999
-                # to +999,999,999 inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-          },
-        },
-      },
-      &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-          # calendar, encoded as a count of seconds and fractions of seconds at
-          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-          # January 1, 1970, in the proleptic Gregorian calendar which extends the
-          # Gregorian calendar backwards to year one.
-          #
-          # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-          # second table is needed for interpretation, using a [24-hour linear
-          # smear](https://developers.google.com/time/smear).
-          #
-          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-          # restricting to that range, we ensure that we can convert to and from [RFC
-          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-        &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-            # second values with fractions must still have non-negative nanos values
-            # that count forward in time. Must be from 0 to 999,999,999
-            # inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-            # 9999-12-31T23:59:59Z inclusive.
-      },
-      &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
-          # The only legal state transitions are
-          # * IN_PROGRESS -&gt; COMPLETE
-          #
-          # A PRECONDITION_FAILED will be returned if an invalid transition is
-          # requested.
-          #
-          # It is valid to create Step with a state set to COMPLETE.
-          # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
-          # returned if the state is set to COMPLETE multiple times.
-          #
-          # - In response: always set
-          # - In create/update request: optional
-      &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
-          # Maximum of 100 characters.
-          # For example: Clean build
-          #
-          # A PRECONDITION_FAILED will be returned upon creating a new step if it
-          # shares its name and dimension_value with an existing step. If two steps
-          # represent a similar action, but have different dimension values, they
-          # should share the same name. For instance, if the same set of tests is
-          # run on two different platforms, the two steps should have the same name.
-          #
-          # - In response: always set
-          # - In create request: always set
-          # - In update request: never set
-      &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
-          # then this field allows the child to specify the values of the dimensions.
-          #
-          # The keys must exactly match the dimension_definition of the execution.
-          #
-          # For example, if the execution has
-          # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
-          # then a step must define values for those dimensions, eg.
-          # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-          #
-          # If a step does not participate in one dimension of the matrix,
-          # the value for that dimension should be empty string.
-          # For example, if one of the tests is executed by a runner which
-          # does not support retries, the step could have
-          # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-          #
-          # If the step does not participate in any dimensions of the matrix,
-          # it may leave dimension_value unset.
-          #
-          # A PRECONDITION_FAILED will be returned if any of the keys do not exist
-          # in the dimension_definition of the execution.
-          #
-          # A PRECONDITION_FAILED will be returned if another step in this execution
-          # already has the same name and dimension_value, but differs on other data
-          # fields, for example, step field is different.
-          #
-          # A PRECONDITION_FAILED will be returned if dimension_value is set, and
-          # there is a dimension_definition in the execution which is not specified
-          # as one of the keys.
-          #
-          # - In response: present if set by create
-          # - In create request: optional
-          # - In update request: never set
-        {
-          &quot;value&quot;: &quot;A String&quot;,
-          &quot;key&quot;: &quot;A String&quot;,
-        },
-      ],
-      &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
-          #
-          # This value will be set automatically when state transitions to
-          # COMPLETE.
-          #
-          # - In response: set if the execution state is COMPLETE.
-          # - In create/update request: never set
-          # calendar, encoded as a count of seconds and fractions of seconds at
-          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-          # January 1, 1970, in the proleptic Gregorian calendar which extends the
-          # Gregorian calendar backwards to year one.
-          #
-          # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-          # second table is needed for interpretation, using a [24-hour linear
-          # smear](https://developers.google.com/time/smear).
-          #
-          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-          # restricting to that range, we ensure that we can convert to and from [RFC
-          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-        &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-            # second values with fractions must still have non-negative nanos values
-            # that count forward in time. Must be from 0 to 999,999,999
-            # inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-            # 9999-12-31T23:59:59Z inclusive.
-      },
-      &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
-          # These details can be used identify which group this step is part of.
-          # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
-          # members.
-          #
-          # - In response: present if previously set.
-          # - In create request: optional, set iff this step was performed more than
-          # once.
-          # - In update request: optional
-        &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-            # Ranges from 0(inclusive) to total number of steps(exclusive).
-            # The primary step is 0.
-        &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
-        &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
-            # outcome of each individual step.
-          &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
-              # configuration as a group.
-          &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
-            { # Step Id and outcome of each individual step that was run as a group with
-                # other steps with the same configuration.
-              &quot;runDuration&quot;: { #  # How long it took for this step to run.
-                  # A Duration represents a signed, fixed-length span of time represented
-                  # as a count of seconds and fractions of seconds at nanosecond
-                  # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                  # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                  # two Timestamp values is a Duration and it can be added or subtracted
-                  # from a Timestamp. Range is approximately +-10,000 years.
-                &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                    # of time. Durations less than one second are represented with a 0
-                    # `seconds` field and a positive or negative `nanos` field. For durations
-                    # of one second or more, a non-zero value for the `nanos` field must be
-                    # of the same sign as the `seconds` field. Must be from -999,999,999
-                    # to +999,999,999 inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-              },
-              &quot;stepId&quot;: &quot;A String&quot;,
-              &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-                  # Ranges from 0(inclusive) to total number of steps(exclusive).
-                  # The primary step is 0.
-              &quot;outcomeSummary&quot;: &quot;A String&quot;,
-            },
-          ],
-        },
-      },
-      &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
-          #
-          # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-      &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-        &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
-            #
-            # Required
-        &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not FAILURE.
-            #
-            # Optional
-          &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
-              # start.
-          &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
-              # This might be caused by trying to run a test on an unsupported platform.
-          &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
-          &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
-          &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
-        },
-        &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not INCONCLUSIVE.
-            #
-            # Optional
-          &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
-              # infrastructure failures
-          &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
-              # depends on a component other than the system under test which failed.
-              #
-              # For example, a mobile test requires provisioning a device where the test
-              # executes, and that provisioning can fail.
-          &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
-              # determined.
-              # For example, the user pressed ctrl-c which sent a kill signal to the test
-              # runner while the test was running.
-        },
-        &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not SUCCESS.
-            #
-            # Optional
-            # LINT.IfChange
-          &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
-        },
-        &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not SKIPPED.
-            #
-            # Optional
-          &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
-          &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
-          &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
-        },
-      },
-      &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
-          # For example: running cp to copy artifacts from one location to another.
-        &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
-            #
-            # - In response: present if set by create/update request
-            # - In create/update request: optional
-            # copying artifacts or deploying code.
-          &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-              # argv in a C program).
-              #
-              # - In response: present if set by create request
-              # - In create request: optional
-              # - In update request: never set
-            &quot;A String&quot;,
-          ],
-          &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-              # exited.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, a FAILED_PRECONDITION error will be
-              #   returned if an exit_code is already set.
-            &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                # successful.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-              #
-              # This field can be set before the tool has exited in order to be able to
-              # have access to a live view of the logs while the tool is running.
-              #
-              # The maximum allowed number of tool logs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a file.
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-          ],
-          &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-              #
-              # The maximum allowed number of tool outputs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a ToolExecution output file.
-              &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  # calendar, encoded as a count of seconds and fractions of seconds at
-                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                  # Gregorian calendar backwards to year one.
-                  #
-                  # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                  # second table is needed for interpretation, using a [24-hour linear
-                  # smear](https://developers.google.com/time/smear).
-                  #
-                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                  # restricting to that range, we ensure that we can convert to and from [RFC
-                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                    # second values with fractions must still have non-negative nanos values
-                    # that count forward in time. Must be from 0 to 999,999,999
-                    # inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                    # 9999-12-31T23:59:59Z inclusive.
-              },
-              &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                    #
-                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                    # or in gsutil format: gs://mybucket/path/to/test.xml
-                    # with version-specific info,
-                    # gs://mybucket/path/to/test.xml#1360383693690000
-                    #
-                    # An INVALID_ARGUMENT error will be returned if the URI format is not
-                    # supported.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  #
-                  # Test case references are canonically ordered lexicographically by these three
-                  # factors:
-                  # * First, by test_suite_name.
-                  # * Second, by class_name.
-                  # * Third, by name.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                    #
-                    # Required.
-                &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-              },
-            },
-          ],
-        },
-      },
-      &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
-          #
-          # This is the device usage used for billing purpose, which is different from
-          # the run_duration, for example, infrastructure failure won&#x27;t be charged for
-          # device usage.
-          #
-          # PRECONDITION_FAILED will be returned if one attempts to set a
-          # device_usage on a step which already has this field set.
-          #
-          # - In response: present if previously set.
-          # - In create request: optional
-          # - In update request: optional
-          # A Duration represents a signed, fixed-length span of time represented
-          # as a count of seconds and fractions of seconds at nanosecond
-          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-          # or &quot;month&quot;. It is related to Timestamp in that the difference between
-          # two Timestamp values is a Duration and it can be added or subtracted
-          # from a Timestamp. Range is approximately +-10,000 years.
-        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-            # of time. Durations less than one second are represented with a 0
-            # `seconds` field and a positive or negative `nanos` field. For durations
-            # of one second or more, a non-zero value for the `nanos` field must be
-            # of the same sign as the `seconds` field. Must be from -999,999,999
-            # to +999,999,999 inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-      },
-      &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
-          # step.
-          #
-          # Users are responsible for managing the key namespace such that keys
-          # don&#x27;t accidentally collide.
-          #
-          # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
-          # if the length of any of the keys or values exceeds 100 characters.
-          #
-          # - In response: always set
-          # - In create request: optional
-          # - In update request: optional; any new key/value pair will be added to the
-          #   map, and any new value for an existing key will update that key&#x27;s value
-        {
-          &quot;value&quot;: &quot;A String&quot;,
-          &quot;key&quot;: &quot;A String&quot;,
-        },
-      ],
-    }</pre>
-</div>
-
-<div class="method">
-    <code class="details" id="get">get(projectId, historyId, executionId, stepId, x__xgafv=None)</code>
-  <pre>Gets a Step.
-
-May return any of the following canonical error codes:
-
-- PERMISSION_DENIED - if the user is not authorized to read project
-- INVALID_ARGUMENT - if the request is malformed
-- NOT_FOUND - if the Step does not exist
-
-Args:
-  projectId: string, A Project id.
-
-Required. (required)
-  historyId: string, A History id.
-
-Required. (required)
-  executionId: string, A Execution id.
-
-Required. (required)
-  stepId: string, A Step id.
-
-Required. (required)
-  x__xgafv: string, V1 error format.
-    Allowed values
-      1 - v1 error format
-      2 - v2 error format
-
-Returns:
-  An object of the form:
-
-    { # A Step represents a single operation performed as part of
-        # Execution. A step can be used to represent the execution of a tool (
-        # for example a test runner execution or an execution of a compiler).
-        #
-        # Steps can overlap (for instance two steps might have the same
-        # start time if some operations are done in parallel).
-        #
-        # Here is an example, let&#x27;s consider that we have a continuous build is
-        # executing a test runner for each iteration. The workflow would look like:
-        # - user creates a Execution with id 1
-        # - user creates an TestExecutionStep with id 100 for Execution 1
-        # - user update TestExecutionStep with id 100 to add a raw xml log
-        #     + the service parses the xml logs and returns a TestExecutionStep with
-        #      updated TestResult(s).
-        # - user update the status of TestExecutionStep with id 100 to COMPLETE
-        #
-        # A Step can be updated until its state is set to COMPLETE at which
-        # points it becomes immutable.
-        #
-        # Next tag: 27
-      &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
-          # thumbnails can be fetched with ListThumbnails.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-      &quot;runDuration&quot;: { #  # How long it took for this step to run.
-          #
-          # If unset, this is set to the difference between creation_time and
-          # completion_time when the step is set to the COMPLETE state. In some cases,
-          # it is appropriate to set this value separately: For instance, if a step is
-          # created, but the operation it represents is queued for a few minutes before
-          # it executes, it would be appropriate not to include the time spent queued
-          # in its run_duration.
-          #
-          # PRECONDITION_FAILED will be returned if one attempts to set a
-          # run_duration on a step which already has this field set.
-          #
-          # - In response: present if previously set; always present on COMPLETE step
-          # - In create request: optional
-          # - In update request: optional
-          # A Duration represents a signed, fixed-length span of time represented
-          # as a count of seconds and fractions of seconds at nanosecond
-          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-          # or &quot;month&quot;. It is related to Timestamp in that the difference between
-          # two Timestamp values is a Duration and it can be added or subtracted
-          # from a Timestamp. Range is approximately +-10,000 years.
-        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-            # of time. Durations less than one second are represented with a 0
-            # `seconds` field and a positive or negative `nanos` field. For durations
-            # of one second or more, a non-zero value for the `nanos` field must be
-            # of the same sign as the `seconds` field. Must be from -999,999,999
-            # to +999,999,999 inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-      },
-      &quot;description&quot;: &quot;A String&quot;, # A description of this tool
-          # For example: mvn clean package -D skipTests=true
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-      &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
-          #
-          # It accepts ant-junit xml files which will be parsed into structured test
-          # results by the service. Xml file paths are updated in order to append more
-          # files, however they can&#x27;t be deleted.
-          #
-          # Users can also add test results manually by using the test_result field.
-        &quot;testIssues&quot;: [ # Issues observed during the test execution.
-            #
-            # For example, if the mobile app under test crashed during the test,
-            # the error message and the stack trace content can be recorded here
-            # to assist debugging.
-            #
-            # - In response: present if set by create or update
-            # - In create/update request: optional
-          { # An issue detected occurring during a test execution.
-            &quot;warning&quot;: { #  # Warning message with additional details of the issue.
-                # Should always be a message from com.google.devtools.toolresults.v1.warnings
-                # `Any` contains an arbitrary serialized protocol buffer message along with a
-                # URL that describes the type of the serialized message.
-                #
-                # Protobuf library provides support to pack/unpack Any values in the form
-                # of utility functions or additional generated methods of the Any type.
-                #
-                # Example 1: Pack and unpack a message in C++.
-                #
-                #     Foo foo = ...;
-                #     Any any;
-                #     any.PackFrom(foo);
-                #     ...
-                #     if (any.UnpackTo(&amp;foo)) {
-                #       ...
-                #     }
-                #
-                # Example 2: Pack and unpack a message in Java.
-                #
-                #     Foo foo = ...;
-                #     Any any = Any.pack(foo);
-                #     ...
-                #     if (any.is(Foo.class)) {
-                #       foo = any.unpack(Foo.class);
-                #     }
-                #
-                #  Example 3: Pack and unpack a message in Python.
-                #
-                #     foo = Foo(...)
-                #     any = Any()
-                #     any.Pack(foo)
-                #     ...
-                #     if any.Is(Foo.DESCRIPTOR):
-                #       any.Unpack(foo)
-                #       ...
-                #
-                #  Example 4: Pack and unpack a message in Go
-                #
-                #      foo := &amp;pb.Foo{...}
-                #      any, err := ptypes.MarshalAny(foo)
-                #      ...
-                #      foo := &amp;pb.Foo{}
-                #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
-                #        ...
-                #      }
-                #
-                # The pack methods provided by protobuf library will by default use
-                # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
-                # methods only use the fully qualified type name after the last &#x27;/&#x27;
-                # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
-                # name &quot;y.z&quot;.
-                #
-                #
-                # # JSON
-                #
-                # The JSON representation of an `Any` value uses the regular
-                # representation of the deserialized, embedded message, with an
-                # additional field `@type` which contains the type URL. Example:
-                #
-                #     package google.profile;
-                #     message Person {
-                #       string first_name = 1;
-                #       string last_name = 2;
-                #     }
-                #
-                #     {
-                #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
-                #       &quot;firstName&quot;: &lt;string&gt;,
-                #       &quot;lastName&quot;: &lt;string&gt;
-                #     }
-                #
-                # If the embedded message type is well-known and has a custom JSON
-                # representation, that representation will be embedded adding a field
-                # `value` which holds the custom JSON in addition to the `@type`
-                # field. Example (for message google.protobuf.Duration):
-                #
-                #     {
-                #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
-                #       &quot;value&quot;: &quot;1.212s&quot;
-                #     }
-              &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
-                  # protocol buffer message. This string must contain at least
-                  # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
-                  # the fully qualified name of the type (as in
-                  # `path/google.protobuf.Duration`). The name should be in a canonical form
-                  # (e.g., leading &quot;.&quot; is not accepted).
-                  #
-                  # In practice, teams usually precompile into the binary all types that they
-                  # expect it to use in the context of Any. However, for URLs which use the
-                  # scheme `http`, `https`, or no scheme, one can optionally set up a type
-                  # server that maps type URLs to message definitions as follows:
-                  #
-                  # * If no scheme is provided, `https` is assumed.
-                  # * An HTTP GET on the URL must yield a google.protobuf.Type
-                  #   value in binary format, or produce an error.
-                  # * Applications are allowed to cache lookup results based on the
-                  #   URL, or have them precompiled into a binary to avoid any
-                  #   lookup. Therefore, binary compatibility needs to be preserved
-                  #   on changes to types. (Use versioned type names to manage
-                  #   breaking changes.)
-                  #
-                  # Note: this functionality is not currently available in the official
-                  # protobuf release, and it is not used for type URLs beginning with
-                  # type.googleapis.com.
-                  #
-                  # Schemes other than `http`, `https` (or the empty scheme) might be
-                  # used with implementation specific semantics.
-              &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
-            },
-            &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
-                # Required.
-            &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
-              &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
-                  #
-                  # Required
-            },
-            &quot;type&quot;: &quot;A String&quot;, # Type of issue.
-                # Required.
-            &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
-                # Required.
-            &quot;category&quot;: &quot;A String&quot;, # Category of issue.
-                # Required.
-          },
-        ],
-        &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
-            #
-            # The exit code of this tool will be used to determine if the test passed.
-            #
-            # - In response: always set
-            # - In create/update request: optional
-            # copying artifacts or deploying code.
-          &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-              # argv in a C program).
-              #
-              # - In response: present if set by create request
-              # - In create request: optional
-              # - In update request: never set
-            &quot;A String&quot;,
-          ],
-          &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-              # exited.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, a FAILED_PRECONDITION error will be
-              #   returned if an exit_code is already set.
-            &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                # successful.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-              #
-              # This field can be set before the tool has exited in order to be able to
-              # have access to a live view of the logs while the tool is running.
-              #
-              # The maximum allowed number of tool logs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a file.
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-          ],
-          &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-              #
-              # The maximum allowed number of tool outputs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a ToolExecution output file.
-              &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  # calendar, encoded as a count of seconds and fractions of seconds at
-                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                  # Gregorian calendar backwards to year one.
-                  #
-                  # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                  # second table is needed for interpretation, using a [24-hour linear
-                  # smear](https://developers.google.com/time/smear).
-                  #
-                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                  # restricting to that range, we ensure that we can convert to and from [RFC
-                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                    # second values with fractions must still have non-negative nanos values
-                    # that count forward in time. Must be from 0 to 999,999,999
-                    # inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                    # 9999-12-31T23:59:59Z inclusive.
-              },
-              &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                    #
-                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                    # or in gsutil format: gs://mybucket/path/to/test.xml
-                    # with version-specific info,
-                    # gs://mybucket/path/to/test.xml#1360383693690000
-                    #
-                    # An INVALID_ARGUMENT error will be returned if the URI format is not
-                    # supported.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  #
-                  # Test case references are canonically ordered lexicographically by these three
-                  # factors:
-                  # * First, by test_suite_name.
-                  # * Second, by class_name.
-                  # * Third, by name.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                    #
-                    # Required.
-                &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-              },
-            },
-          ],
-        },
-        &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
-            # log by server, or uploaded directly by user. This references should only be
-            # called when test suites are fully parsed or uploaded.
-            #
-            # The maximum allowed number of test suite overviews per step is 1000.
-            #
-            # - In response: always set
-            # - In create request: optional
-            # - In update request: never (use publishXunitXmlFiles custom method instead)
-          { # A summary of a test suite result either parsed from XML or uploaded
-              # directly by a user.
-              #
-              # Note: the API related comments are for StepService only. This message is
-              # also being used in ExecutionService in a read only mode for the corresponding
-              # step.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
-                # A Duration represents a signed, fixed-length span of time represented
-                # as a count of seconds and fractions of seconds at nanosecond
-                # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                # two Timestamp values is a Duration and it can be added or subtracted
-                # from a Timestamp. Range is approximately +-10,000 years.
-              &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                  # of time. Durations less than one second are represented with a 0
-                  # `seconds` field and a positive or negative `nanos` field. For durations
-                  # of one second or more, a non-zero value for the `nanos` field must be
-                  # of the same sign as the `seconds` field. Must be from -999,999,999
-                  # to +999,999,999 inclusive.
-              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-            },
-            &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
-                # attempts.
-                #
-                # Present only for rollup test suite overview at environment level. A step
-                # cannot have flaky test cases.
-            &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
-                # XML file is stored.
-                #
-                # Note: Multiple test suites can share the same xml_source
-                #
-                # Returns INVALID_ARGUMENT if the uri format is not supported.
-                #
-                # - In create/response: optional
-                # - In update request: never
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-            &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
-                # xml_source. May also be set by the user.
-                #
-                # - In create/response: always set
-                # - In update request: never
-          },
-        ],
-        &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
-            #
-            # - In response: present if set by create or update
-            # - In create/update request: optional
-          &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
-              #
-              # - In response: present if previously set.
-              # - In create/update request: optional
-              # A Duration represents a signed, fixed-length span of time represented
-              # as a count of seconds and fractions of seconds at nanosecond
-              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-              # or &quot;month&quot;. It is related to Timestamp in that the difference between
-              # two Timestamp values is a Duration and it can be added or subtracted
-              # from a Timestamp. Range is approximately +-10,000 years.
-            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                # of time. Durations less than one second are represented with a 0
-                # `seconds` field and a positive or negative `nanos` field. For durations
-                # of one second or more, a non-zero value for the `nanos` field must be
-                # of the same sign as the `seconds` field. Must be from -999,999,999
-                # to +999,999,999 inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-          },
-        },
-      },
-      &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-          # calendar, encoded as a count of seconds and fractions of seconds at
-          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-          # January 1, 1970, in the proleptic Gregorian calendar which extends the
-          # Gregorian calendar backwards to year one.
-          #
-          # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-          # second table is needed for interpretation, using a [24-hour linear
-          # smear](https://developers.google.com/time/smear).
-          #
-          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-          # restricting to that range, we ensure that we can convert to and from [RFC
-          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-        &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-            # second values with fractions must still have non-negative nanos values
-            # that count forward in time. Must be from 0 to 999,999,999
-            # inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-            # 9999-12-31T23:59:59Z inclusive.
-      },
-      &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
-          # The only legal state transitions are
-          # * IN_PROGRESS -&gt; COMPLETE
-          #
-          # A PRECONDITION_FAILED will be returned if an invalid transition is
-          # requested.
-          #
-          # It is valid to create Step with a state set to COMPLETE.
-          # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
-          # returned if the state is set to COMPLETE multiple times.
-          #
-          # - In response: always set
-          # - In create/update request: optional
-      &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
-          # Maximum of 100 characters.
-          # For example: Clean build
-          #
-          # A PRECONDITION_FAILED will be returned upon creating a new step if it
-          # shares its name and dimension_value with an existing step. If two steps
-          # represent a similar action, but have different dimension values, they
-          # should share the same name. For instance, if the same set of tests is
-          # run on two different platforms, the two steps should have the same name.
-          #
-          # - In response: always set
-          # - In create request: always set
-          # - In update request: never set
-      &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
-          # then this field allows the child to specify the values of the dimensions.
-          #
-          # The keys must exactly match the dimension_definition of the execution.
-          #
-          # For example, if the execution has
-          # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
-          # then a step must define values for those dimensions, eg.
-          # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-          #
-          # If a step does not participate in one dimension of the matrix,
-          # the value for that dimension should be empty string.
-          # For example, if one of the tests is executed by a runner which
-          # does not support retries, the step could have
-          # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-          #
-          # If the step does not participate in any dimensions of the matrix,
-          # it may leave dimension_value unset.
-          #
-          # A PRECONDITION_FAILED will be returned if any of the keys do not exist
-          # in the dimension_definition of the execution.
-          #
-          # A PRECONDITION_FAILED will be returned if another step in this execution
-          # already has the same name and dimension_value, but differs on other data
-          # fields, for example, step field is different.
-          #
-          # A PRECONDITION_FAILED will be returned if dimension_value is set, and
-          # there is a dimension_definition in the execution which is not specified
-          # as one of the keys.
-          #
-          # - In response: present if set by create
-          # - In create request: optional
-          # - In update request: never set
-        {
-          &quot;value&quot;: &quot;A String&quot;,
-          &quot;key&quot;: &quot;A String&quot;,
-        },
-      ],
-      &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
-          #
-          # This value will be set automatically when state transitions to
-          # COMPLETE.
-          #
-          # - In response: set if the execution state is COMPLETE.
-          # - In create/update request: never set
-          # calendar, encoded as a count of seconds and fractions of seconds at
-          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-          # January 1, 1970, in the proleptic Gregorian calendar which extends the
-          # Gregorian calendar backwards to year one.
-          #
-          # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-          # second table is needed for interpretation, using a [24-hour linear
-          # smear](https://developers.google.com/time/smear).
-          #
-          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-          # restricting to that range, we ensure that we can convert to and from [RFC
-          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-        &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-            # second values with fractions must still have non-negative nanos values
-            # that count forward in time. Must be from 0 to 999,999,999
-            # inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-            # 9999-12-31T23:59:59Z inclusive.
-      },
-      &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
-          # These details can be used identify which group this step is part of.
-          # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
-          # members.
-          #
-          # - In response: present if previously set.
-          # - In create request: optional, set iff this step was performed more than
-          # once.
-          # - In update request: optional
-        &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-            # Ranges from 0(inclusive) to total number of steps(exclusive).
-            # The primary step is 0.
-        &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
-        &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
-            # outcome of each individual step.
-          &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
-              # configuration as a group.
-          &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
-            { # Step Id and outcome of each individual step that was run as a group with
-                # other steps with the same configuration.
-              &quot;runDuration&quot;: { #  # How long it took for this step to run.
-                  # A Duration represents a signed, fixed-length span of time represented
-                  # as a count of seconds and fractions of seconds at nanosecond
-                  # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                  # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                  # two Timestamp values is a Duration and it can be added or subtracted
-                  # from a Timestamp. Range is approximately +-10,000 years.
-                &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                    # of time. Durations less than one second are represented with a 0
-                    # `seconds` field and a positive or negative `nanos` field. For durations
-                    # of one second or more, a non-zero value for the `nanos` field must be
-                    # of the same sign as the `seconds` field. Must be from -999,999,999
-                    # to +999,999,999 inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-              },
-              &quot;stepId&quot;: &quot;A String&quot;,
-              &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-                  # Ranges from 0(inclusive) to total number of steps(exclusive).
-                  # The primary step is 0.
-              &quot;outcomeSummary&quot;: &quot;A String&quot;,
-            },
-          ],
-        },
-      },
-      &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
-          #
-          # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-      &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-        &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
-            #
-            # Required
-        &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not FAILURE.
-            #
-            # Optional
-          &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
-              # start.
-          &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
-              # This might be caused by trying to run a test on an unsupported platform.
-          &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
-          &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
-          &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
-        },
-        &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not INCONCLUSIVE.
-            #
-            # Optional
-          &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
-              # infrastructure failures
-          &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
-              # depends on a component other than the system under test which failed.
-              #
-              # For example, a mobile test requires provisioning a device where the test
-              # executes, and that provisioning can fail.
-          &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
-              # determined.
-              # For example, the user pressed ctrl-c which sent a kill signal to the test
-              # runner while the test was running.
-        },
-        &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not SUCCESS.
-            #
-            # Optional
-            # LINT.IfChange
-          &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
-        },
-        &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not SKIPPED.
-            #
-            # Optional
-          &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
-          &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
-          &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
-        },
-      },
-      &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
-          # For example: running cp to copy artifacts from one location to another.
-        &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
-            #
-            # - In response: present if set by create/update request
-            # - In create/update request: optional
-            # copying artifacts or deploying code.
-          &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-              # argv in a C program).
-              #
-              # - In response: present if set by create request
-              # - In create request: optional
-              # - In update request: never set
-            &quot;A String&quot;,
-          ],
-          &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-              # exited.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, a FAILED_PRECONDITION error will be
-              #   returned if an exit_code is already set.
-            &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                # successful.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-              #
-              # This field can be set before the tool has exited in order to be able to
-              # have access to a live view of the logs while the tool is running.
-              #
-              # The maximum allowed number of tool logs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a file.
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-          ],
-          &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-              #
-              # The maximum allowed number of tool outputs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a ToolExecution output file.
-              &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  # calendar, encoded as a count of seconds and fractions of seconds at
-                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                  # Gregorian calendar backwards to year one.
-                  #
-                  # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                  # second table is needed for interpretation, using a [24-hour linear
-                  # smear](https://developers.google.com/time/smear).
-                  #
-                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                  # restricting to that range, we ensure that we can convert to and from [RFC
-                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                    # second values with fractions must still have non-negative nanos values
-                    # that count forward in time. Must be from 0 to 999,999,999
-                    # inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                    # 9999-12-31T23:59:59Z inclusive.
-              },
-              &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                    #
-                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                    # or in gsutil format: gs://mybucket/path/to/test.xml
-                    # with version-specific info,
-                    # gs://mybucket/path/to/test.xml#1360383693690000
-                    #
-                    # An INVALID_ARGUMENT error will be returned if the URI format is not
-                    # supported.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  #
-                  # Test case references are canonically ordered lexicographically by these three
-                  # factors:
-                  # * First, by test_suite_name.
-                  # * Second, by class_name.
-                  # * Third, by name.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                    #
-                    # Required.
-                &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-              },
-            },
-          ],
-        },
-      },
-      &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
-          #
-          # This is the device usage used for billing purpose, which is different from
-          # the run_duration, for example, infrastructure failure won&#x27;t be charged for
-          # device usage.
-          #
-          # PRECONDITION_FAILED will be returned if one attempts to set a
-          # device_usage on a step which already has this field set.
-          #
-          # - In response: present if previously set.
-          # - In create request: optional
-          # - In update request: optional
-          # A Duration represents a signed, fixed-length span of time represented
-          # as a count of seconds and fractions of seconds at nanosecond
-          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-          # or &quot;month&quot;. It is related to Timestamp in that the difference between
-          # two Timestamp values is a Duration and it can be added or subtracted
-          # from a Timestamp. Range is approximately +-10,000 years.
-        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-            # of time. Durations less than one second are represented with a 0
-            # `seconds` field and a positive or negative `nanos` field. For durations
-            # of one second or more, a non-zero value for the `nanos` field must be
-            # of the same sign as the `seconds` field. Must be from -999,999,999
-            # to +999,999,999 inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-      },
-      &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
-          # step.
-          #
-          # Users are responsible for managing the key namespace such that keys
-          # don&#x27;t accidentally collide.
-          #
-          # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
-          # if the length of any of the keys or values exceeds 100 characters.
-          #
-          # - In response: always set
-          # - In create request: optional
-          # - In update request: optional; any new key/value pair will be added to the
-          #   map, and any new value for an existing key will update that key&#x27;s value
-        {
-          &quot;value&quot;: &quot;A String&quot;,
-          &quot;key&quot;: &quot;A String&quot;,
-        },
-      ],
-    }</pre>
+        # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+        # restricting to that range, we ensure that we can convert to and from [RFC
+        # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+      &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+          # second values with fractions must still have non-negative nanos values
+          # that count forward in time. Must be from 0 to 999,999,999
+          # inclusive.
+      &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+          # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+          # 9999-12-31T23:59:59Z inclusive.
+    },
+  }</pre>
 </div>
 
 <div class="method">
@@ -2808,6 +2808,8 @@
   An object of the form:
 
     { # A summary of perf metrics collected and performance environment info
+      &quot;stepId&quot;: &quot;A String&quot;, # A tool results step ID.
+          # @OutputOnly
       &quot;historyId&quot;: &quot;A String&quot;, # A tool results history ID.
           # @OutputOnly
       &quot;perfEnvironment&quot;: { # Encapsulates performance environment info # Describes the environment in which the performance metrics were collected
@@ -2827,10 +2829,6 @@
           # For more info see:
           # https://developer.android.com/training/testing/performance.html
           # Statistics will only be present for API 23+.
-        &quot;p95Millis&quot;: &quot;A String&quot;, # 95th percentile frame render time in milliseconds.
-        &quot;missedVsyncCount&quot;: &quot;A String&quot;, # Total &quot;missed vsync&quot; events.
-        &quot;p90Millis&quot;: &quot;A String&quot;, # 90th percentile frame render time in milliseconds.
-        &quot;jankyFrames&quot;: &quot;A String&quot;, # Total frames with slow render time. Should be &lt;= total_frames.
         &quot;slowBitmapUploadCount&quot;: &quot;A String&quot;, # Total &quot;slow bitmap upload&quot; events.
         &quot;buckets&quot;: [ # Histogram of frame render times. There should be 154 buckets ranging from
             # [5ms, 6ms) to [4950ms, infinity)
@@ -2845,6 +2843,10 @@
         &quot;p99Millis&quot;: &quot;A String&quot;, # 99th percentile frame render time in milliseconds.
         &quot;slowDrawCount&quot;: &quot;A String&quot;, # Total &quot;slow draw&quot; events.
         &quot;highInputLatencyCount&quot;: &quot;A String&quot;, # Total &quot;high input latency&quot; events.
+        &quot;p95Millis&quot;: &quot;A String&quot;, # 95th percentile frame render time in milliseconds.
+        &quot;missedVsyncCount&quot;: &quot;A String&quot;, # Total &quot;missed vsync&quot; events.
+        &quot;p90Millis&quot;: &quot;A String&quot;, # 90th percentile frame render time in milliseconds.
+        &quot;jankyFrames&quot;: &quot;A String&quot;, # Total frames with slow render time. Should be &lt;= total_frames.
       },
       &quot;projectId&quot;: &quot;A String&quot;, # The cloud project
           # @OutputOnly
@@ -2861,15 +2863,15 @@
             # or &quot;month&quot;. It is related to Timestamp in that the difference between
             # two Timestamp values is a Duration and it can be added or subtracted
             # from a Timestamp. Range is approximately +-10,000 years.
+          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
           &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
               # of time. Durations less than one second are represented with a 0
               # `seconds` field and a positive or negative `nanos` field. For durations
               # of one second or more, a non-zero value for the `nanos` field must be
               # of the same sign as the `seconds` field. Must be from -999,999,999
               # to +999,999,999 inclusive.
-          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
         },
         &quot;fullyDrawnTime&quot;: { #  # Optional. The time from app start to reaching the developer-reported
             # &quot;fully drawn&quot; time. This is only stored if the app includes a call to
@@ -2881,21 +2883,19 @@
             # or &quot;month&quot;. It is related to Timestamp in that the difference between
             # two Timestamp values is a Duration and it can be added or subtracted
             # from a Timestamp. Range is approximately +-10,000 years.
+          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
           &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
               # of time. Durations less than one second are represented with a 0
               # `seconds` field and a positive or negative `nanos` field. For durations
               # of one second or more, a non-zero value for the `nanos` field must be
               # of the same sign as the `seconds` field. Must be from -999,999,999
               # to +999,999,999 inclusive.
-          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
         },
       },
       &quot;executionId&quot;: &quot;A String&quot;, # A tool results execution ID.
           # @OutputOnly
-      &quot;stepId&quot;: &quot;A String&quot;, # A tool results step ID.
-          # @OutputOnly
     }</pre>
 </div>
 
@@ -2944,401 +2944,336 @@
   An object of the form:
 
     { # Response message for StepService.List.
-    &quot;nextPageToken&quot;: &quot;A String&quot;, # A continuation token to resume the query at the next item.
-        #
-        # If set, indicates that there are more steps to read, by calling list again
-        # with this value in the page_token field.
     &quot;steps&quot;: [ # Steps.
       { # A Step represents a single operation performed as part of
-            # Execution. A step can be used to represent the execution of a tool (
-            # for example a test runner execution or an execution of a compiler).
+          # Execution. A step can be used to represent the execution of a tool (
+          # for example a test runner execution or an execution of a compiler).
+          #
+          # Steps can overlap (for instance two steps might have the same
+          # start time if some operations are done in parallel).
+          #
+          # Here is an example, let&#x27;s consider that we have a continuous build is
+          # executing a test runner for each iteration. The workflow would look like:
+          # - user creates a Execution with id 1
+          # - user creates an TestExecutionStep with id 100 for Execution 1
+          # - user update TestExecutionStep with id 100 to add a raw xml log
+          #     + the service parses the xml logs and returns a TestExecutionStep with
+          #      updated TestResult(s).
+          # - user update the status of TestExecutionStep with id 100 to COMPLETE
+          #
+          # A Step can be updated until its state is set to COMPLETE at which
+          # points it becomes immutable.
+          #
+          # Next tag: 27
+        &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
+            # The only legal state transitions are
+            # * IN_PROGRESS -&gt; COMPLETE
             #
-            # Steps can overlap (for instance two steps might have the same
-            # start time if some operations are done in parallel).
+            # A PRECONDITION_FAILED will be returned if an invalid transition is
+            # requested.
             #
-            # Here is an example, let&#x27;s consider that we have a continuous build is
-            # executing a test runner for each iteration. The workflow would look like:
-            # - user creates a Execution with id 1
-            # - user creates an TestExecutionStep with id 100 for Execution 1
-            # - user update TestExecutionStep with id 100 to add a raw xml log
-            #     + the service parses the xml logs and returns a TestExecutionStep with
-            #      updated TestResult(s).
-            # - user update the status of TestExecutionStep with id 100 to COMPLETE
+            # It is valid to create Step with a state set to COMPLETE.
+            # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
+            # returned if the state is set to COMPLETE multiple times.
             #
-            # A Step can be updated until its state is set to COMPLETE at which
-            # points it becomes immutable.
+            # - In response: always set
+            # - In create/update request: optional
+        &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
+            # Maximum of 100 characters.
+            # For example: Clean build
             #
-            # Next tag: 27
-          &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
-              # thumbnails can be fetched with ListThumbnails.
-              #
-              # - In response: always set
-              # - In create/update request: never set
-          &quot;runDuration&quot;: { #  # How long it took for this step to run.
-              #
-              # If unset, this is set to the difference between creation_time and
-              # completion_time when the step is set to the COMPLETE state. In some cases,
-              # it is appropriate to set this value separately: For instance, if a step is
-              # created, but the operation it represents is queued for a few minutes before
-              # it executes, it would be appropriate not to include the time spent queued
-              # in its run_duration.
-              #
-              # PRECONDITION_FAILED will be returned if one attempts to set a
-              # run_duration on a step which already has this field set.
-              #
-              # - In response: present if previously set; always present on COMPLETE step
-              # - In create request: optional
-              # - In update request: optional
-              # A Duration represents a signed, fixed-length span of time represented
-              # as a count of seconds and fractions of seconds at nanosecond
-              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-              # or &quot;month&quot;. It is related to Timestamp in that the difference between
-              # two Timestamp values is a Duration and it can be added or subtracted
-              # from a Timestamp. Range is approximately +-10,000 years.
-            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                # of time. Durations less than one second are represented with a 0
-                # `seconds` field and a positive or negative `nanos` field. For durations
-                # of one second or more, a non-zero value for the `nanos` field must be
-                # of the same sign as the `seconds` field. Must be from -999,999,999
-                # to +999,999,999 inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+            # A PRECONDITION_FAILED will be returned upon creating a new step if it
+            # shares its name and dimension_value with an existing step. If two steps
+            # represent a similar action, but have different dimension values, they
+            # should share the same name. For instance, if the same set of tests is
+            # run on two different platforms, the two steps should have the same name.
+            #
+            # - In response: always set
+            # - In create request: always set
+            # - In update request: never set
+        &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
+            # then this field allows the child to specify the values of the dimensions.
+            #
+            # The keys must exactly match the dimension_definition of the execution.
+            #
+            # For example, if the execution has
+            # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
+            # then a step must define values for those dimensions, eg.
+            # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
+            #
+            # If a step does not participate in one dimension of the matrix,
+            # the value for that dimension should be empty string.
+            # For example, if one of the tests is executed by a runner which
+            # does not support retries, the step could have
+            # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
+            #
+            # If the step does not participate in any dimensions of the matrix,
+            # it may leave dimension_value unset.
+            #
+            # A PRECONDITION_FAILED will be returned if any of the keys do not exist
+            # in the dimension_definition of the execution.
+            #
+            # A PRECONDITION_FAILED will be returned if another step in this execution
+            # already has the same name and dimension_value, but differs on other data
+            # fields, for example, step field is different.
+            #
+            # A PRECONDITION_FAILED will be returned if dimension_value is set, and
+            # there is a dimension_definition in the execution which is not specified
+            # as one of the keys.
+            #
+            # - In response: present if set by create
+            # - In create request: optional
+            # - In update request: never set
+          {
+            &quot;key&quot;: &quot;A String&quot;,
+            &quot;value&quot;: &quot;A String&quot;,
           },
-          &quot;description&quot;: &quot;A String&quot;, # A description of this tool
-              # For example: mvn clean package -D skipTests=true
-              #
-              # - In response: present if set by create/update request
-              # - In create/update request: optional
-          &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
-              #
-              # It accepts ant-junit xml files which will be parsed into structured test
-              # results by the service. Xml file paths are updated in order to append more
-              # files, however they can&#x27;t be deleted.
-              #
-              # Users can also add test results manually by using the test_result field.
-            &quot;testIssues&quot;: [ # Issues observed during the test execution.
-                #
-                # For example, if the mobile app under test crashed during the test,
-                # the error message and the stack trace content can be recorded here
-                # to assist debugging.
-                #
-                # - In response: present if set by create or update
-                # - In create/update request: optional
-              { # An issue detected occurring during a test execution.
-                &quot;warning&quot;: { #  # Warning message with additional details of the issue.
-                    # Should always be a message from com.google.devtools.toolresults.v1.warnings
-                    # `Any` contains an arbitrary serialized protocol buffer message along with a
-                    # URL that describes the type of the serialized message.
-                    #
-                    # Protobuf library provides support to pack/unpack Any values in the form
-                    # of utility functions or additional generated methods of the Any type.
-                    #
-                    # Example 1: Pack and unpack a message in C++.
-                    #
-                    #     Foo foo = ...;
-                    #     Any any;
-                    #     any.PackFrom(foo);
-                    #     ...
-                    #     if (any.UnpackTo(&amp;foo)) {
-                    #       ...
-                    #     }
-                    #
-                    # Example 2: Pack and unpack a message in Java.
-                    #
-                    #     Foo foo = ...;
-                    #     Any any = Any.pack(foo);
-                    #     ...
-                    #     if (any.is(Foo.class)) {
-                    #       foo = any.unpack(Foo.class);
-                    #     }
-                    #
-                    #  Example 3: Pack and unpack a message in Python.
-                    #
-                    #     foo = Foo(...)
-                    #     any = Any()
-                    #     any.Pack(foo)
-                    #     ...
-                    #     if any.Is(Foo.DESCRIPTOR):
-                    #       any.Unpack(foo)
-                    #       ...
-                    #
-                    #  Example 4: Pack and unpack a message in Go
-                    #
-                    #      foo := &amp;pb.Foo{...}
-                    #      any, err := ptypes.MarshalAny(foo)
-                    #      ...
-                    #      foo := &amp;pb.Foo{}
-                    #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
-                    #        ...
-                    #      }
-                    #
-                    # The pack methods provided by protobuf library will by default use
-                    # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
-                    # methods only use the fully qualified type name after the last &#x27;/&#x27;
-                    # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
-                    # name &quot;y.z&quot;.
-                    #
-                    #
-                    # # JSON
-                    #
-                    # The JSON representation of an `Any` value uses the regular
-                    # representation of the deserialized, embedded message, with an
-                    # additional field `@type` which contains the type URL. Example:
-                    #
-                    #     package google.profile;
-                    #     message Person {
-                    #       string first_name = 1;
-                    #       string last_name = 2;
-                    #     }
-                    #
-                    #     {
-                    #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
-                    #       &quot;firstName&quot;: &lt;string&gt;,
-                    #       &quot;lastName&quot;: &lt;string&gt;
-                    #     }
-                    #
-                    # If the embedded message type is well-known and has a custom JSON
-                    # representation, that representation will be embedded adding a field
-                    # `value` which holds the custom JSON in addition to the `@type`
-                    # field. Example (for message google.protobuf.Duration):
-                    #
-                    #     {
-                    #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
-                    #       &quot;value&quot;: &quot;1.212s&quot;
-                    #     }
-                  &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
-                      # protocol buffer message. This string must contain at least
-                      # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
-                      # the fully qualified name of the type (as in
-                      # `path/google.protobuf.Duration`). The name should be in a canonical form
-                      # (e.g., leading &quot;.&quot; is not accepted).
-                      #
-                      # In practice, teams usually precompile into the binary all types that they
-                      # expect it to use in the context of Any. However, for URLs which use the
-                      # scheme `http`, `https`, or no scheme, one can optionally set up a type
-                      # server that maps type URLs to message definitions as follows:
-                      #
-                      # * If no scheme is provided, `https` is assumed.
-                      # * An HTTP GET on the URL must yield a google.protobuf.Type
-                      #   value in binary format, or produce an error.
-                      # * Applications are allowed to cache lookup results based on the
-                      #   URL, or have them precompiled into a binary to avoid any
-                      #   lookup. Therefore, binary compatibility needs to be preserved
-                      #   on changes to types. (Use versioned type names to manage
-                      #   breaking changes.)
-                      #
-                      # Note: this functionality is not currently available in the official
-                      # protobuf release, and it is not used for type URLs beginning with
-                      # type.googleapis.com.
-                      #
-                      # Schemes other than `http`, `https` (or the empty scheme) might be
-                      # used with implementation specific semantics.
-                  &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
-                },
-                &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
-                    # Required.
-                &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
-                  &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
-                      #
-                      # Required
-                },
-                &quot;type&quot;: &quot;A String&quot;, # Type of issue.
-                    # Required.
-                &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
-                    # Required.
-                &quot;category&quot;: &quot;A String&quot;, # Category of issue.
-                    # Required.
-              },
-            ],
-            &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
-                #
-                # The exit code of this tool will be used to determine if the test passed.
-                #
-                # - In response: always set
-                # - In create/update request: optional
-                # copying artifacts or deploying code.
-              &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-                  # argv in a C program).
-                  #
-                  # - In response: present if set by create request
-                  # - In create request: optional
-                  # - In update request: never set
-                &quot;A String&quot;,
-              ],
-              &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-                  # exited.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create request: optional
-                  # - In update request: optional, a FAILED_PRECONDITION error will be
-                  #   returned if an exit_code is already set.
-                &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                    # successful.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-                  #
-                  # This field can be set before the tool has exited in order to be able to
-                  # have access to a live view of the logs while the tool is running.
-                  #
-                  # The maximum allowed number of tool logs per step is 1000.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create request: optional
-                  # - In update request: optional, any value provided will be appended to the
-                  #   existing list
-                { # A reference to a file.
-                  &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                      #
-                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                      # or in gsutil format: gs://mybucket/path/to/test.xml
-                      # with version-specific info,
-                      # gs://mybucket/path/to/test.xml#1360383693690000
-                      #
-                      # An INVALID_ARGUMENT error will be returned if the URI format is not
-                      # supported.
-                      #
-                      # - In response: always set
-                      # - In create/update request: always set
-                },
-              ],
-              &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-                  #
-                  # The maximum allowed number of tool outputs per step is 1000.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create request: optional
-                  # - In update request: optional, any value provided will be appended to the
-                  #   existing list
-                { # A reference to a ToolExecution output file.
-                  &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                      #
-                      # - In response: present if set by create/update request
-                      # - In create/update request: optional
-                      # calendar, encoded as a count of seconds and fractions of seconds at
-                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                      # Gregorian calendar backwards to year one.
-                      #
-                      # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                      # second table is needed for interpretation, using a [24-hour linear
-                      # smear](https://developers.google.com/time/smear).
-                      #
-                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                      # restricting to that range, we ensure that we can convert to and from [RFC
-                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                    &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                        # second values with fractions must still have non-negative nanos values
-                        # that count forward in time. Must be from 0 to 999,999,999
-                        # inclusive.
-                    &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                        # 9999-12-31T23:59:59Z inclusive.
-                  },
-                  &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                      #
-                      # - In response: always set
-                      # - In create/update request: always set
-                    &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                        #
-                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                        # or in gsutil format: gs://mybucket/path/to/test.xml
-                        # with version-specific info,
-                        # gs://mybucket/path/to/test.xml#1360383693690000
-                        #
-                        # An INVALID_ARGUMENT error will be returned if the URI format is not
-                        # supported.
-                        #
-                        # - In response: always set
-                        # - In create/update request: always set
-                  },
-                  &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                      #
-                      # - In response: present if set by create/update request
-                      # - In create/update request: optional
-                      #
-                      # Test case references are canonically ordered lexicographically by these three
-                      # factors:
-                      # * First, by test_suite_name.
-                      # * Second, by class_name.
-                      # * Third, by name.
-                    &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                        #
-                        # Required.
-                    &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                    &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-                  },
-                },
-              ],
-            },
-            &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
-                # log by server, or uploaded directly by user. This references should only be
-                # called when test suites are fully parsed or uploaded.
-                #
-                # The maximum allowed number of test suite overviews per step is 1000.
-                #
-                # - In response: always set
-                # - In create request: optional
-                # - In update request: never (use publishXunitXmlFiles custom method instead)
-              { # A summary of a test suite result either parsed from XML or uploaded
-                  # directly by a user.
-                  #
-                  # Note: the API related comments are for StepService only. This message is
-                  # also being used in ExecutionService in a read only mode for the corresponding
-                  # step.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
-                    #
-                    # - In create/response: always set
-                    # - In update request: never
-                &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
+        ],
+        &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
+            #
+            # This value will be set automatically when state transitions to
+            # COMPLETE.
+            #
+            # - In response: set if the execution state is COMPLETE.
+            # - In create/update request: never set
+            # calendar, encoded as a count of seconds and fractions of seconds at
+            # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+            # January 1, 1970, in the proleptic Gregorian calendar which extends the
+            # Gregorian calendar backwards to year one.
+            #
+            # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+            # second table is needed for interpretation, using a [24-hour linear
+            # smear](https://developers.google.com/time/smear).
+            #
+            # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+            # restricting to that range, we ensure that we can convert to and from [RFC
+            # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+          &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+              # second values with fractions must still have non-negative nanos values
+              # that count forward in time. Must be from 0 to 999,999,999
+              # inclusive.
+          &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+              # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+              # 9999-12-31T23:59:59Z inclusive.
+        },
+        &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
+            # These details can be used identify which group this step is part of.
+            # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
+            # members.
+            #
+            # - In response: present if previously set.
+            # - In create request: optional, set iff this step was performed more than
+            # once.
+            # - In update request: optional
+          &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
+              # outcome of each individual step.
+            &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
+                # configuration as a group.
+            &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
+              { # Step Id and outcome of each individual step that was run as a group with
+                  # other steps with the same configuration.
+                &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+                    # Ranges from 0(inclusive) to total number of steps(exclusive).
+                    # The primary step is 0.
+                &quot;outcomeSummary&quot;: &quot;A String&quot;,
+                &quot;runDuration&quot;: { #  # How long it took for this step to run.
                     # A Duration represents a signed, fixed-length span of time represented
                     # as a count of seconds and fractions of seconds at nanosecond
                     # resolution. It is independent of any calendar and concepts like &quot;day&quot;
                     # or &quot;month&quot;. It is related to Timestamp in that the difference between
                     # two Timestamp values is a Duration and it can be added or subtracted
                     # from a Timestamp. Range is approximately +-10,000 years.
+                  &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                      # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                      # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                   &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
                       # of time. Durations less than one second are represented with a 0
                       # `seconds` field and a positive or negative `nanos` field. For durations
                       # of one second or more, a non-zero value for the `nanos` field must be
                       # of the same sign as the `seconds` field. Must be from -999,999,999
                       # to +999,999,999 inclusive.
-                  &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                      # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                      # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                 },
-                &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
-                    # attempts.
+                &quot;stepId&quot;: &quot;A String&quot;,
+              },
+            ],
+          },
+          &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+              # Ranges from 0(inclusive) to total number of steps(exclusive).
+              # The primary step is 0.
+          &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
+        },
+        &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
+            #
+            # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
+            #
+            # - In response: always set
+            # - In create/update request: never set
+        &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
+            #
+            # - In response: present if set by create/update request
+            # - In create/update request: optional
+          &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
+              #
+              # Returns INVALID_ARGUMENT if this field is set
+              # but the summary is not SUCCESS.
+              #
+              # Optional
+              # LINT.IfChange
+            &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
+          },
+          &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
+              #
+              # Returns INVALID_ARGUMENT if this field is set
+              # but the summary is not SKIPPED.
+              #
+              # Optional
+            &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
+            &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
+            &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
+          },
+          &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
+              #
+              # Required
+          &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
+              #
+              # Returns INVALID_ARGUMENT if this field is set
+              # but the summary is not FAILURE.
+              #
+              # Optional
+            &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
+            &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
+                # start.
+            &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
+                # This might be caused by trying to run a test on an unsupported platform.
+            &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
+            &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
+          },
+          &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
+              #
+              # Returns INVALID_ARGUMENT if this field is set
+              # but the summary is not INCONCLUSIVE.
+              #
+              # Optional
+            &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
+                # infrastructure failures
+            &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
+                # depends on a component other than the system under test which failed.
+                #
+                # For example, a mobile test requires provisioning a device where the test
+                # executes, and that provisioning can fail.
+            &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
+                # determined.
+                # For example, the user pressed ctrl-c which sent a kill signal to the test
+                # runner while the test was running.
+          },
+        },
+        &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
+            # For example: running cp to copy artifacts from one location to another.
+          &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              # copying artifacts or deploying code.
+            &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
+                # argv in a C program).
+                #
+                # - In response: present if set by create request
+                # - In create request: optional
+                # - In update request: never set
+              &quot;A String&quot;,
+            ],
+            &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+                # exited.
+                #
+                # - In response: present if set by create/update request
+                # - In create request: optional
+                # - In update request: optional, a FAILED_PRECONDITION error will be
+                #   returned if an exit_code is already set.
+              &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
+                  # successful.
+                  #
+                  # - In response: always set
+                  # - In create/update request: always set
+            },
+            &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+                #
+                # This field can be set before the tool has exited in order to be able to
+                # have access to a live view of the logs while the tool is running.
+                #
+                # The maximum allowed number of tool logs per step is 1000.
+                #
+                # - In response: present if set by create/update request
+                # - In create request: optional
+                # - In update request: optional, any value provided will be appended to the
+                #   existing list
+              { # A reference to a file.
+                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
                     #
-                    # Present only for rollup test suite overview at environment level. A step
-                    # cannot have flaky test cases.
-                &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
-                    # xml_source.
+                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                    # or in gsutil format: gs://mybucket/path/to/test.xml
+                    # with version-specific info,
+                    # gs://mybucket/path/to/test.xml#1360383693690000
                     #
-                    # - In create/response: always set
-                    # - In update request: never
-                &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
-                    # xml_source.
+                    # An INVALID_ARGUMENT error will be returned if the URI format is not
+                    # supported.
                     #
-                    # - In create/response: always set
-                    # - In update request: never
-                &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
-                    # xml_source.
+                    # - In response: always set
+                    # - In create/update request: always set
+              },
+            ],
+            &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
+                #
+                # The maximum allowed number of tool outputs per step is 1000.
+                #
+                # - In response: present if set by create/update request
+                # - In create request: optional
+                # - In update request: optional, any value provided will be appended to the
+                #   existing list
+              { # A reference to a ToolExecution output file.
+                &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
                     #
-                    # - In create/response: always set
-                    # - In update request: never
-                &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
-                    # XML file is stored.
+                    # - In response: present if set by create/update request
+                    # - In create/update request: optional
                     #
-                    # Note: Multiple test suites can share the same xml_source
+                    # Test case references are canonically ordered lexicographically by these three
+                    # factors:
+                    # * First, by test_suite_name.
+                    # * Second, by class_name.
+                    # * Third, by name.
+                  &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+                  &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+                  &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                      #
+                      # Required.
+                },
+                &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                     #
-                    # Returns INVALID_ARGUMENT if the uri format is not supported.
+                    # - In response: present if set by create/update request
+                    # - In create/update request: optional
+                    # calendar, encoded as a count of seconds and fractions of seconds at
+                    # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+                    # January 1, 1970, in the proleptic Gregorian calendar which extends the
+                    # Gregorian calendar backwards to year one.
                     #
-                    # - In create/response: optional
-                    # - In update request: never
+                    # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+                    # second table is needed for interpretation, using a [24-hour linear
+                    # smear](https://developers.google.com/time/smear).
+                    #
+                    # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+                    # restricting to that range, we ensure that we can convert to and from [RFC
+                    # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+                  &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                      # second values with fractions must still have non-negative nanos values
+                      # that count forward in time. Must be from 0 to 999,999,999
+                      # inclusive.
+                  &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+                      # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                      # 9999-12-31T23:59:59Z inclusive.
+                },
+                &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
+                    #
+                    # - In response: always set
+                    # - In create/update request: always set
                   &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
                       #
                       # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
@@ -3352,305 +3287,455 @@
                       # - In response: always set
                       # - In create/update request: always set
                 },
-                &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
-                    # xml_source. May also be set by the user.
-                    #
-                    # - In create/response: always set
-                    # - In update request: never
               },
             ],
-            &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
+          },
+        },
+        &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
+            #
+            # This is the device usage used for billing purpose, which is different from
+            # the run_duration, for example, infrastructure failure won&#x27;t be charged for
+            # device usage.
+            #
+            # PRECONDITION_FAILED will be returned if one attempts to set a
+            # device_usage on a step which already has this field set.
+            #
+            # - In response: present if previously set.
+            # - In create request: optional
+            # - In update request: optional
+            # A Duration represents a signed, fixed-length span of time represented
+            # as a count of seconds and fractions of seconds at nanosecond
+            # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+            # or &quot;month&quot;. It is related to Timestamp in that the difference between
+            # two Timestamp values is a Duration and it can be added or subtracted
+            # from a Timestamp. Range is approximately +-10,000 years.
+          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+          &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+              # of time. Durations less than one second are represented with a 0
+              # `seconds` field and a positive or negative `nanos` field. For durations
+              # of one second or more, a non-zero value for the `nanos` field must be
+              # of the same sign as the `seconds` field. Must be from -999,999,999
+              # to +999,999,999 inclusive.
+        },
+        &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
+            # step.
+            #
+            # Users are responsible for managing the key namespace such that keys
+            # don&#x27;t accidentally collide.
+            #
+            # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
+            # if the length of any of the keys or values exceeds 100 characters.
+            #
+            # - In response: always set
+            # - In create request: optional
+            # - In update request: optional; any new key/value pair will be added to the
+            #   map, and any new value for an existing key will update that key&#x27;s value
+          {
+            &quot;key&quot;: &quot;A String&quot;,
+            &quot;value&quot;: &quot;A String&quot;,
+          },
+        ],
+        &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
+            # thumbnails can be fetched with ListThumbnails.
+            #
+            # - In response: always set
+            # - In create/update request: never set
+        &quot;runDuration&quot;: { #  # How long it took for this step to run.
+            #
+            # If unset, this is set to the difference between creation_time and
+            # completion_time when the step is set to the COMPLETE state. In some cases,
+            # it is appropriate to set this value separately: For instance, if a step is
+            # created, but the operation it represents is queued for a few minutes before
+            # it executes, it would be appropriate not to include the time spent queued
+            # in its run_duration.
+            #
+            # PRECONDITION_FAILED will be returned if one attempts to set a
+            # run_duration on a step which already has this field set.
+            #
+            # - In response: present if previously set; always present on COMPLETE step
+            # - In create request: optional
+            # - In update request: optional
+            # A Duration represents a signed, fixed-length span of time represented
+            # as a count of seconds and fractions of seconds at nanosecond
+            # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+            # or &quot;month&quot;. It is related to Timestamp in that the difference between
+            # two Timestamp values is a Duration and it can be added or subtracted
+            # from a Timestamp. Range is approximately +-10,000 years.
+          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+          &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+              # of time. Durations less than one second are represented with a 0
+              # `seconds` field and a positive or negative `nanos` field. For durations
+              # of one second or more, a non-zero value for the `nanos` field must be
+              # of the same sign as the `seconds` field. Must be from -999,999,999
+              # to +999,999,999 inclusive.
+        },
+        &quot;description&quot;: &quot;A String&quot;, # A description of this tool
+            # For example: mvn clean package -D skipTests=true
+            #
+            # - In response: present if set by create/update request
+            # - In create/update request: optional
+        &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
+            #
+            # It accepts ant-junit xml files which will be parsed into structured test
+            # results by the service. Xml file paths are updated in order to append more
+            # files, however they can&#x27;t be deleted.
+            #
+            # Users can also add test results manually by using the test_result field.
+          &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
+              # log by server, or uploaded directly by user. This references should only be
+              # called when test suites are fully parsed or uploaded.
+              #
+              # The maximum allowed number of test suite overviews per step is 1000.
+              #
+              # - In response: always set
+              # - In create request: optional
+              # - In update request: never (use publishXunitXmlFiles custom method instead)
+            { # A summary of a test suite result either parsed from XML or uploaded
+                # directly by a user.
                 #
-                # - In response: present if set by create or update
-                # - In create/update request: optional
-              &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
+                # Note: the API related comments are for StepService only. This message is
+                # also being used in ExecutionService in a read only mode for the corresponding
+                # step.
+              &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
+                  # xml_source. May also be set by the user.
                   #
-                  # - In response: present if previously set.
-                  # - In create/update request: optional
+                  # - In create/response: always set
+                  # - In update request: never
+              &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
+                  #
+                  # - In create/response: always set
+                  # - In update request: never
+              &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
                   # A Duration represents a signed, fixed-length span of time represented
                   # as a count of seconds and fractions of seconds at nanosecond
                   # resolution. It is independent of any calendar and concepts like &quot;day&quot;
                   # or &quot;month&quot;. It is related to Timestamp in that the difference between
                   # two Timestamp values is a Duration and it can be added or subtracted
                   # from a Timestamp. Range is approximately +-10,000 years.
+                &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                 &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
                     # of time. Durations less than one second are represented with a 0
                     # `seconds` field and a positive or negative `nanos` field. For durations
                     # of one second or more, a non-zero value for the `nanos` field must be
                     # of the same sign as the `seconds` field. Must be from -999,999,999
                     # to +999,999,999 inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
               },
-            },
-          },
-          &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
-              #
-              # - In response: always set
-              # - In create/update request: never set
-              # calendar, encoded as a count of seconds and fractions of seconds at
-              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-              # January 1, 1970, in the proleptic Gregorian calendar which extends the
-              # Gregorian calendar backwards to year one.
-              #
-              # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-              # second table is needed for interpretation, using a [24-hour linear
-              # smear](https://developers.google.com/time/smear).
-              #
-              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-              # restricting to that range, we ensure that we can convert to and from [RFC
-              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-            &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                # second values with fractions must still have non-negative nanos values
-                # that count forward in time. Must be from 0 to 999,999,999
-                # inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                # 9999-12-31T23:59:59Z inclusive.
-          },
-          &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
-              # The only legal state transitions are
-              # * IN_PROGRESS -&gt; COMPLETE
-              #
-              # A PRECONDITION_FAILED will be returned if an invalid transition is
-              # requested.
-              #
-              # It is valid to create Step with a state set to COMPLETE.
-              # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
-              # returned if the state is set to COMPLETE multiple times.
-              #
-              # - In response: always set
-              # - In create/update request: optional
-          &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
-              # Maximum of 100 characters.
-              # For example: Clean build
-              #
-              # A PRECONDITION_FAILED will be returned upon creating a new step if it
-              # shares its name and dimension_value with an existing step. If two steps
-              # represent a similar action, but have different dimension values, they
-              # should share the same name. For instance, if the same set of tests is
-              # run on two different platforms, the two steps should have the same name.
-              #
-              # - In response: always set
-              # - In create request: always set
-              # - In update request: never set
-          &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
-              # then this field allows the child to specify the values of the dimensions.
-              #
-              # The keys must exactly match the dimension_definition of the execution.
-              #
-              # For example, if the execution has
-              # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
-              # then a step must define values for those dimensions, eg.
-              # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-              #
-              # If a step does not participate in one dimension of the matrix,
-              # the value for that dimension should be empty string.
-              # For example, if one of the tests is executed by a runner which
-              # does not support retries, the step could have
-              # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-              #
-              # If the step does not participate in any dimensions of the matrix,
-              # it may leave dimension_value unset.
-              #
-              # A PRECONDITION_FAILED will be returned if any of the keys do not exist
-              # in the dimension_definition of the execution.
-              #
-              # A PRECONDITION_FAILED will be returned if another step in this execution
-              # already has the same name and dimension_value, but differs on other data
-              # fields, for example, step field is different.
-              #
-              # A PRECONDITION_FAILED will be returned if dimension_value is set, and
-              # there is a dimension_definition in the execution which is not specified
-              # as one of the keys.
-              #
-              # - In response: present if set by create
-              # - In create request: optional
-              # - In update request: never set
-            {
-              &quot;value&quot;: &quot;A String&quot;,
-              &quot;key&quot;: &quot;A String&quot;,
-            },
-          ],
-          &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
-              #
-              # This value will be set automatically when state transitions to
-              # COMPLETE.
-              #
-              # - In response: set if the execution state is COMPLETE.
-              # - In create/update request: never set
-              # calendar, encoded as a count of seconds and fractions of seconds at
-              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-              # January 1, 1970, in the proleptic Gregorian calendar which extends the
-              # Gregorian calendar backwards to year one.
-              #
-              # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-              # second table is needed for interpretation, using a [24-hour linear
-              # smear](https://developers.google.com/time/smear).
-              #
-              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-              # restricting to that range, we ensure that we can convert to and from [RFC
-              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-            &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                # second values with fractions must still have non-negative nanos values
-                # that count forward in time. Must be from 0 to 999,999,999
-                # inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                # 9999-12-31T23:59:59Z inclusive.
-          },
-          &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
-              # These details can be used identify which group this step is part of.
-              # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
-              # members.
-              #
-              # - In response: present if previously set.
-              # - In create request: optional, set iff this step was performed more than
-              # once.
-              # - In update request: optional
-            &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-                # Ranges from 0(inclusive) to total number of steps(exclusive).
-                # The primary step is 0.
-            &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
-            &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
-                # outcome of each individual step.
-              &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
-                  # configuration as a group.
-              &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
-                { # Step Id and outcome of each individual step that was run as a group with
-                    # other steps with the same configuration.
-                  &quot;runDuration&quot;: { #  # How long it took for this step to run.
-                      # A Duration represents a signed, fixed-length span of time represented
-                      # as a count of seconds and fractions of seconds at nanosecond
-                      # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                      # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                      # two Timestamp values is a Duration and it can be added or subtracted
-                      # from a Timestamp. Range is approximately +-10,000 years.
-                    &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                        # of time. Durations less than one second are represented with a 0
-                        # `seconds` field and a positive or negative `nanos` field. For durations
-                        # of one second or more, a non-zero value for the `nanos` field must be
-                        # of the same sign as the `seconds` field. Must be from -999,999,999
-                        # to +999,999,999 inclusive.
-                    &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-                  },
-                  &quot;stepId&quot;: &quot;A String&quot;,
-                  &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-                      # Ranges from 0(inclusive) to total number of steps(exclusive).
-                      # The primary step is 0.
-                  &quot;outcomeSummary&quot;: &quot;A String&quot;,
-                },
-              ],
-            },
-          },
-          &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
-              #
-              # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
-              #
-              # - In response: always set
-              # - In create/update request: never set
-          &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
-              #
-              # - In response: present if set by create/update request
-              # - In create/update request: optional
-            &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
-                #
-                # Required
-            &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
-                #
-                # Returns INVALID_ARGUMENT if this field is set
-                # but the summary is not FAILURE.
-                #
-                # Optional
-              &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
-                  # start.
-              &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
-                  # This might be caused by trying to run a test on an unsupported platform.
-              &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
-              &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
-              &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
-            },
-            &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
-                #
-                # Returns INVALID_ARGUMENT if this field is set
-                # but the summary is not INCONCLUSIVE.
-                #
-                # Optional
-              &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
-                  # infrastructure failures
-              &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
-                  # depends on a component other than the system under test which failed.
+              &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
+                  # attempts.
                   #
-                  # For example, a mobile test requires provisioning a device where the test
-                  # executes, and that provisioning can fail.
-              &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
-                  # determined.
-                  # For example, the user pressed ctrl-c which sent a kill signal to the test
-                  # runner while the test was running.
-            },
-            &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
-                #
-                # Returns INVALID_ARGUMENT if this field is set
-                # but the summary is not SUCCESS.
-                #
-                # Optional
-                # LINT.IfChange
-              &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
-            },
-            &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
-                #
-                # Returns INVALID_ARGUMENT if this field is set
-                # but the summary is not SKIPPED.
-                #
-                # Optional
-              &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
-              &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
-              &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
-            },
-          },
-          &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
-              # For example: running cp to copy artifacts from one location to another.
-            &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
-                #
-                # - In response: present if set by create/update request
-                # - In create/update request: optional
-                # copying artifacts or deploying code.
-              &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-                  # argv in a C program).
+                  # Present only for rollup test suite overview at environment level. A step
+                  # cannot have flaky test cases.
+              &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
+                  # xml_source.
                   #
-                  # - In response: present if set by create request
-                  # - In create request: optional
-                  # - In update request: never set
-                &quot;A String&quot;,
-              ],
-              &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-                  # exited.
+                  # - In create/response: always set
+                  # - In update request: never
+              &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
+                  # xml_source.
                   #
-                  # - In response: present if set by create/update request
-                  # - In create request: optional
-                  # - In update request: optional, a FAILED_PRECONDITION error will be
-                  #   returned if an exit_code is already set.
-                &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                    # successful.
+                  # - In create/response: always set
+                  # - In update request: never
+              &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
+                  # xml_source.
+                  #
+                  # - In create/response: always set
+                  # - In update request: never
+              &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
+                  # XML file is stored.
+                  #
+                  # Note: Multiple test suites can share the same xml_source
+                  #
+                  # Returns INVALID_ARGUMENT if the uri format is not supported.
+                  #
+                  # - In create/response: optional
+                  # - In update request: never
+                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                    #
+                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                    # or in gsutil format: gs://mybucket/path/to/test.xml
+                    # with version-specific info,
+                    # gs://mybucket/path/to/test.xml#1360383693690000
+                    #
+                    # An INVALID_ARGUMENT error will be returned if the URI format is not
+                    # supported.
                     #
                     # - In response: always set
                     # - In create/update request: always set
               },
-              &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+            },
+          ],
+          &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
+              #
+              # - In response: present if set by create or update
+              # - In create/update request: optional
+            &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
+                #
+                # - In response: present if previously set.
+                # - In create/update request: optional
+                # A Duration represents a signed, fixed-length span of time represented
+                # as a count of seconds and fractions of seconds at nanosecond
+                # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+                # or &quot;month&quot;. It is related to Timestamp in that the difference between
+                # two Timestamp values is a Duration and it can be added or subtracted
+                # from a Timestamp. Range is approximately +-10,000 years.
+              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+              &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+                  # of time. Durations less than one second are represented with a 0
+                  # `seconds` field and a positive or negative `nanos` field. For durations
+                  # of one second or more, a non-zero value for the `nanos` field must be
+                  # of the same sign as the `seconds` field. Must be from -999,999,999
+                  # to +999,999,999 inclusive.
+            },
+          },
+          &quot;testIssues&quot;: [ # Issues observed during the test execution.
+              #
+              # For example, if the mobile app under test crashed during the test,
+              # the error message and the stack trace content can be recorded here
+              # to assist debugging.
+              #
+              # - In response: present if set by create or update
+              # - In create/update request: optional
+            { # An issue detected occurring during a test execution.
+              &quot;warning&quot;: { #  # Warning message with additional details of the issue.
+                  # Should always be a message from com.google.devtools.toolresults.v1.warnings
+                  # `Any` contains an arbitrary serialized protocol buffer message along with a
+                  # URL that describes the type of the serialized message.
                   #
-                  # This field can be set before the tool has exited in order to be able to
-                  # have access to a live view of the logs while the tool is running.
+                  # Protobuf library provides support to pack/unpack Any values in the form
+                  # of utility functions or additional generated methods of the Any type.
                   #
-                  # The maximum allowed number of tool logs per step is 1000.
+                  # Example 1: Pack and unpack a message in C++.
                   #
-                  # - In response: present if set by create/update request
-                  # - In create request: optional
-                  # - In update request: optional, any value provided will be appended to the
-                  #   existing list
-                { # A reference to a file.
+                  #     Foo foo = ...;
+                  #     Any any;
+                  #     any.PackFrom(foo);
+                  #     ...
+                  #     if (any.UnpackTo(&amp;foo)) {
+                  #       ...
+                  #     }
+                  #
+                  # Example 2: Pack and unpack a message in Java.
+                  #
+                  #     Foo foo = ...;
+                  #     Any any = Any.pack(foo);
+                  #     ...
+                  #     if (any.is(Foo.class)) {
+                  #       foo = any.unpack(Foo.class);
+                  #     }
+                  #
+                  #  Example 3: Pack and unpack a message in Python.
+                  #
+                  #     foo = Foo(...)
+                  #     any = Any()
+                  #     any.Pack(foo)
+                  #     ...
+                  #     if any.Is(Foo.DESCRIPTOR):
+                  #       any.Unpack(foo)
+                  #       ...
+                  #
+                  #  Example 4: Pack and unpack a message in Go
+                  #
+                  #      foo := &amp;pb.Foo{...}
+                  #      any, err := ptypes.MarshalAny(foo)
+                  #      ...
+                  #      foo := &amp;pb.Foo{}
+                  #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
+                  #        ...
+                  #      }
+                  #
+                  # The pack methods provided by protobuf library will by default use
+                  # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
+                  # methods only use the fully qualified type name after the last &#x27;/&#x27;
+                  # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
+                  # name &quot;y.z&quot;.
+                  #
+                  #
+                  # # JSON
+                  #
+                  # The JSON representation of an `Any` value uses the regular
+                  # representation of the deserialized, embedded message, with an
+                  # additional field `@type` which contains the type URL. Example:
+                  #
+                  #     package google.profile;
+                  #     message Person {
+                  #       string first_name = 1;
+                  #       string last_name = 2;
+                  #     }
+                  #
+                  #     {
+                  #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
+                  #       &quot;firstName&quot;: &lt;string&gt;,
+                  #       &quot;lastName&quot;: &lt;string&gt;
+                  #     }
+                  #
+                  # If the embedded message type is well-known and has a custom JSON
+                  # representation, that representation will be embedded adding a field
+                  # `value` which holds the custom JSON in addition to the `@type`
+                  # field. Example (for message google.protobuf.Duration):
+                  #
+                  #     {
+                  #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
+                  #       &quot;value&quot;: &quot;1.212s&quot;
+                  #     }
+                &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
+                &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
+                    # protocol buffer message. This string must contain at least
+                    # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
+                    # the fully qualified name of the type (as in
+                    # `path/google.protobuf.Duration`). The name should be in a canonical form
+                    # (e.g., leading &quot;.&quot; is not accepted).
+                    #
+                    # In practice, teams usually precompile into the binary all types that they
+                    # expect it to use in the context of Any. However, for URLs which use the
+                    # scheme `http`, `https`, or no scheme, one can optionally set up a type
+                    # server that maps type URLs to message definitions as follows:
+                    #
+                    # * If no scheme is provided, `https` is assumed.
+                    # * An HTTP GET on the URL must yield a google.protobuf.Type
+                    #   value in binary format, or produce an error.
+                    # * Applications are allowed to cache lookup results based on the
+                    #   URL, or have them precompiled into a binary to avoid any
+                    #   lookup. Therefore, binary compatibility needs to be preserved
+                    #   on changes to types. (Use versioned type names to manage
+                    #   breaking changes.)
+                    #
+                    # Note: this functionality is not currently available in the official
+                    # protobuf release, and it is not used for type URLs beginning with
+                    # type.googleapis.com.
+                    #
+                    # Schemes other than `http`, `https` (or the empty scheme) might be
+                    # used with implementation specific semantics.
+              },
+              &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
+                  # Required.
+              &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
+                &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
+                    #
+                    # Required
+              },
+              &quot;type&quot;: &quot;A String&quot;, # Type of issue.
+                  # Required.
+              &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
+                  # Required.
+              &quot;category&quot;: &quot;A String&quot;, # Category of issue.
+                  # Required.
+            },
+          ],
+          &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
+              #
+              # The exit code of this tool will be used to determine if the test passed.
+              #
+              # - In response: always set
+              # - In create/update request: optional
+              # copying artifacts or deploying code.
+            &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
+                # argv in a C program).
+                #
+                # - In response: present if set by create request
+                # - In create request: optional
+                # - In update request: never set
+              &quot;A String&quot;,
+            ],
+            &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+                # exited.
+                #
+                # - In response: present if set by create/update request
+                # - In create request: optional
+                # - In update request: optional, a FAILED_PRECONDITION error will be
+                #   returned if an exit_code is already set.
+              &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
+                  # successful.
+                  #
+                  # - In response: always set
+                  # - In create/update request: always set
+            },
+            &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+                #
+                # This field can be set before the tool has exited in order to be able to
+                # have access to a live view of the logs while the tool is running.
+                #
+                # The maximum allowed number of tool logs per step is 1000.
+                #
+                # - In response: present if set by create/update request
+                # - In create request: optional
+                # - In update request: optional, any value provided will be appended to the
+                #   existing list
+              { # A reference to a file.
+                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                    #
+                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                    # or in gsutil format: gs://mybucket/path/to/test.xml
+                    # with version-specific info,
+                    # gs://mybucket/path/to/test.xml#1360383693690000
+                    #
+                    # An INVALID_ARGUMENT error will be returned if the URI format is not
+                    # supported.
+                    #
+                    # - In response: always set
+                    # - In create/update request: always set
+              },
+            ],
+            &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
+                #
+                # The maximum allowed number of tool outputs per step is 1000.
+                #
+                # - In response: present if set by create/update request
+                # - In create request: optional
+                # - In update request: optional, any value provided will be appended to the
+                #   existing list
+              { # A reference to a ToolExecution output file.
+                &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
+                    #
+                    # - In response: present if set by create/update request
+                    # - In create/update request: optional
+                    #
+                    # Test case references are canonically ordered lexicographically by these three
+                    # factors:
+                    # * First, by test_suite_name.
+                    # * Second, by class_name.
+                    # * Third, by name.
+                  &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+                  &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+                  &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                      #
+                      # Required.
+                },
+                &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+                    #
+                    # - In response: present if set by create/update request
+                    # - In create/update request: optional
+                    # calendar, encoded as a count of seconds and fractions of seconds at
+                    # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+                    # January 1, 1970, in the proleptic Gregorian calendar which extends the
+                    # Gregorian calendar backwards to year one.
+                    #
+                    # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+                    # second table is needed for interpretation, using a [24-hour linear
+                    # smear](https://developers.google.com/time/smear).
+                    #
+                    # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+                    # restricting to that range, we ensure that we can convert to and from [RFC
+                    # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+                  &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                      # second values with fractions must still have non-negative nanos values
+                      # that count forward in time. Must be from 0 to 999,999,999
+                      # inclusive.
+                  &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+                      # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                      # 9999-12-31T23:59:59Z inclusive.
+                },
+                &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
+                    #
+                    # - In response: always set
+                    # - In create/update request: always set
                   &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
                       #
                       # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
@@ -3664,125 +3749,40 @@
                       # - In response: always set
                       # - In create/update request: always set
                 },
-              ],
-              &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-                  #
-                  # The maximum allowed number of tool outputs per step is 1000.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create request: optional
-                  # - In update request: optional, any value provided will be appended to the
-                  #   existing list
-                { # A reference to a ToolExecution output file.
-                  &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                      #
-                      # - In response: present if set by create/update request
-                      # - In create/update request: optional
-                      # calendar, encoded as a count of seconds and fractions of seconds at
-                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                      # Gregorian calendar backwards to year one.
-                      #
-                      # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                      # second table is needed for interpretation, using a [24-hour linear
-                      # smear](https://developers.google.com/time/smear).
-                      #
-                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                      # restricting to that range, we ensure that we can convert to and from [RFC
-                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                    &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                        # second values with fractions must still have non-negative nanos values
-                        # that count forward in time. Must be from 0 to 999,999,999
-                        # inclusive.
-                    &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                        # 9999-12-31T23:59:59Z inclusive.
-                  },
-                  &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                      #
-                      # - In response: always set
-                      # - In create/update request: always set
-                    &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                        #
-                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                        # or in gsutil format: gs://mybucket/path/to/test.xml
-                        # with version-specific info,
-                        # gs://mybucket/path/to/test.xml#1360383693690000
-                        #
-                        # An INVALID_ARGUMENT error will be returned if the URI format is not
-                        # supported.
-                        #
-                        # - In response: always set
-                        # - In create/update request: always set
-                  },
-                  &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                      #
-                      # - In response: present if set by create/update request
-                      # - In create/update request: optional
-                      #
-                      # Test case references are canonically ordered lexicographically by these three
-                      # factors:
-                      # * First, by test_suite_name.
-                      # * Second, by class_name.
-                      # * Third, by name.
-                    &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                        #
-                        # Required.
-                    &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                    &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-                  },
-                },
-              ],
-            },
+              },
+            ],
           },
-          &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
-              #
-              # This is the device usage used for billing purpose, which is different from
-              # the run_duration, for example, infrastructure failure won&#x27;t be charged for
-              # device usage.
-              #
-              # PRECONDITION_FAILED will be returned if one attempts to set a
-              # device_usage on a step which already has this field set.
-              #
-              # - In response: present if previously set.
-              # - In create request: optional
-              # - In update request: optional
-              # A Duration represents a signed, fixed-length span of time represented
-              # as a count of seconds and fractions of seconds at nanosecond
-              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-              # or &quot;month&quot;. It is related to Timestamp in that the difference between
-              # two Timestamp values is a Duration and it can be added or subtracted
-              # from a Timestamp. Range is approximately +-10,000 years.
-            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                # of time. Durations less than one second are represented with a 0
-                # `seconds` field and a positive or negative `nanos` field. For durations
-                # of one second or more, a non-zero value for the `nanos` field must be
-                # of the same sign as the `seconds` field. Must be from -999,999,999
-                # to +999,999,999 inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-          },
-          &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
-              # step.
-              #
-              # Users are responsible for managing the key namespace such that keys
-              # don&#x27;t accidentally collide.
-              #
-              # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
-              # if the length of any of the keys or values exceeds 100 characters.
-              #
-              # - In response: always set
-              # - In create request: optional
-              # - In update request: optional; any new key/value pair will be added to the
-              #   map, and any new value for an existing key will update that key&#x27;s value
-            {
-              &quot;value&quot;: &quot;A String&quot;,
-              &quot;key&quot;: &quot;A String&quot;,
-            },
-          ],
         },
+        &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
+            #
+            # - In response: always set
+            # - In create/update request: never set
+            # calendar, encoded as a count of seconds and fractions of seconds at
+            # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+            # January 1, 1970, in the proleptic Gregorian calendar which extends the
+            # Gregorian calendar backwards to year one.
+            #
+            # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+            # second table is needed for interpretation, using a [24-hour linear
+            # smear](https://developers.google.com/time/smear).
+            #
+            # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+            # restricting to that range, we ensure that we can convert to and from [RFC
+            # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+          &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+              # second values with fractions must still have non-negative nanos values
+              # that count forward in time. Must be from 0 to 999,999,999
+              # inclusive.
+          &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+              # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+              # 9999-12-31T23:59:59Z inclusive.
+        },
+      },
     ],
+    &quot;nextPageToken&quot;: &quot;A String&quot;, # A continuation token to resume the query at the next item.
+        #
+        # If set, indicates that there are more steps to read, by calling list again
+        # with this value in the page_token field.
   }</pre>
 </div>
 
@@ -3830,12 +3830,858 @@
     The object takes the form of:
 
 { # A Step represents a single operation performed as part of
+    # Execution. A step can be used to represent the execution of a tool (
+    # for example a test runner execution or an execution of a compiler).
+    # 
+    # Steps can overlap (for instance two steps might have the same
+    # start time if some operations are done in parallel).
+    # 
+    # Here is an example, let&#x27;s consider that we have a continuous build is
+    # executing a test runner for each iteration. The workflow would look like:
+    # - user creates a Execution with id 1
+    # - user creates an TestExecutionStep with id 100 for Execution 1
+    # - user update TestExecutionStep with id 100 to add a raw xml log
+    #     + the service parses the xml logs and returns a TestExecutionStep with
+    #      updated TestResult(s).
+    # - user update the status of TestExecutionStep with id 100 to COMPLETE
+    # 
+    # A Step can be updated until its state is set to COMPLETE at which
+    # points it becomes immutable.
+    # 
+    # Next tag: 27
+  &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
+      # The only legal state transitions are
+      # * IN_PROGRESS -&gt; COMPLETE
+      # 
+      # A PRECONDITION_FAILED will be returned if an invalid transition is
+      # requested.
+      # 
+      # It is valid to create Step with a state set to COMPLETE.
+      # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
+      # returned if the state is set to COMPLETE multiple times.
+      # 
+      # - In response: always set
+      # - In create/update request: optional
+  &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
+      # Maximum of 100 characters.
+      # For example: Clean build
+      # 
+      # A PRECONDITION_FAILED will be returned upon creating a new step if it
+      # shares its name and dimension_value with an existing step. If two steps
+      # represent a similar action, but have different dimension values, they
+      # should share the same name. For instance, if the same set of tests is
+      # run on two different platforms, the two steps should have the same name.
+      # 
+      # - In response: always set
+      # - In create request: always set
+      # - In update request: never set
+  &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
+      # then this field allows the child to specify the values of the dimensions.
+      # 
+      # The keys must exactly match the dimension_definition of the execution.
+      # 
+      # For example, if the execution has
+      # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
+      # then a step must define values for those dimensions, eg.
+      # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
+      # 
+      # If a step does not participate in one dimension of the matrix,
+      # the value for that dimension should be empty string.
+      # For example, if one of the tests is executed by a runner which
+      # does not support retries, the step could have
+      # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
+      # 
+      # If the step does not participate in any dimensions of the matrix,
+      # it may leave dimension_value unset.
+      # 
+      # A PRECONDITION_FAILED will be returned if any of the keys do not exist
+      # in the dimension_definition of the execution.
+      # 
+      # A PRECONDITION_FAILED will be returned if another step in this execution
+      # already has the same name and dimension_value, but differs on other data
+      # fields, for example, step field is different.
+      # 
+      # A PRECONDITION_FAILED will be returned if dimension_value is set, and
+      # there is a dimension_definition in the execution which is not specified
+      # as one of the keys.
+      # 
+      # - In response: present if set by create
+      # - In create request: optional
+      # - In update request: never set
+    {
+      &quot;key&quot;: &quot;A String&quot;,
+      &quot;value&quot;: &quot;A String&quot;,
+    },
+  ],
+  &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
+      # 
+      # This value will be set automatically when state transitions to
+      # COMPLETE.
+      # 
+      # - In response: set if the execution state is COMPLETE.
+      # - In create/update request: never set
+      # calendar, encoded as a count of seconds and fractions of seconds at
+      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+      # January 1, 1970, in the proleptic Gregorian calendar which extends the
+      # Gregorian calendar backwards to year one.
+      #
+      # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+      # second table is needed for interpretation, using a [24-hour linear
+      # smear](https://developers.google.com/time/smear).
+      #
+      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+      # restricting to that range, we ensure that we can convert to and from [RFC
+      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+    &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+        # second values with fractions must still have non-negative nanos values
+        # that count forward in time. Must be from 0 to 999,999,999
+        # inclusive.
+    &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+        # 9999-12-31T23:59:59Z inclusive.
+  },
+  &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
+      # These details can be used identify which group this step is part of.
+      # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
+      # members.
+      # 
+      # - In response: present if previously set.
+      # - In create request: optional, set iff this step was performed more than
+      # once.
+      # - In update request: optional
+    &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
+        # outcome of each individual step.
+      &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
+          # configuration as a group.
+      &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
+        { # Step Id and outcome of each individual step that was run as a group with
+            # other steps with the same configuration.
+          &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+              # Ranges from 0(inclusive) to total number of steps(exclusive).
+              # The primary step is 0.
+          &quot;outcomeSummary&quot;: &quot;A String&quot;,
+          &quot;runDuration&quot;: { #  # How long it took for this step to run.
+              # A Duration represents a signed, fixed-length span of time represented
+              # as a count of seconds and fractions of seconds at nanosecond
+              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+              # or &quot;month&quot;. It is related to Timestamp in that the difference between
+              # two Timestamp values is a Duration and it can be added or subtracted
+              # from a Timestamp. Range is approximately +-10,000 years.
+            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+                # of time. Durations less than one second are represented with a 0
+                # `seconds` field and a positive or negative `nanos` field. For durations
+                # of one second or more, a non-zero value for the `nanos` field must be
+                # of the same sign as the `seconds` field. Must be from -999,999,999
+                # to +999,999,999 inclusive.
+          },
+          &quot;stepId&quot;: &quot;A String&quot;,
+        },
+      ],
+    },
+    &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+        # Ranges from 0(inclusive) to total number of steps(exclusive).
+        # The primary step is 0.
+    &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
+  },
+  &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
+      # 
+      # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
+      # 
+      # - In response: always set
+      # - In create/update request: never set
+  &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
+      # 
+      # - In response: present if set by create/update request
+      # - In create/update request: optional
+    &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
+        #
+        # Returns INVALID_ARGUMENT if this field is set
+        # but the summary is not SUCCESS.
+        #
+        # Optional
+        # LINT.IfChange
+      &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
+    },
+    &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
+        #
+        # Returns INVALID_ARGUMENT if this field is set
+        # but the summary is not SKIPPED.
+        #
+        # Optional
+      &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
+      &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
+      &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
+    },
+    &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
+        #
+        # Required
+    &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
+        #
+        # Returns INVALID_ARGUMENT if this field is set
+        # but the summary is not FAILURE.
+        #
+        # Optional
+      &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
+      &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
+          # start.
+      &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
+          # This might be caused by trying to run a test on an unsupported platform.
+      &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
+      &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
+    },
+    &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
+        #
+        # Returns INVALID_ARGUMENT if this field is set
+        # but the summary is not INCONCLUSIVE.
+        #
+        # Optional
+      &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
+          # infrastructure failures
+      &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
+          # depends on a component other than the system under test which failed.
+          #
+          # For example, a mobile test requires provisioning a device where the test
+          # executes, and that provisioning can fail.
+      &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
+          # determined.
+          # For example, the user pressed ctrl-c which sent a kill signal to the test
+          # runner while the test was running.
+    },
+  },
+  &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
+      # For example: running cp to copy artifacts from one location to another.
+    &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
+        #
+        # - In response: present if set by create/update request
+        # - In create/update request: optional
+        # copying artifacts or deploying code.
+      &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
+          # argv in a C program).
+          #
+          # - In response: present if set by create request
+          # - In create request: optional
+          # - In update request: never set
+        &quot;A String&quot;,
+      ],
+      &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+          # exited.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, a FAILED_PRECONDITION error will be
+          #   returned if an exit_code is already set.
+        &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
+            # successful.
+            #
+            # - In response: always set
+            # - In create/update request: always set
+      },
+      &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+          #
+          # This field can be set before the tool has exited in order to be able to
+          # have access to a live view of the logs while the tool is running.
+          #
+          # The maximum allowed number of tool logs per step is 1000.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, any value provided will be appended to the
+          #   existing list
+        { # A reference to a file.
+          &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+              #
+              # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+              # or in gsutil format: gs://mybucket/path/to/test.xml
+              # with version-specific info,
+              # gs://mybucket/path/to/test.xml#1360383693690000
+              #
+              # An INVALID_ARGUMENT error will be returned if the URI format is not
+              # supported.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+      ],
+      &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
+          #
+          # The maximum allowed number of tool outputs per step is 1000.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, any value provided will be appended to the
+          #   existing list
+        { # A reference to a ToolExecution output file.
+          &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              #
+              # Test case references are canonically ordered lexicographically by these three
+              # factors:
+              # * First, by test_suite_name.
+              # * Second, by class_name.
+              # * Third, by name.
+            &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+            &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+            &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                #
+                # Required.
+          },
+          &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              # calendar, encoded as a count of seconds and fractions of seconds at
+              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+              # January 1, 1970, in the proleptic Gregorian calendar which extends the
+              # Gregorian calendar backwards to year one.
+              #
+              # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+              # second table is needed for interpretation, using a [24-hour linear
+              # smear](https://developers.google.com/time/smear).
+              #
+              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+              # restricting to that range, we ensure that we can convert to and from [RFC
+              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+            &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                # second values with fractions must still have non-negative nanos values
+                # that count forward in time. Must be from 0 to 999,999,999
+                # inclusive.
+            &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                # 9999-12-31T23:59:59Z inclusive.
+          },
+          &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        },
+      ],
+    },
+  },
+  &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
+      # 
+      # This is the device usage used for billing purpose, which is different from
+      # the run_duration, for example, infrastructure failure won&#x27;t be charged for
+      # device usage.
+      # 
+      # PRECONDITION_FAILED will be returned if one attempts to set a
+      # device_usage on a step which already has this field set.
+      # 
+      # - In response: present if previously set.
+      # - In create request: optional
+      # - In update request: optional
+      # A Duration represents a signed, fixed-length span of time represented
+      # as a count of seconds and fractions of seconds at nanosecond
+      # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+      # or &quot;month&quot;. It is related to Timestamp in that the difference between
+      # two Timestamp values is a Duration and it can be added or subtracted
+      # from a Timestamp. Range is approximately +-10,000 years.
+    &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+    &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+        # of time. Durations less than one second are represented with a 0
+        # `seconds` field and a positive or negative `nanos` field. For durations
+        # of one second or more, a non-zero value for the `nanos` field must be
+        # of the same sign as the `seconds` field. Must be from -999,999,999
+        # to +999,999,999 inclusive.
+  },
+  &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
+      # step.
+      # 
+      # Users are responsible for managing the key namespace such that keys
+      # don&#x27;t accidentally collide.
+      # 
+      # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
+      # if the length of any of the keys or values exceeds 100 characters.
+      # 
+      # - In response: always set
+      # - In create request: optional
+      # - In update request: optional; any new key/value pair will be added to the
+      #   map, and any new value for an existing key will update that key&#x27;s value
+    {
+      &quot;key&quot;: &quot;A String&quot;,
+      &quot;value&quot;: &quot;A String&quot;,
+    },
+  ],
+  &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
+      # thumbnails can be fetched with ListThumbnails.
+      # 
+      # - In response: always set
+      # - In create/update request: never set
+  &quot;runDuration&quot;: { #  # How long it took for this step to run.
+      # 
+      # If unset, this is set to the difference between creation_time and
+      # completion_time when the step is set to the COMPLETE state. In some cases,
+      # it is appropriate to set this value separately: For instance, if a step is
+      # created, but the operation it represents is queued for a few minutes before
+      # it executes, it would be appropriate not to include the time spent queued
+      # in its run_duration.
+      # 
+      # PRECONDITION_FAILED will be returned if one attempts to set a
+      # run_duration on a step which already has this field set.
+      # 
+      # - In response: present if previously set; always present on COMPLETE step
+      # - In create request: optional
+      # - In update request: optional
+      # A Duration represents a signed, fixed-length span of time represented
+      # as a count of seconds and fractions of seconds at nanosecond
+      # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+      # or &quot;month&quot;. It is related to Timestamp in that the difference between
+      # two Timestamp values is a Duration and it can be added or subtracted
+      # from a Timestamp. Range is approximately +-10,000 years.
+    &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+    &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+        # of time. Durations less than one second are represented with a 0
+        # `seconds` field and a positive or negative `nanos` field. For durations
+        # of one second or more, a non-zero value for the `nanos` field must be
+        # of the same sign as the `seconds` field. Must be from -999,999,999
+        # to +999,999,999 inclusive.
+  },
+  &quot;description&quot;: &quot;A String&quot;, # A description of this tool
+      # For example: mvn clean package -D skipTests=true
+      # 
+      # - In response: present if set by create/update request
+      # - In create/update request: optional
+  &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
+      #
+      # It accepts ant-junit xml files which will be parsed into structured test
+      # results by the service. Xml file paths are updated in order to append more
+      # files, however they can&#x27;t be deleted.
+      #
+      # Users can also add test results manually by using the test_result field.
+    &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
+        # log by server, or uploaded directly by user. This references should only be
+        # called when test suites are fully parsed or uploaded.
+        #
+        # The maximum allowed number of test suite overviews per step is 1000.
+        #
+        # - In response: always set
+        # - In create request: optional
+        # - In update request: never (use publishXunitXmlFiles custom method instead)
+      { # A summary of a test suite result either parsed from XML or uploaded
+          # directly by a user.
+          #
+          # Note: the API related comments are for StepService only. This message is
+          # also being used in ExecutionService in a read only mode for the corresponding
+          # step.
+        &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
+            # xml_source. May also be set by the user.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
+            # A Duration represents a signed, fixed-length span of time represented
+            # as a count of seconds and fractions of seconds at nanosecond
+            # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+            # or &quot;month&quot;. It is related to Timestamp in that the difference between
+            # two Timestamp values is a Duration and it can be added or subtracted
+            # from a Timestamp. Range is approximately +-10,000 years.
+          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+          &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+              # of time. Durations less than one second are represented with a 0
+              # `seconds` field and a positive or negative `nanos` field. For durations
+              # of one second or more, a non-zero value for the `nanos` field must be
+              # of the same sign as the `seconds` field. Must be from -999,999,999
+              # to +999,999,999 inclusive.
+        },
+        &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
+            # attempts.
+            #
+            # Present only for rollup test suite overview at environment level. A step
+            # cannot have flaky test cases.
+        &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
+            # xml_source.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
+            # xml_source.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
+            # xml_source.
+            #
+            # - In create/response: always set
+            # - In update request: never
+        &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
+            # XML file is stored.
+            #
+            # Note: Multiple test suites can share the same xml_source
+            #
+            # Returns INVALID_ARGUMENT if the uri format is not supported.
+            #
+            # - In create/response: optional
+            # - In update request: never
+          &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+              #
+              # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+              # or in gsutil format: gs://mybucket/path/to/test.xml
+              # with version-specific info,
+              # gs://mybucket/path/to/test.xml#1360383693690000
+              #
+              # An INVALID_ARGUMENT error will be returned if the URI format is not
+              # supported.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+      },
+    ],
+    &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
+        #
+        # - In response: present if set by create or update
+        # - In create/update request: optional
+      &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
+          #
+          # - In response: present if previously set.
+          # - In create/update request: optional
+          # A Duration represents a signed, fixed-length span of time represented
+          # as a count of seconds and fractions of seconds at nanosecond
+          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+          # or &quot;month&quot;. It is related to Timestamp in that the difference between
+          # two Timestamp values is a Duration and it can be added or subtracted
+          # from a Timestamp. Range is approximately +-10,000 years.
+        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+            # of time. Durations less than one second are represented with a 0
+            # `seconds` field and a positive or negative `nanos` field. For durations
+            # of one second or more, a non-zero value for the `nanos` field must be
+            # of the same sign as the `seconds` field. Must be from -999,999,999
+            # to +999,999,999 inclusive.
+      },
+    },
+    &quot;testIssues&quot;: [ # Issues observed during the test execution.
+        #
+        # For example, if the mobile app under test crashed during the test,
+        # the error message and the stack trace content can be recorded here
+        # to assist debugging.
+        #
+        # - In response: present if set by create or update
+        # - In create/update request: optional
+      { # An issue detected occurring during a test execution.
+        &quot;warning&quot;: { #  # Warning message with additional details of the issue.
+            # Should always be a message from com.google.devtools.toolresults.v1.warnings
+            # `Any` contains an arbitrary serialized protocol buffer message along with a
+            # URL that describes the type of the serialized message.
+            #
+            # Protobuf library provides support to pack/unpack Any values in the form
+            # of utility functions or additional generated methods of the Any type.
+            #
+            # Example 1: Pack and unpack a message in C++.
+            #
+            #     Foo foo = ...;
+            #     Any any;
+            #     any.PackFrom(foo);
+            #     ...
+            #     if (any.UnpackTo(&amp;foo)) {
+            #       ...
+            #     }
+            #
+            # Example 2: Pack and unpack a message in Java.
+            #
+            #     Foo foo = ...;
+            #     Any any = Any.pack(foo);
+            #     ...
+            #     if (any.is(Foo.class)) {
+            #       foo = any.unpack(Foo.class);
+            #     }
+            #
+            #  Example 3: Pack and unpack a message in Python.
+            #
+            #     foo = Foo(...)
+            #     any = Any()
+            #     any.Pack(foo)
+            #     ...
+            #     if any.Is(Foo.DESCRIPTOR):
+            #       any.Unpack(foo)
+            #       ...
+            #
+            #  Example 4: Pack and unpack a message in Go
+            #
+            #      foo := &amp;pb.Foo{...}
+            #      any, err := ptypes.MarshalAny(foo)
+            #      ...
+            #      foo := &amp;pb.Foo{}
+            #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
+            #        ...
+            #      }
+            #
+            # The pack methods provided by protobuf library will by default use
+            # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
+            # methods only use the fully qualified type name after the last &#x27;/&#x27;
+            # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
+            # name &quot;y.z&quot;.
+            #
+            #
+            # # JSON
+            #
+            # The JSON representation of an `Any` value uses the regular
+            # representation of the deserialized, embedded message, with an
+            # additional field `@type` which contains the type URL. Example:
+            #
+            #     package google.profile;
+            #     message Person {
+            #       string first_name = 1;
+            #       string last_name = 2;
+            #     }
+            #
+            #     {
+            #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
+            #       &quot;firstName&quot;: &lt;string&gt;,
+            #       &quot;lastName&quot;: &lt;string&gt;
+            #     }
+            #
+            # If the embedded message type is well-known and has a custom JSON
+            # representation, that representation will be embedded adding a field
+            # `value` which holds the custom JSON in addition to the `@type`
+            # field. Example (for message google.protobuf.Duration):
+            #
+            #     {
+            #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
+            #       &quot;value&quot;: &quot;1.212s&quot;
+            #     }
+          &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
+          &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
+              # protocol buffer message. This string must contain at least
+              # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
+              # the fully qualified name of the type (as in
+              # `path/google.protobuf.Duration`). The name should be in a canonical form
+              # (e.g., leading &quot;.&quot; is not accepted).
+              #
+              # In practice, teams usually precompile into the binary all types that they
+              # expect it to use in the context of Any. However, for URLs which use the
+              # scheme `http`, `https`, or no scheme, one can optionally set up a type
+              # server that maps type URLs to message definitions as follows:
+              #
+              # * If no scheme is provided, `https` is assumed.
+              # * An HTTP GET on the URL must yield a google.protobuf.Type
+              #   value in binary format, or produce an error.
+              # * Applications are allowed to cache lookup results based on the
+              #   URL, or have them precompiled into a binary to avoid any
+              #   lookup. Therefore, binary compatibility needs to be preserved
+              #   on changes to types. (Use versioned type names to manage
+              #   breaking changes.)
+              #
+              # Note: this functionality is not currently available in the official
+              # protobuf release, and it is not used for type URLs beginning with
+              # type.googleapis.com.
+              #
+              # Schemes other than `http`, `https` (or the empty scheme) might be
+              # used with implementation specific semantics.
+        },
+        &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
+            # Required.
+        &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
+          &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
+              #
+              # Required
+        },
+        &quot;type&quot;: &quot;A String&quot;, # Type of issue.
+            # Required.
+        &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
+            # Required.
+        &quot;category&quot;: &quot;A String&quot;, # Category of issue.
+            # Required.
+      },
+    ],
+    &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
+        #
+        # The exit code of this tool will be used to determine if the test passed.
+        #
+        # - In response: always set
+        # - In create/update request: optional
+        # copying artifacts or deploying code.
+      &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
+          # argv in a C program).
+          #
+          # - In response: present if set by create request
+          # - In create request: optional
+          # - In update request: never set
+        &quot;A String&quot;,
+      ],
+      &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+          # exited.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, a FAILED_PRECONDITION error will be
+          #   returned if an exit_code is already set.
+        &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
+            # successful.
+            #
+            # - In response: always set
+            # - In create/update request: always set
+      },
+      &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+          #
+          # This field can be set before the tool has exited in order to be able to
+          # have access to a live view of the logs while the tool is running.
+          #
+          # The maximum allowed number of tool logs per step is 1000.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, any value provided will be appended to the
+          #   existing list
+        { # A reference to a file.
+          &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+              #
+              # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+              # or in gsutil format: gs://mybucket/path/to/test.xml
+              # with version-specific info,
+              # gs://mybucket/path/to/test.xml#1360383693690000
+              #
+              # An INVALID_ARGUMENT error will be returned if the URI format is not
+              # supported.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+      ],
+      &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
+          #
+          # The maximum allowed number of tool outputs per step is 1000.
+          #
+          # - In response: present if set by create/update request
+          # - In create request: optional
+          # - In update request: optional, any value provided will be appended to the
+          #   existing list
+        { # A reference to a ToolExecution output file.
+          &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              #
+              # Test case references are canonically ordered lexicographically by these three
+              # factors:
+              # * First, by test_suite_name.
+              # * Second, by class_name.
+              # * Third, by name.
+            &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+            &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+            &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                #
+                # Required.
+          },
+          &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+              #
+              # - In response: present if set by create/update request
+              # - In create/update request: optional
+              # calendar, encoded as a count of seconds and fractions of seconds at
+              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+              # January 1, 1970, in the proleptic Gregorian calendar which extends the
+              # Gregorian calendar backwards to year one.
+              #
+              # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+              # second table is needed for interpretation, using a [24-hour linear
+              # smear](https://developers.google.com/time/smear).
+              #
+              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+              # restricting to that range, we ensure that we can convert to and from [RFC
+              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+            &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                # second values with fractions must still have non-negative nanos values
+                # that count forward in time. Must be from 0 to 999,999,999
+                # inclusive.
+            &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                # 9999-12-31T23:59:59Z inclusive.
+          },
+          &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        },
+      ],
+    },
+  },
+  &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
+      # 
+      # - In response: always set
+      # - In create/update request: never set
+      # calendar, encoded as a count of seconds and fractions of seconds at
+      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+      # January 1, 1970, in the proleptic Gregorian calendar which extends the
+      # Gregorian calendar backwards to year one.
+      #
+      # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+      # second table is needed for interpretation, using a [24-hour linear
+      # smear](https://developers.google.com/time/smear).
+      #
+      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+      # restricting to that range, we ensure that we can convert to and from [RFC
+      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+    &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+        # second values with fractions must still have non-negative nanos values
+        # that count forward in time. Must be from 0 to 999,999,999
+        # inclusive.
+    &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+        # 9999-12-31T23:59:59Z inclusive.
+  },
+}
+
+  requestId: string, A unique request ID for server to detect duplicated requests.
+For example, a UUID.
+
+Optional, but strongly recommended.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A Step represents a single operation performed as part of
       # Execution. A step can be used to represent the execution of a tool (
       # for example a test runner execution or an execution of a compiler).
-      # 
+      #
       # Steps can overlap (for instance two steps might have the same
       # start time if some operations are done in parallel).
-      # 
+      #
       # Here is an example, let&#x27;s consider that we have a continuous build is
       # executing a test runner for each iteration. The workflow would look like:
       # - user creates a Execution with id 1
@@ -3844,28 +4690,400 @@
       #     + the service parses the xml logs and returns a TestExecutionStep with
       #      updated TestResult(s).
       # - user update the status of TestExecutionStep with id 100 to COMPLETE
-      # 
+      #
       # A Step can be updated until its state is set to COMPLETE at which
       # points it becomes immutable.
-      # 
+      #
       # Next tag: 27
+    &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
+        # The only legal state transitions are
+        # * IN_PROGRESS -&gt; COMPLETE
+        #
+        # A PRECONDITION_FAILED will be returned if an invalid transition is
+        # requested.
+        #
+        # It is valid to create Step with a state set to COMPLETE.
+        # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
+        # returned if the state is set to COMPLETE multiple times.
+        #
+        # - In response: always set
+        # - In create/update request: optional
+    &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
+        # Maximum of 100 characters.
+        # For example: Clean build
+        #
+        # A PRECONDITION_FAILED will be returned upon creating a new step if it
+        # shares its name and dimension_value with an existing step. If two steps
+        # represent a similar action, but have different dimension values, they
+        # should share the same name. For instance, if the same set of tests is
+        # run on two different platforms, the two steps should have the same name.
+        #
+        # - In response: always set
+        # - In create request: always set
+        # - In update request: never set
+    &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
+        # then this field allows the child to specify the values of the dimensions.
+        #
+        # The keys must exactly match the dimension_definition of the execution.
+        #
+        # For example, if the execution has
+        # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
+        # then a step must define values for those dimensions, eg.
+        # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
+        #
+        # If a step does not participate in one dimension of the matrix,
+        # the value for that dimension should be empty string.
+        # For example, if one of the tests is executed by a runner which
+        # does not support retries, the step could have
+        # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
+        #
+        # If the step does not participate in any dimensions of the matrix,
+        # it may leave dimension_value unset.
+        #
+        # A PRECONDITION_FAILED will be returned if any of the keys do not exist
+        # in the dimension_definition of the execution.
+        #
+        # A PRECONDITION_FAILED will be returned if another step in this execution
+        # already has the same name and dimension_value, but differs on other data
+        # fields, for example, step field is different.
+        #
+        # A PRECONDITION_FAILED will be returned if dimension_value is set, and
+        # there is a dimension_definition in the execution which is not specified
+        # as one of the keys.
+        #
+        # - In response: present if set by create
+        # - In create request: optional
+        # - In update request: never set
+      {
+        &quot;key&quot;: &quot;A String&quot;,
+        &quot;value&quot;: &quot;A String&quot;,
+      },
+    ],
+    &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
+        #
+        # This value will be set automatically when state transitions to
+        # COMPLETE.
+        #
+        # - In response: set if the execution state is COMPLETE.
+        # - In create/update request: never set
+        # calendar, encoded as a count of seconds and fractions of seconds at
+        # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+        # January 1, 1970, in the proleptic Gregorian calendar which extends the
+        # Gregorian calendar backwards to year one.
+        #
+        # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+        # second table is needed for interpretation, using a [24-hour linear
+        # smear](https://developers.google.com/time/smear).
+        #
+        # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+        # restricting to that range, we ensure that we can convert to and from [RFC
+        # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+      &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+          # second values with fractions must still have non-negative nanos values
+          # that count forward in time. Must be from 0 to 999,999,999
+          # inclusive.
+      &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+          # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+          # 9999-12-31T23:59:59Z inclusive.
+    },
+    &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
+        # These details can be used identify which group this step is part of.
+        # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
+        # members.
+        #
+        # - In response: present if previously set.
+        # - In create request: optional, set iff this step was performed more than
+        # once.
+        # - In update request: optional
+      &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
+          # outcome of each individual step.
+        &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
+            # configuration as a group.
+        &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
+          { # Step Id and outcome of each individual step that was run as a group with
+              # other steps with the same configuration.
+            &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+                # Ranges from 0(inclusive) to total number of steps(exclusive).
+                # The primary step is 0.
+            &quot;outcomeSummary&quot;: &quot;A String&quot;,
+            &quot;runDuration&quot;: { #  # How long it took for this step to run.
+                # A Duration represents a signed, fixed-length span of time represented
+                # as a count of seconds and fractions of seconds at nanosecond
+                # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+                # or &quot;month&quot;. It is related to Timestamp in that the difference between
+                # two Timestamp values is a Duration and it can be added or subtracted
+                # from a Timestamp. Range is approximately +-10,000 years.
+              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+              &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+                  # of time. Durations less than one second are represented with a 0
+                  # `seconds` field and a positive or negative `nanos` field. For durations
+                  # of one second or more, a non-zero value for the `nanos` field must be
+                  # of the same sign as the `seconds` field. Must be from -999,999,999
+                  # to +999,999,999 inclusive.
+            },
+            &quot;stepId&quot;: &quot;A String&quot;,
+          },
+        ],
+      },
+      &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+          # Ranges from 0(inclusive) to total number of steps(exclusive).
+          # The primary step is 0.
+      &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
+    },
+    &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
+        #
+        # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
+        #
+        # - In response: always set
+        # - In create/update request: never set
+    &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
+        #
+        # - In response: present if set by create/update request
+        # - In create/update request: optional
+      &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not SUCCESS.
+          #
+          # Optional
+          # LINT.IfChange
+        &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
+      },
+      &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not SKIPPED.
+          #
+          # Optional
+        &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
+        &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
+        &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
+      },
+      &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
+          #
+          # Required
+      &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not FAILURE.
+          #
+          # Optional
+        &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
+        &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
+            # start.
+        &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
+            # This might be caused by trying to run a test on an unsupported platform.
+        &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
+        &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
+      },
+      &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not INCONCLUSIVE.
+          #
+          # Optional
+        &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
+            # infrastructure failures
+        &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
+            # depends on a component other than the system under test which failed.
+            #
+            # For example, a mobile test requires provisioning a device where the test
+            # executes, and that provisioning can fail.
+        &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
+            # determined.
+            # For example, the user pressed ctrl-c which sent a kill signal to the test
+            # runner while the test was running.
+      },
+    },
+    &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
+        # For example: running cp to copy artifacts from one location to another.
+      &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
+          #
+          # - In response: present if set by create/update request
+          # - In create/update request: optional
+          # copying artifacts or deploying code.
+        &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
+            # argv in a C program).
+            #
+            # - In response: present if set by create request
+            # - In create request: optional
+            # - In update request: never set
+          &quot;A String&quot;,
+        ],
+        &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+            # exited.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, a FAILED_PRECONDITION error will be
+            #   returned if an exit_code is already set.
+          &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
+              # successful.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+        &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+            #
+            # This field can be set before the tool has exited in order to be able to
+            # have access to a live view of the logs while the tool is running.
+            #
+            # The maximum allowed number of tool logs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a file.
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        ],
+        &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
+            #
+            # The maximum allowed number of tool outputs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a ToolExecution output file.
+            &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                #
+                # Test case references are canonically ordered lexicographically by these three
+                # factors:
+                # * First, by test_suite_name.
+                # * Second, by class_name.
+                # * Third, by name.
+              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+              &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                  #
+                  # Required.
+            },
+            &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                # calendar, encoded as a count of seconds and fractions of seconds at
+                # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+                # January 1, 1970, in the proleptic Gregorian calendar which extends the
+                # Gregorian calendar backwards to year one.
+                #
+                # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+                # second table is needed for interpretation, using a [24-hour linear
+                # smear](https://developers.google.com/time/smear).
+                #
+                # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+                # restricting to that range, we ensure that we can convert to and from [RFC
+                # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+              &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                  # second values with fractions must still have non-negative nanos values
+                  # that count forward in time. Must be from 0 to 999,999,999
+                  # inclusive.
+              &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+                  # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                  # 9999-12-31T23:59:59Z inclusive.
+            },
+            &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                  #
+                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                  # or in gsutil format: gs://mybucket/path/to/test.xml
+                  # with version-specific info,
+                  # gs://mybucket/path/to/test.xml#1360383693690000
+                  #
+                  # An INVALID_ARGUMENT error will be returned if the URI format is not
+                  # supported.
+                  #
+                  # - In response: always set
+                  # - In create/update request: always set
+            },
+          },
+        ],
+      },
+    },
+    &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
+        #
+        # This is the device usage used for billing purpose, which is different from
+        # the run_duration, for example, infrastructure failure won&#x27;t be charged for
+        # device usage.
+        #
+        # PRECONDITION_FAILED will be returned if one attempts to set a
+        # device_usage on a step which already has this field set.
+        #
+        # - In response: present if previously set.
+        # - In create request: optional
+        # - In update request: optional
+        # A Duration represents a signed, fixed-length span of time represented
+        # as a count of seconds and fractions of seconds at nanosecond
+        # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+        # or &quot;month&quot;. It is related to Timestamp in that the difference between
+        # two Timestamp values is a Duration and it can be added or subtracted
+        # from a Timestamp. Range is approximately +-10,000 years.
+      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+      &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+          # of time. Durations less than one second are represented with a 0
+          # `seconds` field and a positive or negative `nanos` field. For durations
+          # of one second or more, a non-zero value for the `nanos` field must be
+          # of the same sign as the `seconds` field. Must be from -999,999,999
+          # to +999,999,999 inclusive.
+    },
+    &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
+        # step.
+        #
+        # Users are responsible for managing the key namespace such that keys
+        # don&#x27;t accidentally collide.
+        #
+        # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
+        # if the length of any of the keys or values exceeds 100 characters.
+        #
+        # - In response: always set
+        # - In create request: optional
+        # - In update request: optional; any new key/value pair will be added to the
+        #   map, and any new value for an existing key will update that key&#x27;s value
+      {
+        &quot;key&quot;: &quot;A String&quot;,
+        &quot;value&quot;: &quot;A String&quot;,
+      },
+    ],
     &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
         # thumbnails can be fetched with ListThumbnails.
-        # 
+        #
         # - In response: always set
         # - In create/update request: never set
     &quot;runDuration&quot;: { #  # How long it took for this step to run.
-        # 
+        #
         # If unset, this is set to the difference between creation_time and
         # completion_time when the step is set to the COMPLETE state. In some cases,
         # it is appropriate to set this value separately: For instance, if a step is
         # created, but the operation it represents is queued for a few minutes before
         # it executes, it would be appropriate not to include the time spent queued
         # in its run_duration.
-        # 
+        #
         # PRECONDITION_FAILED will be returned if one attempts to set a
         # run_duration on a step which already has this field set.
-        # 
+        #
         # - In response: present if previously set; always present on COMPLETE step
         # - In create request: optional
         # - In update request: optional
@@ -3875,19 +5093,19 @@
         # or &quot;month&quot;. It is related to Timestamp in that the difference between
         # two Timestamp values is a Duration and it can be added or subtracted
         # from a Timestamp. Range is approximately +-10,000 years.
+      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
       &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
           # of time. Durations less than one second are represented with a 0
           # `seconds` field and a positive or negative `nanos` field. For durations
           # of one second or more, a non-zero value for the `nanos` field must be
           # of the same sign as the `seconds` field. Must be from -999,999,999
           # to +999,999,999 inclusive.
-      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
     },
     &quot;description&quot;: &quot;A String&quot;, # A description of this tool
         # For example: mvn clean package -D skipTests=true
-        # 
+        #
         # - In response: present if set by create/update request
         # - In create/update request: optional
     &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
@@ -3897,6 +5115,116 @@
         # files, however they can&#x27;t be deleted.
         #
         # Users can also add test results manually by using the test_result field.
+      &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
+          # log by server, or uploaded directly by user. This references should only be
+          # called when test suites are fully parsed or uploaded.
+          #
+          # The maximum allowed number of test suite overviews per step is 1000.
+          #
+          # - In response: always set
+          # - In create request: optional
+          # - In update request: never (use publishXunitXmlFiles custom method instead)
+        { # A summary of a test suite result either parsed from XML or uploaded
+            # directly by a user.
+            #
+            # Note: the API related comments are for StepService only. This message is
+            # also being used in ExecutionService in a read only mode for the corresponding
+            # step.
+          &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
+              # xml_source. May also be set by the user.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
+              # A Duration represents a signed, fixed-length span of time represented
+              # as a count of seconds and fractions of seconds at nanosecond
+              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+              # or &quot;month&quot;. It is related to Timestamp in that the difference between
+              # two Timestamp values is a Duration and it can be added or subtracted
+              # from a Timestamp. Range is approximately +-10,000 years.
+            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+                # of time. Durations less than one second are represented with a 0
+                # `seconds` field and a positive or negative `nanos` field. For durations
+                # of one second or more, a non-zero value for the `nanos` field must be
+                # of the same sign as the `seconds` field. Must be from -999,999,999
+                # to +999,999,999 inclusive.
+          },
+          &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
+              # attempts.
+              #
+              # Present only for rollup test suite overview at environment level. A step
+              # cannot have flaky test cases.
+          &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
+              # XML file is stored.
+              #
+              # Note: Multiple test suites can share the same xml_source
+              #
+              # Returns INVALID_ARGUMENT if the uri format is not supported.
+              #
+              # - In create/response: optional
+              # - In update request: never
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        },
+      ],
+      &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
+          #
+          # - In response: present if set by create or update
+          # - In create/update request: optional
+        &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
+            #
+            # - In response: present if previously set.
+            # - In create/update request: optional
+            # A Duration represents a signed, fixed-length span of time represented
+            # as a count of seconds and fractions of seconds at nanosecond
+            # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+            # or &quot;month&quot;. It is related to Timestamp in that the difference between
+            # two Timestamp values is a Duration and it can be added or subtracted
+            # from a Timestamp. Range is approximately +-10,000 years.
+          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+          &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+              # of time. Durations less than one second are represented with a 0
+              # `seconds` field and a positive or negative `nanos` field. For durations
+              # of one second or more, a non-zero value for the `nanos` field must be
+              # of the same sign as the `seconds` field. Must be from -999,999,999
+              # to +999,999,999 inclusive.
+        },
+      },
       &quot;testIssues&quot;: [ # Issues observed during the test execution.
           #
           # For example, if the mobile app under test crashed during the test,
@@ -3987,6 +5315,7 @@
               #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
               #       &quot;value&quot;: &quot;1.212s&quot;
               #     }
+            &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
             &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
                 # protocol buffer message. This string must contain at least
                 # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
@@ -4014,7 +5343,6 @@
                 #
                 # Schemes other than `http`, `https` (or the empty scheme) might be
                 # used with implementation specific semantics.
-            &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
           },
           &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
               # Required.
@@ -4094,6 +5422,22 @@
             # - In update request: optional, any value provided will be appended to the
             #   existing list
           { # A reference to a ToolExecution output file.
+            &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                #
+                # Test case references are canonically ordered lexicographically by these three
+                # factors:
+                # * First, by test_suite_name.
+                # * Second, by class_name.
+                # * Third, by name.
+              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+              &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                  #
+                  # Required.
+            },
             &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                 #
                 # - In response: present if set by create/update request
@@ -4135,138 +5479,12 @@
                   # - In response: always set
                   # - In create/update request: always set
             },
-            &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                #
-                # - In response: present if set by create/update request
-                # - In create/update request: optional
-                #
-                # Test case references are canonically ordered lexicographically by these three
-                # factors:
-                # * First, by test_suite_name.
-                # * Second, by class_name.
-                # * Third, by name.
-              &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                  #
-                  # Required.
-              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-            },
           },
         ],
       },
-      &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
-          # log by server, or uploaded directly by user. This references should only be
-          # called when test suites are fully parsed or uploaded.
-          #
-          # The maximum allowed number of test suite overviews per step is 1000.
-          #
-          # - In response: always set
-          # - In create request: optional
-          # - In update request: never (use publishXunitXmlFiles custom method instead)
-        { # A summary of a test suite result either parsed from XML or uploaded
-            # directly by a user.
-            #
-            # Note: the API related comments are for StepService only. This message is
-            # also being used in ExecutionService in a read only mode for the corresponding
-            # step.
-          &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
-              #
-              # - In create/response: always set
-              # - In update request: never
-          &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
-              # A Duration represents a signed, fixed-length span of time represented
-              # as a count of seconds and fractions of seconds at nanosecond
-              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-              # or &quot;month&quot;. It is related to Timestamp in that the difference between
-              # two Timestamp values is a Duration and it can be added or subtracted
-              # from a Timestamp. Range is approximately +-10,000 years.
-            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                # of time. Durations less than one second are represented with a 0
-                # `seconds` field and a positive or negative `nanos` field. For durations
-                # of one second or more, a non-zero value for the `nanos` field must be
-                # of the same sign as the `seconds` field. Must be from -999,999,999
-                # to +999,999,999 inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-          },
-          &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
-              # attempts.
-              #
-              # Present only for rollup test suite overview at environment level. A step
-              # cannot have flaky test cases.
-          &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
-              # xml_source.
-              #
-              # - In create/response: always set
-              # - In update request: never
-          &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
-              # xml_source.
-              #
-              # - In create/response: always set
-              # - In update request: never
-          &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
-              # xml_source.
-              #
-              # - In create/response: always set
-              # - In update request: never
-          &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
-              # XML file is stored.
-              #
-              # Note: Multiple test suites can share the same xml_source
-              #
-              # Returns INVALID_ARGUMENT if the uri format is not supported.
-              #
-              # - In create/response: optional
-              # - In update request: never
-            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                #
-                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                # or in gsutil format: gs://mybucket/path/to/test.xml
-                # with version-specific info,
-                # gs://mybucket/path/to/test.xml#1360383693690000
-                #
-                # An INVALID_ARGUMENT error will be returned if the URI format is not
-                # supported.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
-              # xml_source. May also be set by the user.
-              #
-              # - In create/response: always set
-              # - In update request: never
-        },
-      ],
-      &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
-          #
-          # - In response: present if set by create or update
-          # - In create/update request: optional
-        &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
-            #
-            # - In response: present if previously set.
-            # - In create/update request: optional
-            # A Duration represents a signed, fixed-length span of time represented
-            # as a count of seconds and fractions of seconds at nanosecond
-            # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-            # or &quot;month&quot;. It is related to Timestamp in that the difference between
-            # two Timestamp values is a Duration and it can be added or subtracted
-            # from a Timestamp. Range is approximately +-10,000 years.
-          &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-              # of time. Durations less than one second are represented with a 0
-              # `seconds` field and a positive or negative `nanos` field. For durations
-              # of one second or more, a non-zero value for the `nanos` field must be
-              # of the same sign as the `seconds` field. Must be from -999,999,999
-              # to +999,999,999 inclusive.
-          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-        },
-      },
     },
     &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
-        # 
+        #
         # - In response: always set
         # - In create/update request: never set
         # calendar, encoded as a count of seconds and fractions of seconds at
@@ -4289,1225 +5507,7 @@
           # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
           # 9999-12-31T23:59:59Z inclusive.
     },
-    &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
-        # The only legal state transitions are
-        # * IN_PROGRESS -&gt; COMPLETE
-        # 
-        # A PRECONDITION_FAILED will be returned if an invalid transition is
-        # requested.
-        # 
-        # It is valid to create Step with a state set to COMPLETE.
-        # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
-        # returned if the state is set to COMPLETE multiple times.
-        # 
-        # - In response: always set
-        # - In create/update request: optional
-    &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
-        # Maximum of 100 characters.
-        # For example: Clean build
-        # 
-        # A PRECONDITION_FAILED will be returned upon creating a new step if it
-        # shares its name and dimension_value with an existing step. If two steps
-        # represent a similar action, but have different dimension values, they
-        # should share the same name. For instance, if the same set of tests is
-        # run on two different platforms, the two steps should have the same name.
-        # 
-        # - In response: always set
-        # - In create request: always set
-        # - In update request: never set
-    &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
-        # then this field allows the child to specify the values of the dimensions.
-        # 
-        # The keys must exactly match the dimension_definition of the execution.
-        # 
-        # For example, if the execution has
-        # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
-        # then a step must define values for those dimensions, eg.
-        # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-        # 
-        # If a step does not participate in one dimension of the matrix,
-        # the value for that dimension should be empty string.
-        # For example, if one of the tests is executed by a runner which
-        # does not support retries, the step could have
-        # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-        # 
-        # If the step does not participate in any dimensions of the matrix,
-        # it may leave dimension_value unset.
-        # 
-        # A PRECONDITION_FAILED will be returned if any of the keys do not exist
-        # in the dimension_definition of the execution.
-        # 
-        # A PRECONDITION_FAILED will be returned if another step in this execution
-        # already has the same name and dimension_value, but differs on other data
-        # fields, for example, step field is different.
-        # 
-        # A PRECONDITION_FAILED will be returned if dimension_value is set, and
-        # there is a dimension_definition in the execution which is not specified
-        # as one of the keys.
-        # 
-        # - In response: present if set by create
-        # - In create request: optional
-        # - In update request: never set
-      {
-        &quot;value&quot;: &quot;A String&quot;,
-        &quot;key&quot;: &quot;A String&quot;,
-      },
-    ],
-    &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
-        # 
-        # This value will be set automatically when state transitions to
-        # COMPLETE.
-        # 
-        # - In response: set if the execution state is COMPLETE.
-        # - In create/update request: never set
-        # calendar, encoded as a count of seconds and fractions of seconds at
-        # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-        # January 1, 1970, in the proleptic Gregorian calendar which extends the
-        # Gregorian calendar backwards to year one.
-        #
-        # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-        # second table is needed for interpretation, using a [24-hour linear
-        # smear](https://developers.google.com/time/smear).
-        #
-        # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-        # restricting to that range, we ensure that we can convert to and from [RFC
-        # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-      &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-          # second values with fractions must still have non-negative nanos values
-          # that count forward in time. Must be from 0 to 999,999,999
-          # inclusive.
-      &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-          # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-          # 9999-12-31T23:59:59Z inclusive.
-    },
-    &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
-        # These details can be used identify which group this step is part of.
-        # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
-        # members.
-        # 
-        # - In response: present if previously set.
-        # - In create request: optional, set iff this step was performed more than
-        # once.
-        # - In update request: optional
-      &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-          # Ranges from 0(inclusive) to total number of steps(exclusive).
-          # The primary step is 0.
-      &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
-      &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
-          # outcome of each individual step.
-        &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
-            # configuration as a group.
-        &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
-          { # Step Id and outcome of each individual step that was run as a group with
-              # other steps with the same configuration.
-            &quot;runDuration&quot;: { #  # How long it took for this step to run.
-                # A Duration represents a signed, fixed-length span of time represented
-                # as a count of seconds and fractions of seconds at nanosecond
-                # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                # two Timestamp values is a Duration and it can be added or subtracted
-                # from a Timestamp. Range is approximately +-10,000 years.
-              &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                  # of time. Durations less than one second are represented with a 0
-                  # `seconds` field and a positive or negative `nanos` field. For durations
-                  # of one second or more, a non-zero value for the `nanos` field must be
-                  # of the same sign as the `seconds` field. Must be from -999,999,999
-                  # to +999,999,999 inclusive.
-              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-            },
-            &quot;stepId&quot;: &quot;A String&quot;,
-            &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-                # Ranges from 0(inclusive) to total number of steps(exclusive).
-                # The primary step is 0.
-            &quot;outcomeSummary&quot;: &quot;A String&quot;,
-          },
-        ],
-      },
-    },
-    &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
-        # 
-        # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
-        # 
-        # - In response: always set
-        # - In create/update request: never set
-    &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
-        # 
-        # - In response: present if set by create/update request
-        # - In create/update request: optional
-      &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
-          #
-          # Required
-      &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
-          #
-          # Returns INVALID_ARGUMENT if this field is set
-          # but the summary is not FAILURE.
-          #
-          # Optional
-        &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
-            # start.
-        &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
-            # This might be caused by trying to run a test on an unsupported platform.
-        &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
-        &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
-        &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
-      },
-      &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
-          #
-          # Returns INVALID_ARGUMENT if this field is set
-          # but the summary is not INCONCLUSIVE.
-          #
-          # Optional
-        &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
-            # infrastructure failures
-        &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
-            # depends on a component other than the system under test which failed.
-            #
-            # For example, a mobile test requires provisioning a device where the test
-            # executes, and that provisioning can fail.
-        &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
-            # determined.
-            # For example, the user pressed ctrl-c which sent a kill signal to the test
-            # runner while the test was running.
-      },
-      &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
-          #
-          # Returns INVALID_ARGUMENT if this field is set
-          # but the summary is not SUCCESS.
-          #
-          # Optional
-          # LINT.IfChange
-        &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
-      },
-      &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
-          #
-          # Returns INVALID_ARGUMENT if this field is set
-          # but the summary is not SKIPPED.
-          #
-          # Optional
-        &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
-        &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
-        &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
-      },
-    },
-    &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
-        # For example: running cp to copy artifacts from one location to another.
-      &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-          # copying artifacts or deploying code.
-        &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-            # argv in a C program).
-            #
-            # - In response: present if set by create request
-            # - In create request: optional
-            # - In update request: never set
-          &quot;A String&quot;,
-        ],
-        &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-            # exited.
-            #
-            # - In response: present if set by create/update request
-            # - In create request: optional
-            # - In update request: optional, a FAILED_PRECONDITION error will be
-            #   returned if an exit_code is already set.
-          &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-              # successful.
-              #
-              # - In response: always set
-              # - In create/update request: always set
-        },
-        &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-            #
-            # This field can be set before the tool has exited in order to be able to
-            # have access to a live view of the logs while the tool is running.
-            #
-            # The maximum allowed number of tool logs per step is 1000.
-            #
-            # - In response: present if set by create/update request
-            # - In create request: optional
-            # - In update request: optional, any value provided will be appended to the
-            #   existing list
-          { # A reference to a file.
-            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                #
-                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                # or in gsutil format: gs://mybucket/path/to/test.xml
-                # with version-specific info,
-                # gs://mybucket/path/to/test.xml#1360383693690000
-                #
-                # An INVALID_ARGUMENT error will be returned if the URI format is not
-                # supported.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-        ],
-        &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-            #
-            # The maximum allowed number of tool outputs per step is 1000.
-            #
-            # - In response: present if set by create/update request
-            # - In create request: optional
-            # - In update request: optional, any value provided will be appended to the
-            #   existing list
-          { # A reference to a ToolExecution output file.
-            &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                #
-                # - In response: present if set by create/update request
-                # - In create/update request: optional
-                # calendar, encoded as a count of seconds and fractions of seconds at
-                # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                # Gregorian calendar backwards to year one.
-                #
-                # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                # second table is needed for interpretation, using a [24-hour linear
-                # smear](https://developers.google.com/time/smear).
-                #
-                # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                # restricting to that range, we ensure that we can convert to and from [RFC
-                # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-              &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                  # second values with fractions must still have non-negative nanos values
-                  # that count forward in time. Must be from 0 to 999,999,999
-                  # inclusive.
-              &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                  # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                  # 9999-12-31T23:59:59Z inclusive.
-            },
-            &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-            &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                #
-                # - In response: present if set by create/update request
-                # - In create/update request: optional
-                #
-                # Test case references are canonically ordered lexicographically by these three
-                # factors:
-                # * First, by test_suite_name.
-                # * Second, by class_name.
-                # * Third, by name.
-              &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                  #
-                  # Required.
-              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-            },
-          },
-        ],
-      },
-    },
-    &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
-        # 
-        # This is the device usage used for billing purpose, which is different from
-        # the run_duration, for example, infrastructure failure won&#x27;t be charged for
-        # device usage.
-        # 
-        # PRECONDITION_FAILED will be returned if one attempts to set a
-        # device_usage on a step which already has this field set.
-        # 
-        # - In response: present if previously set.
-        # - In create request: optional
-        # - In update request: optional
-        # A Duration represents a signed, fixed-length span of time represented
-        # as a count of seconds and fractions of seconds at nanosecond
-        # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-        # or &quot;month&quot;. It is related to Timestamp in that the difference between
-        # two Timestamp values is a Duration and it can be added or subtracted
-        # from a Timestamp. Range is approximately +-10,000 years.
-      &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-          # of time. Durations less than one second are represented with a 0
-          # `seconds` field and a positive or negative `nanos` field. For durations
-          # of one second or more, a non-zero value for the `nanos` field must be
-          # of the same sign as the `seconds` field. Must be from -999,999,999
-          # to +999,999,999 inclusive.
-      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-    },
-    &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
-        # step.
-        # 
-        # Users are responsible for managing the key namespace such that keys
-        # don&#x27;t accidentally collide.
-        # 
-        # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
-        # if the length of any of the keys or values exceeds 100 characters.
-        # 
-        # - In response: always set
-        # - In create request: optional
-        # - In update request: optional; any new key/value pair will be added to the
-        #   map, and any new value for an existing key will update that key&#x27;s value
-      {
-        &quot;value&quot;: &quot;A String&quot;,
-        &quot;key&quot;: &quot;A String&quot;,
-      },
-    ],
-  }
-
-  requestId: string, A unique request ID for server to detect duplicated requests.
-For example, a UUID.
-
-Optional, but strongly recommended.
-  x__xgafv: string, V1 error format.
-    Allowed values
-      1 - v1 error format
-      2 - v2 error format
-
-Returns:
-  An object of the form:
-
-    { # A Step represents a single operation performed as part of
-        # Execution. A step can be used to represent the execution of a tool (
-        # for example a test runner execution or an execution of a compiler).
-        #
-        # Steps can overlap (for instance two steps might have the same
-        # start time if some operations are done in parallel).
-        #
-        # Here is an example, let&#x27;s consider that we have a continuous build is
-        # executing a test runner for each iteration. The workflow would look like:
-        # - user creates a Execution with id 1
-        # - user creates an TestExecutionStep with id 100 for Execution 1
-        # - user update TestExecutionStep with id 100 to add a raw xml log
-        #     + the service parses the xml logs and returns a TestExecutionStep with
-        #      updated TestResult(s).
-        # - user update the status of TestExecutionStep with id 100 to COMPLETE
-        #
-        # A Step can be updated until its state is set to COMPLETE at which
-        # points it becomes immutable.
-        #
-        # Next tag: 27
-      &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
-          # thumbnails can be fetched with ListThumbnails.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-      &quot;runDuration&quot;: { #  # How long it took for this step to run.
-          #
-          # If unset, this is set to the difference between creation_time and
-          # completion_time when the step is set to the COMPLETE state. In some cases,
-          # it is appropriate to set this value separately: For instance, if a step is
-          # created, but the operation it represents is queued for a few minutes before
-          # it executes, it would be appropriate not to include the time spent queued
-          # in its run_duration.
-          #
-          # PRECONDITION_FAILED will be returned if one attempts to set a
-          # run_duration on a step which already has this field set.
-          #
-          # - In response: present if previously set; always present on COMPLETE step
-          # - In create request: optional
-          # - In update request: optional
-          # A Duration represents a signed, fixed-length span of time represented
-          # as a count of seconds and fractions of seconds at nanosecond
-          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-          # or &quot;month&quot;. It is related to Timestamp in that the difference between
-          # two Timestamp values is a Duration and it can be added or subtracted
-          # from a Timestamp. Range is approximately +-10,000 years.
-        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-            # of time. Durations less than one second are represented with a 0
-            # `seconds` field and a positive or negative `nanos` field. For durations
-            # of one second or more, a non-zero value for the `nanos` field must be
-            # of the same sign as the `seconds` field. Must be from -999,999,999
-            # to +999,999,999 inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-      },
-      &quot;description&quot;: &quot;A String&quot;, # A description of this tool
-          # For example: mvn clean package -D skipTests=true
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-      &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
-          #
-          # It accepts ant-junit xml files which will be parsed into structured test
-          # results by the service. Xml file paths are updated in order to append more
-          # files, however they can&#x27;t be deleted.
-          #
-          # Users can also add test results manually by using the test_result field.
-        &quot;testIssues&quot;: [ # Issues observed during the test execution.
-            #
-            # For example, if the mobile app under test crashed during the test,
-            # the error message and the stack trace content can be recorded here
-            # to assist debugging.
-            #
-            # - In response: present if set by create or update
-            # - In create/update request: optional
-          { # An issue detected occurring during a test execution.
-            &quot;warning&quot;: { #  # Warning message with additional details of the issue.
-                # Should always be a message from com.google.devtools.toolresults.v1.warnings
-                # `Any` contains an arbitrary serialized protocol buffer message along with a
-                # URL that describes the type of the serialized message.
-                #
-                # Protobuf library provides support to pack/unpack Any values in the form
-                # of utility functions or additional generated methods of the Any type.
-                #
-                # Example 1: Pack and unpack a message in C++.
-                #
-                #     Foo foo = ...;
-                #     Any any;
-                #     any.PackFrom(foo);
-                #     ...
-                #     if (any.UnpackTo(&amp;foo)) {
-                #       ...
-                #     }
-                #
-                # Example 2: Pack and unpack a message in Java.
-                #
-                #     Foo foo = ...;
-                #     Any any = Any.pack(foo);
-                #     ...
-                #     if (any.is(Foo.class)) {
-                #       foo = any.unpack(Foo.class);
-                #     }
-                #
-                #  Example 3: Pack and unpack a message in Python.
-                #
-                #     foo = Foo(...)
-                #     any = Any()
-                #     any.Pack(foo)
-                #     ...
-                #     if any.Is(Foo.DESCRIPTOR):
-                #       any.Unpack(foo)
-                #       ...
-                #
-                #  Example 4: Pack and unpack a message in Go
-                #
-                #      foo := &amp;pb.Foo{...}
-                #      any, err := ptypes.MarshalAny(foo)
-                #      ...
-                #      foo := &amp;pb.Foo{}
-                #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
-                #        ...
-                #      }
-                #
-                # The pack methods provided by protobuf library will by default use
-                # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
-                # methods only use the fully qualified type name after the last &#x27;/&#x27;
-                # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
-                # name &quot;y.z&quot;.
-                #
-                #
-                # # JSON
-                #
-                # The JSON representation of an `Any` value uses the regular
-                # representation of the deserialized, embedded message, with an
-                # additional field `@type` which contains the type URL. Example:
-                #
-                #     package google.profile;
-                #     message Person {
-                #       string first_name = 1;
-                #       string last_name = 2;
-                #     }
-                #
-                #     {
-                #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
-                #       &quot;firstName&quot;: &lt;string&gt;,
-                #       &quot;lastName&quot;: &lt;string&gt;
-                #     }
-                #
-                # If the embedded message type is well-known and has a custom JSON
-                # representation, that representation will be embedded adding a field
-                # `value` which holds the custom JSON in addition to the `@type`
-                # field. Example (for message google.protobuf.Duration):
-                #
-                #     {
-                #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
-                #       &quot;value&quot;: &quot;1.212s&quot;
-                #     }
-              &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
-                  # protocol buffer message. This string must contain at least
-                  # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
-                  # the fully qualified name of the type (as in
-                  # `path/google.protobuf.Duration`). The name should be in a canonical form
-                  # (e.g., leading &quot;.&quot; is not accepted).
-                  #
-                  # In practice, teams usually precompile into the binary all types that they
-                  # expect it to use in the context of Any. However, for URLs which use the
-                  # scheme `http`, `https`, or no scheme, one can optionally set up a type
-                  # server that maps type URLs to message definitions as follows:
-                  #
-                  # * If no scheme is provided, `https` is assumed.
-                  # * An HTTP GET on the URL must yield a google.protobuf.Type
-                  #   value in binary format, or produce an error.
-                  # * Applications are allowed to cache lookup results based on the
-                  #   URL, or have them precompiled into a binary to avoid any
-                  #   lookup. Therefore, binary compatibility needs to be preserved
-                  #   on changes to types. (Use versioned type names to manage
-                  #   breaking changes.)
-                  #
-                  # Note: this functionality is not currently available in the official
-                  # protobuf release, and it is not used for type URLs beginning with
-                  # type.googleapis.com.
-                  #
-                  # Schemes other than `http`, `https` (or the empty scheme) might be
-                  # used with implementation specific semantics.
-              &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
-            },
-            &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
-                # Required.
-            &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
-              &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
-                  #
-                  # Required
-            },
-            &quot;type&quot;: &quot;A String&quot;, # Type of issue.
-                # Required.
-            &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
-                # Required.
-            &quot;category&quot;: &quot;A String&quot;, # Category of issue.
-                # Required.
-          },
-        ],
-        &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
-            #
-            # The exit code of this tool will be used to determine if the test passed.
-            #
-            # - In response: always set
-            # - In create/update request: optional
-            # copying artifacts or deploying code.
-          &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-              # argv in a C program).
-              #
-              # - In response: present if set by create request
-              # - In create request: optional
-              # - In update request: never set
-            &quot;A String&quot;,
-          ],
-          &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-              # exited.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, a FAILED_PRECONDITION error will be
-              #   returned if an exit_code is already set.
-            &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                # successful.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-              #
-              # This field can be set before the tool has exited in order to be able to
-              # have access to a live view of the logs while the tool is running.
-              #
-              # The maximum allowed number of tool logs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a file.
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-          ],
-          &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-              #
-              # The maximum allowed number of tool outputs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a ToolExecution output file.
-              &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  # calendar, encoded as a count of seconds and fractions of seconds at
-                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                  # Gregorian calendar backwards to year one.
-                  #
-                  # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                  # second table is needed for interpretation, using a [24-hour linear
-                  # smear](https://developers.google.com/time/smear).
-                  #
-                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                  # restricting to that range, we ensure that we can convert to and from [RFC
-                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                    # second values with fractions must still have non-negative nanos values
-                    # that count forward in time. Must be from 0 to 999,999,999
-                    # inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                    # 9999-12-31T23:59:59Z inclusive.
-              },
-              &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                    #
-                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                    # or in gsutil format: gs://mybucket/path/to/test.xml
-                    # with version-specific info,
-                    # gs://mybucket/path/to/test.xml#1360383693690000
-                    #
-                    # An INVALID_ARGUMENT error will be returned if the URI format is not
-                    # supported.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  #
-                  # Test case references are canonically ordered lexicographically by these three
-                  # factors:
-                  # * First, by test_suite_name.
-                  # * Second, by class_name.
-                  # * Third, by name.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                    #
-                    # Required.
-                &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-              },
-            },
-          ],
-        },
-        &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
-            # log by server, or uploaded directly by user. This references should only be
-            # called when test suites are fully parsed or uploaded.
-            #
-            # The maximum allowed number of test suite overviews per step is 1000.
-            #
-            # - In response: always set
-            # - In create request: optional
-            # - In update request: never (use publishXunitXmlFiles custom method instead)
-          { # A summary of a test suite result either parsed from XML or uploaded
-              # directly by a user.
-              #
-              # Note: the API related comments are for StepService only. This message is
-              # also being used in ExecutionService in a read only mode for the corresponding
-              # step.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
-                # A Duration represents a signed, fixed-length span of time represented
-                # as a count of seconds and fractions of seconds at nanosecond
-                # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                # two Timestamp values is a Duration and it can be added or subtracted
-                # from a Timestamp. Range is approximately +-10,000 years.
-              &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                  # of time. Durations less than one second are represented with a 0
-                  # `seconds` field and a positive or negative `nanos` field. For durations
-                  # of one second or more, a non-zero value for the `nanos` field must be
-                  # of the same sign as the `seconds` field. Must be from -999,999,999
-                  # to +999,999,999 inclusive.
-              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-            },
-            &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
-                # attempts.
-                #
-                # Present only for rollup test suite overview at environment level. A step
-                # cannot have flaky test cases.
-            &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
-                # xml_source.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
-                # XML file is stored.
-                #
-                # Note: Multiple test suites can share the same xml_source
-                #
-                # Returns INVALID_ARGUMENT if the uri format is not supported.
-                #
-                # - In create/response: optional
-                # - In update request: never
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-            &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
-                # xml_source. May also be set by the user.
-                #
-                # - In create/response: always set
-                # - In update request: never
-          },
-        ],
-        &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
-            #
-            # - In response: present if set by create or update
-            # - In create/update request: optional
-          &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
-              #
-              # - In response: present if previously set.
-              # - In create/update request: optional
-              # A Duration represents a signed, fixed-length span of time represented
-              # as a count of seconds and fractions of seconds at nanosecond
-              # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-              # or &quot;month&quot;. It is related to Timestamp in that the difference between
-              # two Timestamp values is a Duration and it can be added or subtracted
-              # from a Timestamp. Range is approximately +-10,000 years.
-            &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                # of time. Durations less than one second are represented with a 0
-                # `seconds` field and a positive or negative `nanos` field. For durations
-                # of one second or more, a non-zero value for the `nanos` field must be
-                # of the same sign as the `seconds` field. Must be from -999,999,999
-                # to +999,999,999 inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-          },
-        },
-      },
-      &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-          # calendar, encoded as a count of seconds and fractions of seconds at
-          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-          # January 1, 1970, in the proleptic Gregorian calendar which extends the
-          # Gregorian calendar backwards to year one.
-          #
-          # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-          # second table is needed for interpretation, using a [24-hour linear
-          # smear](https://developers.google.com/time/smear).
-          #
-          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-          # restricting to that range, we ensure that we can convert to and from [RFC
-          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-        &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-            # second values with fractions must still have non-negative nanos values
-            # that count forward in time. Must be from 0 to 999,999,999
-            # inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-            # 9999-12-31T23:59:59Z inclusive.
-      },
-      &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
-          # The only legal state transitions are
-          # * IN_PROGRESS -&gt; COMPLETE
-          #
-          # A PRECONDITION_FAILED will be returned if an invalid transition is
-          # requested.
-          #
-          # It is valid to create Step with a state set to COMPLETE.
-          # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
-          # returned if the state is set to COMPLETE multiple times.
-          #
-          # - In response: always set
-          # - In create/update request: optional
-      &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
-          # Maximum of 100 characters.
-          # For example: Clean build
-          #
-          # A PRECONDITION_FAILED will be returned upon creating a new step if it
-          # shares its name and dimension_value with an existing step. If two steps
-          # represent a similar action, but have different dimension values, they
-          # should share the same name. For instance, if the same set of tests is
-          # run on two different platforms, the two steps should have the same name.
-          #
-          # - In response: always set
-          # - In create request: always set
-          # - In update request: never set
-      &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
-          # then this field allows the child to specify the values of the dimensions.
-          #
-          # The keys must exactly match the dimension_definition of the execution.
-          #
-          # For example, if the execution has
-          # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
-          # then a step must define values for those dimensions, eg.
-          # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-          #
-          # If a step does not participate in one dimension of the matrix,
-          # the value for that dimension should be empty string.
-          # For example, if one of the tests is executed by a runner which
-          # does not support retries, the step could have
-          # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-          #
-          # If the step does not participate in any dimensions of the matrix,
-          # it may leave dimension_value unset.
-          #
-          # A PRECONDITION_FAILED will be returned if any of the keys do not exist
-          # in the dimension_definition of the execution.
-          #
-          # A PRECONDITION_FAILED will be returned if another step in this execution
-          # already has the same name and dimension_value, but differs on other data
-          # fields, for example, step field is different.
-          #
-          # A PRECONDITION_FAILED will be returned if dimension_value is set, and
-          # there is a dimension_definition in the execution which is not specified
-          # as one of the keys.
-          #
-          # - In response: present if set by create
-          # - In create request: optional
-          # - In update request: never set
-        {
-          &quot;value&quot;: &quot;A String&quot;,
-          &quot;key&quot;: &quot;A String&quot;,
-        },
-      ],
-      &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
-          #
-          # This value will be set automatically when state transitions to
-          # COMPLETE.
-          #
-          # - In response: set if the execution state is COMPLETE.
-          # - In create/update request: never set
-          # calendar, encoded as a count of seconds and fractions of seconds at
-          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-          # January 1, 1970, in the proleptic Gregorian calendar which extends the
-          # Gregorian calendar backwards to year one.
-          #
-          # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-          # second table is needed for interpretation, using a [24-hour linear
-          # smear](https://developers.google.com/time/smear).
-          #
-          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-          # restricting to that range, we ensure that we can convert to and from [RFC
-          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-        &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-            # second values with fractions must still have non-negative nanos values
-            # that count forward in time. Must be from 0 to 999,999,999
-            # inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-            # 9999-12-31T23:59:59Z inclusive.
-      },
-      &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
-          # These details can be used identify which group this step is part of.
-          # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
-          # members.
-          #
-          # - In response: present if previously set.
-          # - In create request: optional, set iff this step was performed more than
-          # once.
-          # - In update request: optional
-        &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-            # Ranges from 0(inclusive) to total number of steps(exclusive).
-            # The primary step is 0.
-        &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
-        &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
-            # outcome of each individual step.
-          &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
-              # configuration as a group.
-          &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
-            { # Step Id and outcome of each individual step that was run as a group with
-                # other steps with the same configuration.
-              &quot;runDuration&quot;: { #  # How long it took for this step to run.
-                  # A Duration represents a signed, fixed-length span of time represented
-                  # as a count of seconds and fractions of seconds at nanosecond
-                  # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                  # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                  # two Timestamp values is a Duration and it can be added or subtracted
-                  # from a Timestamp. Range is approximately +-10,000 years.
-                &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                    # of time. Durations less than one second are represented with a 0
-                    # `seconds` field and a positive or negative `nanos` field. For durations
-                    # of one second or more, a non-zero value for the `nanos` field must be
-                    # of the same sign as the `seconds` field. Must be from -999,999,999
-                    # to +999,999,999 inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-              },
-              &quot;stepId&quot;: &quot;A String&quot;,
-              &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-                  # Ranges from 0(inclusive) to total number of steps(exclusive).
-                  # The primary step is 0.
-              &quot;outcomeSummary&quot;: &quot;A String&quot;,
-            },
-          ],
-        },
-      },
-      &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
-          #
-          # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-      &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-        &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
-            #
-            # Required
-        &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not FAILURE.
-            #
-            # Optional
-          &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
-              # start.
-          &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
-              # This might be caused by trying to run a test on an unsupported platform.
-          &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
-          &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
-          &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
-        },
-        &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not INCONCLUSIVE.
-            #
-            # Optional
-          &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
-              # infrastructure failures
-          &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
-              # depends on a component other than the system under test which failed.
-              #
-              # For example, a mobile test requires provisioning a device where the test
-              # executes, and that provisioning can fail.
-          &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
-              # determined.
-              # For example, the user pressed ctrl-c which sent a kill signal to the test
-              # runner while the test was running.
-        },
-        &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not SUCCESS.
-            #
-            # Optional
-            # LINT.IfChange
-          &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
-        },
-        &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not SKIPPED.
-            #
-            # Optional
-          &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
-          &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
-          &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
-        },
-      },
-      &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
-          # For example: running cp to copy artifacts from one location to another.
-        &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
-            #
-            # - In response: present if set by create/update request
-            # - In create/update request: optional
-            # copying artifacts or deploying code.
-          &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-              # argv in a C program).
-              #
-              # - In response: present if set by create request
-              # - In create request: optional
-              # - In update request: never set
-            &quot;A String&quot;,
-          ],
-          &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-              # exited.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, a FAILED_PRECONDITION error will be
-              #   returned if an exit_code is already set.
-            &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                # successful.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-              #
-              # This field can be set before the tool has exited in order to be able to
-              # have access to a live view of the logs while the tool is running.
-              #
-              # The maximum allowed number of tool logs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a file.
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-          ],
-          &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-              #
-              # The maximum allowed number of tool outputs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a ToolExecution output file.
-              &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  # calendar, encoded as a count of seconds and fractions of seconds at
-                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                  # Gregorian calendar backwards to year one.
-                  #
-                  # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                  # second table is needed for interpretation, using a [24-hour linear
-                  # smear](https://developers.google.com/time/smear).
-                  #
-                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                  # restricting to that range, we ensure that we can convert to and from [RFC
-                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                    # second values with fractions must still have non-negative nanos values
-                    # that count forward in time. Must be from 0 to 999,999,999
-                    # inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                    # 9999-12-31T23:59:59Z inclusive.
-              },
-              &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                    #
-                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                    # or in gsutil format: gs://mybucket/path/to/test.xml
-                    # with version-specific info,
-                    # gs://mybucket/path/to/test.xml#1360383693690000
-                    #
-                    # An INVALID_ARGUMENT error will be returned if the URI format is not
-                    # supported.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  #
-                  # Test case references are canonically ordered lexicographically by these three
-                  # factors:
-                  # * First, by test_suite_name.
-                  # * Second, by class_name.
-                  # * Third, by name.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                    #
-                    # Required.
-                &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-              },
-            },
-          ],
-        },
-      },
-      &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
-          #
-          # This is the device usage used for billing purpose, which is different from
-          # the run_duration, for example, infrastructure failure won&#x27;t be charged for
-          # device usage.
-          #
-          # PRECONDITION_FAILED will be returned if one attempts to set a
-          # device_usage on a step which already has this field set.
-          #
-          # - In response: present if previously set.
-          # - In create request: optional
-          # - In update request: optional
-          # A Duration represents a signed, fixed-length span of time represented
-          # as a count of seconds and fractions of seconds at nanosecond
-          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-          # or &quot;month&quot;. It is related to Timestamp in that the difference between
-          # two Timestamp values is a Duration and it can be added or subtracted
-          # from a Timestamp. Range is approximately +-10,000 years.
-        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-            # of time. Durations less than one second are represented with a 0
-            # `seconds` field and a positive or negative `nanos` field. For durations
-            # of one second or more, a non-zero value for the `nanos` field must be
-            # of the same sign as the `seconds` field. Must be from -999,999,999
-            # to +999,999,999 inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-      },
-      &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
-          # step.
-          #
-          # Users are responsible for managing the key namespace such that keys
-          # don&#x27;t accidentally collide.
-          #
-          # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
-          # if the length of any of the keys or values exceeds 100 characters.
-          #
-          # - In response: always set
-          # - In create request: optional
-          # - In update request: optional; any new key/value pair will be added to the
-          #   map, and any new value for an existing key will update that key&#x27;s value
-        {
-          &quot;value&quot;: &quot;A String&quot;,
-          &quot;key&quot;: &quot;A String&quot;,
-        },
-      ],
-    }</pre>
+  }</pre>
 </div>
 
 <div class="method">
@@ -5571,395 +5571,334 @@
   An object of the form:
 
     { # A Step represents a single operation performed as part of
-        # Execution. A step can be used to represent the execution of a tool (
-        # for example a test runner execution or an execution of a compiler).
+      # Execution. A step can be used to represent the execution of a tool (
+      # for example a test runner execution or an execution of a compiler).
+      #
+      # Steps can overlap (for instance two steps might have the same
+      # start time if some operations are done in parallel).
+      #
+      # Here is an example, let&#x27;s consider that we have a continuous build is
+      # executing a test runner for each iteration. The workflow would look like:
+      # - user creates a Execution with id 1
+      # - user creates an TestExecutionStep with id 100 for Execution 1
+      # - user update TestExecutionStep with id 100 to add a raw xml log
+      #     + the service parses the xml logs and returns a TestExecutionStep with
+      #      updated TestResult(s).
+      # - user update the status of TestExecutionStep with id 100 to COMPLETE
+      #
+      # A Step can be updated until its state is set to COMPLETE at which
+      # points it becomes immutable.
+      #
+      # Next tag: 27
+    &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
+        # The only legal state transitions are
+        # * IN_PROGRESS -&gt; COMPLETE
         #
-        # Steps can overlap (for instance two steps might have the same
-        # start time if some operations are done in parallel).
+        # A PRECONDITION_FAILED will be returned if an invalid transition is
+        # requested.
         #
-        # Here is an example, let&#x27;s consider that we have a continuous build is
-        # executing a test runner for each iteration. The workflow would look like:
-        # - user creates a Execution with id 1
-        # - user creates an TestExecutionStep with id 100 for Execution 1
-        # - user update TestExecutionStep with id 100 to add a raw xml log
-        #     + the service parses the xml logs and returns a TestExecutionStep with
-        #      updated TestResult(s).
-        # - user update the status of TestExecutionStep with id 100 to COMPLETE
+        # It is valid to create Step with a state set to COMPLETE.
+        # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
+        # returned if the state is set to COMPLETE multiple times.
         #
-        # A Step can be updated until its state is set to COMPLETE at which
-        # points it becomes immutable.
+        # - In response: always set
+        # - In create/update request: optional
+    &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
+        # Maximum of 100 characters.
+        # For example: Clean build
         #
-        # Next tag: 27
-      &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
-          # thumbnails can be fetched with ListThumbnails.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-      &quot;runDuration&quot;: { #  # How long it took for this step to run.
-          #
-          # If unset, this is set to the difference between creation_time and
-          # completion_time when the step is set to the COMPLETE state. In some cases,
-          # it is appropriate to set this value separately: For instance, if a step is
-          # created, but the operation it represents is queued for a few minutes before
-          # it executes, it would be appropriate not to include the time spent queued
-          # in its run_duration.
-          #
-          # PRECONDITION_FAILED will be returned if one attempts to set a
-          # run_duration on a step which already has this field set.
-          #
-          # - In response: present if previously set; always present on COMPLETE step
-          # - In create request: optional
-          # - In update request: optional
-          # A Duration represents a signed, fixed-length span of time represented
-          # as a count of seconds and fractions of seconds at nanosecond
-          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-          # or &quot;month&quot;. It is related to Timestamp in that the difference between
-          # two Timestamp values is a Duration and it can be added or subtracted
-          # from a Timestamp. Range is approximately +-10,000 years.
-        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-            # of time. Durations less than one second are represented with a 0
-            # `seconds` field and a positive or negative `nanos` field. For durations
-            # of one second or more, a non-zero value for the `nanos` field must be
-            # of the same sign as the `seconds` field. Must be from -999,999,999
-            # to +999,999,999 inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+        # A PRECONDITION_FAILED will be returned upon creating a new step if it
+        # shares its name and dimension_value with an existing step. If two steps
+        # represent a similar action, but have different dimension values, they
+        # should share the same name. For instance, if the same set of tests is
+        # run on two different platforms, the two steps should have the same name.
+        #
+        # - In response: always set
+        # - In create request: always set
+        # - In update request: never set
+    &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
+        # then this field allows the child to specify the values of the dimensions.
+        #
+        # The keys must exactly match the dimension_definition of the execution.
+        #
+        # For example, if the execution has
+        # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
+        # then a step must define values for those dimensions, eg.
+        # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
+        #
+        # If a step does not participate in one dimension of the matrix,
+        # the value for that dimension should be empty string.
+        # For example, if one of the tests is executed by a runner which
+        # does not support retries, the step could have
+        # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
+        #
+        # If the step does not participate in any dimensions of the matrix,
+        # it may leave dimension_value unset.
+        #
+        # A PRECONDITION_FAILED will be returned if any of the keys do not exist
+        # in the dimension_definition of the execution.
+        #
+        # A PRECONDITION_FAILED will be returned if another step in this execution
+        # already has the same name and dimension_value, but differs on other data
+        # fields, for example, step field is different.
+        #
+        # A PRECONDITION_FAILED will be returned if dimension_value is set, and
+        # there is a dimension_definition in the execution which is not specified
+        # as one of the keys.
+        #
+        # - In response: present if set by create
+        # - In create request: optional
+        # - In update request: never set
+      {
+        &quot;key&quot;: &quot;A String&quot;,
+        &quot;value&quot;: &quot;A String&quot;,
       },
-      &quot;description&quot;: &quot;A String&quot;, # A description of this tool
-          # For example: mvn clean package -D skipTests=true
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-      &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
-          #
-          # It accepts ant-junit xml files which will be parsed into structured test
-          # results by the service. Xml file paths are updated in order to append more
-          # files, however they can&#x27;t be deleted.
-          #
-          # Users can also add test results manually by using the test_result field.
-        &quot;testIssues&quot;: [ # Issues observed during the test execution.
-            #
-            # For example, if the mobile app under test crashed during the test,
-            # the error message and the stack trace content can be recorded here
-            # to assist debugging.
-            #
-            # - In response: present if set by create or update
-            # - In create/update request: optional
-          { # An issue detected occurring during a test execution.
-            &quot;warning&quot;: { #  # Warning message with additional details of the issue.
-                # Should always be a message from com.google.devtools.toolresults.v1.warnings
-                # `Any` contains an arbitrary serialized protocol buffer message along with a
-                # URL that describes the type of the serialized message.
-                #
-                # Protobuf library provides support to pack/unpack Any values in the form
-                # of utility functions or additional generated methods of the Any type.
-                #
-                # Example 1: Pack and unpack a message in C++.
-                #
-                #     Foo foo = ...;
-                #     Any any;
-                #     any.PackFrom(foo);
-                #     ...
-                #     if (any.UnpackTo(&amp;foo)) {
-                #       ...
-                #     }
-                #
-                # Example 2: Pack and unpack a message in Java.
-                #
-                #     Foo foo = ...;
-                #     Any any = Any.pack(foo);
-                #     ...
-                #     if (any.is(Foo.class)) {
-                #       foo = any.unpack(Foo.class);
-                #     }
-                #
-                #  Example 3: Pack and unpack a message in Python.
-                #
-                #     foo = Foo(...)
-                #     any = Any()
-                #     any.Pack(foo)
-                #     ...
-                #     if any.Is(Foo.DESCRIPTOR):
-                #       any.Unpack(foo)
-                #       ...
-                #
-                #  Example 4: Pack and unpack a message in Go
-                #
-                #      foo := &amp;pb.Foo{...}
-                #      any, err := ptypes.MarshalAny(foo)
-                #      ...
-                #      foo := &amp;pb.Foo{}
-                #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
-                #        ...
-                #      }
-                #
-                # The pack methods provided by protobuf library will by default use
-                # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
-                # methods only use the fully qualified type name after the last &#x27;/&#x27;
-                # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
-                # name &quot;y.z&quot;.
-                #
-                #
-                # # JSON
-                #
-                # The JSON representation of an `Any` value uses the regular
-                # representation of the deserialized, embedded message, with an
-                # additional field `@type` which contains the type URL. Example:
-                #
-                #     package google.profile;
-                #     message Person {
-                #       string first_name = 1;
-                #       string last_name = 2;
-                #     }
-                #
-                #     {
-                #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
-                #       &quot;firstName&quot;: &lt;string&gt;,
-                #       &quot;lastName&quot;: &lt;string&gt;
-                #     }
-                #
-                # If the embedded message type is well-known and has a custom JSON
-                # representation, that representation will be embedded adding a field
-                # `value` which holds the custom JSON in addition to the `@type`
-                # field. Example (for message google.protobuf.Duration):
-                #
-                #     {
-                #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
-                #       &quot;value&quot;: &quot;1.212s&quot;
-                #     }
-              &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
-                  # protocol buffer message. This string must contain at least
-                  # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
-                  # the fully qualified name of the type (as in
-                  # `path/google.protobuf.Duration`). The name should be in a canonical form
-                  # (e.g., leading &quot;.&quot; is not accepted).
-                  #
-                  # In practice, teams usually precompile into the binary all types that they
-                  # expect it to use in the context of Any. However, for URLs which use the
-                  # scheme `http`, `https`, or no scheme, one can optionally set up a type
-                  # server that maps type URLs to message definitions as follows:
-                  #
-                  # * If no scheme is provided, `https` is assumed.
-                  # * An HTTP GET on the URL must yield a google.protobuf.Type
-                  #   value in binary format, or produce an error.
-                  # * Applications are allowed to cache lookup results based on the
-                  #   URL, or have them precompiled into a binary to avoid any
-                  #   lookup. Therefore, binary compatibility needs to be preserved
-                  #   on changes to types. (Use versioned type names to manage
-                  #   breaking changes.)
-                  #
-                  # Note: this functionality is not currently available in the official
-                  # protobuf release, and it is not used for type URLs beginning with
-                  # type.googleapis.com.
-                  #
-                  # Schemes other than `http`, `https` (or the empty scheme) might be
-                  # used with implementation specific semantics.
-              &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
-            },
-            &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
-                # Required.
-            &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
-              &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
-                  #
-                  # Required
-            },
-            &quot;type&quot;: &quot;A String&quot;, # Type of issue.
-                # Required.
-            &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
-                # Required.
-            &quot;category&quot;: &quot;A String&quot;, # Category of issue.
-                # Required.
-          },
-        ],
-        &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
-            #
-            # The exit code of this tool will be used to determine if the test passed.
-            #
-            # - In response: always set
-            # - In create/update request: optional
-            # copying artifacts or deploying code.
-          &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-              # argv in a C program).
-              #
-              # - In response: present if set by create request
-              # - In create request: optional
-              # - In update request: never set
-            &quot;A String&quot;,
-          ],
-          &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-              # exited.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, a FAILED_PRECONDITION error will be
-              #   returned if an exit_code is already set.
-            &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                # successful.
-                #
-                # - In response: always set
-                # - In create/update request: always set
-          },
-          &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
-              #
-              # This field can be set before the tool has exited in order to be able to
-              # have access to a live view of the logs while the tool is running.
-              #
-              # The maximum allowed number of tool logs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a file.
-              &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                  #
-                  # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                  # or in gsutil format: gs://mybucket/path/to/test.xml
-                  # with version-specific info,
-                  # gs://mybucket/path/to/test.xml#1360383693690000
-                  #
-                  # An INVALID_ARGUMENT error will be returned if the URI format is not
-                  # supported.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-            },
-          ],
-          &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-              #
-              # The maximum allowed number of tool outputs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a ToolExecution output file.
-              &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  # calendar, encoded as a count of seconds and fractions of seconds at
-                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                  # Gregorian calendar backwards to year one.
-                  #
-                  # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                  # second table is needed for interpretation, using a [24-hour linear
-                  # smear](https://developers.google.com/time/smear).
-                  #
-                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                  # restricting to that range, we ensure that we can convert to and from [RFC
-                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                    # second values with fractions must still have non-negative nanos values
-                    # that count forward in time. Must be from 0 to 999,999,999
-                    # inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                    # 9999-12-31T23:59:59Z inclusive.
-              },
-              &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                    #
-                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                    # or in gsutil format: gs://mybucket/path/to/test.xml
-                    # with version-specific info,
-                    # gs://mybucket/path/to/test.xml#1360383693690000
-                    #
-                    # An INVALID_ARGUMENT error will be returned if the URI format is not
-                    # supported.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  #
-                  # Test case references are canonically ordered lexicographically by these three
-                  # factors:
-                  # * First, by test_suite_name.
-                  # * Second, by class_name.
-                  # * Third, by name.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                    #
-                    # Required.
-                &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-              },
-            },
-          ],
-        },
-        &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
-            # log by server, or uploaded directly by user. This references should only be
-            # called when test suites are fully parsed or uploaded.
-            #
-            # The maximum allowed number of test suite overviews per step is 1000.
-            #
-            # - In response: always set
-            # - In create request: optional
-            # - In update request: never (use publishXunitXmlFiles custom method instead)
-          { # A summary of a test suite result either parsed from XML or uploaded
-              # directly by a user.
-              #
-              # Note: the API related comments are for StepService only. This message is
-              # also being used in ExecutionService in a read only mode for the corresponding
-              # step.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
-                #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
+    ],
+    &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
+        #
+        # This value will be set automatically when state transitions to
+        # COMPLETE.
+        #
+        # - In response: set if the execution state is COMPLETE.
+        # - In create/update request: never set
+        # calendar, encoded as a count of seconds and fractions of seconds at
+        # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+        # January 1, 1970, in the proleptic Gregorian calendar which extends the
+        # Gregorian calendar backwards to year one.
+        #
+        # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+        # second table is needed for interpretation, using a [24-hour linear
+        # smear](https://developers.google.com/time/smear).
+        #
+        # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+        # restricting to that range, we ensure that we can convert to and from [RFC
+        # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+      &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+          # second values with fractions must still have non-negative nanos values
+          # that count forward in time. Must be from 0 to 999,999,999
+          # inclusive.
+      &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+          # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+          # 9999-12-31T23:59:59Z inclusive.
+    },
+    &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
+        # These details can be used identify which group this step is part of.
+        # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
+        # members.
+        #
+        # - In response: present if previously set.
+        # - In create request: optional, set iff this step was performed more than
+        # once.
+        # - In update request: optional
+      &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
+          # outcome of each individual step.
+        &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
+            # configuration as a group.
+        &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
+          { # Step Id and outcome of each individual step that was run as a group with
+              # other steps with the same configuration.
+            &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+                # Ranges from 0(inclusive) to total number of steps(exclusive).
+                # The primary step is 0.
+            &quot;outcomeSummary&quot;: &quot;A String&quot;,
+            &quot;runDuration&quot;: { #  # How long it took for this step to run.
                 # A Duration represents a signed, fixed-length span of time represented
                 # as a count of seconds and fractions of seconds at nanosecond
                 # resolution. It is independent of any calendar and concepts like &quot;day&quot;
                 # or &quot;month&quot;. It is related to Timestamp in that the difference between
                 # two Timestamp values is a Duration and it can be added or subtracted
                 # from a Timestamp. Range is approximately +-10,000 years.
+              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
               &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
                   # of time. Durations less than one second are represented with a 0
                   # `seconds` field and a positive or negative `nanos` field. For durations
                   # of one second or more, a non-zero value for the `nanos` field must be
                   # of the same sign as the `seconds` field. Must be from -999,999,999
                   # to +999,999,999 inclusive.
-              &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
             },
-            &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
-                # attempts.
+            &quot;stepId&quot;: &quot;A String&quot;,
+          },
+        ],
+      },
+      &quot;multistepNumber&quot;: 42, # Unique int given to each step.
+          # Ranges from 0(inclusive) to total number of steps(exclusive).
+          # The primary step is 0.
+      &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
+    },
+    &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
+        #
+        # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
+        #
+        # - In response: always set
+        # - In create/update request: never set
+    &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
+        #
+        # - In response: present if set by create/update request
+        # - In create/update request: optional
+      &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not SUCCESS.
+          #
+          # Optional
+          # LINT.IfChange
+        &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
+      },
+      &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not SKIPPED.
+          #
+          # Optional
+        &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
+        &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
+        &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
+      },
+      &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
+          #
+          # Required
+      &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not FAILURE.
+          #
+          # Optional
+        &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
+        &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
+            # start.
+        &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
+            # This might be caused by trying to run a test on an unsupported platform.
+        &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
+        &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
+      },
+      &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
+          #
+          # Returns INVALID_ARGUMENT if this field is set
+          # but the summary is not INCONCLUSIVE.
+          #
+          # Optional
+        &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
+            # infrastructure failures
+        &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
+            # depends on a component other than the system under test which failed.
+            #
+            # For example, a mobile test requires provisioning a device where the test
+            # executes, and that provisioning can fail.
+        &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
+            # determined.
+            # For example, the user pressed ctrl-c which sent a kill signal to the test
+            # runner while the test was running.
+      },
+    },
+    &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
+        # For example: running cp to copy artifacts from one location to another.
+      &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
+          #
+          # - In response: present if set by create/update request
+          # - In create/update request: optional
+          # copying artifacts or deploying code.
+        &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
+            # argv in a C program).
+            #
+            # - In response: present if set by create request
+            # - In create request: optional
+            # - In update request: never set
+          &quot;A String&quot;,
+        ],
+        &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+            # exited.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, a FAILED_PRECONDITION error will be
+            #   returned if an exit_code is already set.
+          &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
+              # successful.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+        &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+            #
+            # This field can be set before the tool has exited in order to be able to
+            # have access to a live view of the logs while the tool is running.
+            #
+            # The maximum allowed number of tool logs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a file.
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
                 #
-                # Present only for rollup test suite overview at environment level. A step
-                # cannot have flaky test cases.
-            &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
-                # xml_source.
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
                 #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
-                # xml_source.
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
                 #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
-                # xml_source.
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        ],
+        &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
+            #
+            # The maximum allowed number of tool outputs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a ToolExecution output file.
+            &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
                 #
-                # - In create/response: always set
-                # - In update request: never
-            &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
-                # XML file is stored.
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
                 #
-                # Note: Multiple test suites can share the same xml_source
+                # Test case references are canonically ordered lexicographically by these three
+                # factors:
+                # * First, by test_suite_name.
+                # * Second, by class_name.
+                # * Third, by name.
+              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+              &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                  #
+                  # Required.
+            },
+            &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                 #
-                # Returns INVALID_ARGUMENT if the uri format is not supported.
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                # calendar, encoded as a count of seconds and fractions of seconds at
+                # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+                # January 1, 1970, in the proleptic Gregorian calendar which extends the
+                # Gregorian calendar backwards to year one.
                 #
-                # - In create/response: optional
-                # - In update request: never
+                # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+                # second table is needed for interpretation, using a [24-hour linear
+                # smear](https://developers.google.com/time/smear).
+                #
+                # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+                # restricting to that range, we ensure that we can convert to and from [RFC
+                # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+              &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                  # second values with fractions must still have non-negative nanos values
+                  # that count forward in time. Must be from 0 to 999,999,999
+                  # inclusive.
+              &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+                  # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                  # 9999-12-31T23:59:59Z inclusive.
+            },
+            &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
+                #
+                # - In response: always set
+                # - In create/update request: always set
               &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
                   #
                   # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
@@ -5973,305 +5912,455 @@
                   # - In response: always set
                   # - In create/update request: always set
             },
-            &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
-                # xml_source. May also be set by the user.
-                #
-                # - In create/response: always set
-                # - In update request: never
           },
         ],
-        &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
+      },
+    },
+    &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
+        #
+        # This is the device usage used for billing purpose, which is different from
+        # the run_duration, for example, infrastructure failure won&#x27;t be charged for
+        # device usage.
+        #
+        # PRECONDITION_FAILED will be returned if one attempts to set a
+        # device_usage on a step which already has this field set.
+        #
+        # - In response: present if previously set.
+        # - In create request: optional
+        # - In update request: optional
+        # A Duration represents a signed, fixed-length span of time represented
+        # as a count of seconds and fractions of seconds at nanosecond
+        # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+        # or &quot;month&quot;. It is related to Timestamp in that the difference between
+        # two Timestamp values is a Duration and it can be added or subtracted
+        # from a Timestamp. Range is approximately +-10,000 years.
+      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+      &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+          # of time. Durations less than one second are represented with a 0
+          # `seconds` field and a positive or negative `nanos` field. For durations
+          # of one second or more, a non-zero value for the `nanos` field must be
+          # of the same sign as the `seconds` field. Must be from -999,999,999
+          # to +999,999,999 inclusive.
+    },
+    &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
+        # step.
+        #
+        # Users are responsible for managing the key namespace such that keys
+        # don&#x27;t accidentally collide.
+        #
+        # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
+        # if the length of any of the keys or values exceeds 100 characters.
+        #
+        # - In response: always set
+        # - In create request: optional
+        # - In update request: optional; any new key/value pair will be added to the
+        #   map, and any new value for an existing key will update that key&#x27;s value
+      {
+        &quot;key&quot;: &quot;A String&quot;,
+        &quot;value&quot;: &quot;A String&quot;,
+      },
+    ],
+    &quot;hasImages&quot;: True or False, # Whether any of the outputs of this step are images whose
+        # thumbnails can be fetched with ListThumbnails.
+        #
+        # - In response: always set
+        # - In create/update request: never set
+    &quot;runDuration&quot;: { #  # How long it took for this step to run.
+        #
+        # If unset, this is set to the difference between creation_time and
+        # completion_time when the step is set to the COMPLETE state. In some cases,
+        # it is appropriate to set this value separately: For instance, if a step is
+        # created, but the operation it represents is queued for a few minutes before
+        # it executes, it would be appropriate not to include the time spent queued
+        # in its run_duration.
+        #
+        # PRECONDITION_FAILED will be returned if one attempts to set a
+        # run_duration on a step which already has this field set.
+        #
+        # - In response: present if previously set; always present on COMPLETE step
+        # - In create request: optional
+        # - In update request: optional
+        # A Duration represents a signed, fixed-length span of time represented
+        # as a count of seconds and fractions of seconds at nanosecond
+        # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+        # or &quot;month&quot;. It is related to Timestamp in that the difference between
+        # two Timestamp values is a Duration and it can be added or subtracted
+        # from a Timestamp. Range is approximately +-10,000 years.
+      &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+      &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+          # of time. Durations less than one second are represented with a 0
+          # `seconds` field and a positive or negative `nanos` field. For durations
+          # of one second or more, a non-zero value for the `nanos` field must be
+          # of the same sign as the `seconds` field. Must be from -999,999,999
+          # to +999,999,999 inclusive.
+    },
+    &quot;description&quot;: &quot;A String&quot;, # A description of this tool
+        # For example: mvn clean package -D skipTests=true
+        #
+        # - In response: present if set by create/update request
+        # - In create/update request: optional
+    &quot;testExecutionStep&quot;: { # A step that represents running tests. # An execution of a test runner.
+        #
+        # It accepts ant-junit xml files which will be parsed into structured test
+        # results by the service. Xml file paths are updated in order to append more
+        # files, however they can&#x27;t be deleted.
+        #
+        # Users can also add test results manually by using the test_result field.
+      &quot;testSuiteOverviews&quot;: [ # List of test suite overview contents. This could be parsed from xUnit XML
+          # log by server, or uploaded directly by user. This references should only be
+          # called when test suites are fully parsed or uploaded.
+          #
+          # The maximum allowed number of test suite overviews per step is 1000.
+          #
+          # - In response: always set
+          # - In create request: optional
+          # - In update request: never (use publishXunitXmlFiles custom method instead)
+        { # A summary of a test suite result either parsed from XML or uploaded
+            # directly by a user.
             #
-            # - In response: present if set by create or update
-            # - In create/update request: optional
-          &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
+            # Note: the API related comments are for StepService only. This message is
+            # also being used in ExecutionService in a read only mode for the corresponding
+            # step.
+          &quot;failureCount&quot;: 42, # Number of failed test cases, typically set by the service by parsing the
+              # xml_source. May also be set by the user.
               #
-              # - In response: present if previously set.
-              # - In create/update request: optional
+              # - In create/response: always set
+              # - In update request: never
+          &quot;name&quot;: &quot;A String&quot;, # The name of the test suite.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;elapsedTime&quot;: { #  # Elapsed time of test suite.
               # A Duration represents a signed, fixed-length span of time represented
               # as a count of seconds and fractions of seconds at nanosecond
               # resolution. It is independent of any calendar and concepts like &quot;day&quot;
               # or &quot;month&quot;. It is related to Timestamp in that the difference between
               # two Timestamp values is a Duration and it can be added or subtracted
               # from a Timestamp. Range is approximately +-10,000 years.
+            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
             &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
                 # of time. Durations less than one second are represented with a 0
                 # `seconds` field and a positive or negative `nanos` field. For durations
                 # of one second or more, a non-zero value for the `nanos` field must be
                 # of the same sign as the `seconds` field. Must be from -999,999,999
                 # to +999,999,999 inclusive.
-            &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
           },
-        },
-      },
-      &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-          # calendar, encoded as a count of seconds and fractions of seconds at
-          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-          # January 1, 1970, in the proleptic Gregorian calendar which extends the
-          # Gregorian calendar backwards to year one.
-          #
-          # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-          # second table is needed for interpretation, using a [24-hour linear
-          # smear](https://developers.google.com/time/smear).
-          #
-          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-          # restricting to that range, we ensure that we can convert to and from [RFC
-          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-        &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-            # second values with fractions must still have non-negative nanos values
-            # that count forward in time. Must be from 0 to 999,999,999
-            # inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-            # 9999-12-31T23:59:59Z inclusive.
-      },
-      &quot;state&quot;: &quot;A String&quot;, # The initial state is IN_PROGRESS.
-          # The only legal state transitions are
-          # * IN_PROGRESS -&gt; COMPLETE
-          #
-          # A PRECONDITION_FAILED will be returned if an invalid transition is
-          # requested.
-          #
-          # It is valid to create Step with a state set to COMPLETE.
-          # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
-          # returned if the state is set to COMPLETE multiple times.
-          #
-          # - In response: always set
-          # - In create/update request: optional
-      &quot;name&quot;: &quot;A String&quot;, # A short human-readable name to display in the UI.
-          # Maximum of 100 characters.
-          # For example: Clean build
-          #
-          # A PRECONDITION_FAILED will be returned upon creating a new step if it
-          # shares its name and dimension_value with an existing step. If two steps
-          # represent a similar action, but have different dimension values, they
-          # should share the same name. For instance, if the same set of tests is
-          # run on two different platforms, the two steps should have the same name.
-          #
-          # - In response: always set
-          # - In create request: always set
-          # - In update request: never set
-      &quot;dimensionValue&quot;: [ # If the execution containing this step has any dimension_definition set,
-          # then this field allows the child to specify the values of the dimensions.
-          #
-          # The keys must exactly match the dimension_definition of the execution.
-          #
-          # For example, if the execution has
-          # `dimension_definition = [&#x27;attempt&#x27;, &#x27;device&#x27;]`
-          # then a step must define values for those dimensions, eg.
-          # `dimension_value = [&#x27;attempt&#x27;: &#x27;1&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-          #
-          # If a step does not participate in one dimension of the matrix,
-          # the value for that dimension should be empty string.
-          # For example, if one of the tests is executed by a runner which
-          # does not support retries, the step could have
-          # `dimension_value = [&#x27;attempt&#x27;: &#x27;&#x27;, &#x27;device&#x27;: &#x27;Nexus 6&#x27;]`
-          #
-          # If the step does not participate in any dimensions of the matrix,
-          # it may leave dimension_value unset.
-          #
-          # A PRECONDITION_FAILED will be returned if any of the keys do not exist
-          # in the dimension_definition of the execution.
-          #
-          # A PRECONDITION_FAILED will be returned if another step in this execution
-          # already has the same name and dimension_value, but differs on other data
-          # fields, for example, step field is different.
-          #
-          # A PRECONDITION_FAILED will be returned if dimension_value is set, and
-          # there is a dimension_definition in the execution which is not specified
-          # as one of the keys.
-          #
-          # - In response: present if set by create
-          # - In create request: optional
-          # - In update request: never set
-        {
-          &quot;value&quot;: &quot;A String&quot;,
-          &quot;key&quot;: &quot;A String&quot;,
-        },
-      ],
-      &quot;completionTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
-          #
-          # This value will be set automatically when state transitions to
-          # COMPLETE.
-          #
-          # - In response: set if the execution state is COMPLETE.
-          # - In create/update request: never set
-          # calendar, encoded as a count of seconds and fractions of seconds at
-          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-          # January 1, 1970, in the proleptic Gregorian calendar which extends the
-          # Gregorian calendar backwards to year one.
-          #
-          # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-          # second table is needed for interpretation, using a [24-hour linear
-          # smear](https://developers.google.com/time/smear).
-          #
-          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-          # restricting to that range, we ensure that we can convert to and from [RFC
-          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-        &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-            # second values with fractions must still have non-negative nanos values
-            # that count forward in time. Must be from 0 to 999,999,999
-            # inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-            # 9999-12-31T23:59:59Z inclusive.
-      },
-      &quot;multiStep&quot;: { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
-          # These details can be used identify which group this step is part of.
-          # It also identifies the groups &#x27;primary step&#x27; which indexes all the group
-          # members.
-          #
-          # - In response: present if previously set.
-          # - In create request: optional, set iff this step was performed more than
-          # once.
-          # - In update request: optional
-        &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-            # Ranges from 0(inclusive) to total number of steps(exclusive).
-            # The primary step is 0.
-        &quot;primaryStepId&quot;: &quot;A String&quot;, # Step Id of the primary (original) step, which might be this step.
-        &quot;primaryStep&quot;: { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
-            # outcome of each individual step.
-          &quot;rollUp&quot;: &quot;A String&quot;, # Rollup test status of multiple steps that were run with the same
-              # configuration as a group.
-          &quot;individualOutcome&quot;: [ # Step Id and outcome of each individual step.
-            { # Step Id and outcome of each individual step that was run as a group with
-                # other steps with the same configuration.
-              &quot;runDuration&quot;: { #  # How long it took for this step to run.
-                  # A Duration represents a signed, fixed-length span of time represented
-                  # as a count of seconds and fractions of seconds at nanosecond
-                  # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-                  # or &quot;month&quot;. It is related to Timestamp in that the difference between
-                  # two Timestamp values is a Duration and it can be added or subtracted
-                  # from a Timestamp. Range is approximately +-10,000 years.
-                &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-                    # of time. Durations less than one second are represented with a 0
-                    # `seconds` field and a positive or negative `nanos` field. For durations
-                    # of one second or more, a non-zero value for the `nanos` field must be
-                    # of the same sign as the `seconds` field. Must be from -999,999,999
-                    # to +999,999,999 inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-              },
-              &quot;stepId&quot;: &quot;A String&quot;,
-              &quot;multistepNumber&quot;: 42, # Unique int given to each step.
-                  # Ranges from 0(inclusive) to total number of steps(exclusive).
-                  # The primary step is 0.
-              &quot;outcomeSummary&quot;: &quot;A String&quot;,
-            },
-          ],
-        },
-      },
-      &quot;stepId&quot;: &quot;A String&quot;, # A unique identifier within a Execution for this Step.
-          #
-          # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
-          #
-          # - In response: always set
-          # - In create/update request: never set
-      &quot;outcome&quot;: { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
-          #
-          # - In response: present if set by create/update request
-          # - In create/update request: optional
-        &quot;summary&quot;: &quot;A String&quot;, # The simplest way to interpret a result.
-            #
-            # Required
-        &quot;failureDetail&quot;: { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not FAILURE.
-            #
-            # Optional
-          &quot;unableToCrawl&quot;: True or False, # If the robo was unable to crawl the app; perhaps because the app did not
-              # start.
-          &quot;notInstalled&quot;: True or False, # If an app is not installed and thus no test can be run with the app.
-              # This might be caused by trying to run a test on an unsupported platform.
-          &quot;timedOut&quot;: True or False, # If the test overran some time limit, and that is why it failed.
-          &quot;otherNativeCrash&quot;: True or False, # If a native process (including any other than the app) crashed.
-          &quot;crashed&quot;: True or False, # If the failure was severe because the system (app) under test crashed.
-        },
-        &quot;inconclusiveDetail&quot;: { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not INCONCLUSIVE.
-            #
-            # Optional
-          &quot;hasErrorLogs&quot;: True or False, # If results are being provided to the user in certain cases of
-              # infrastructure failures
-          &quot;infrastructureFailure&quot;: True or False, # If the test runner could not determine success or failure because the test
-              # depends on a component other than the system under test which failed.
+          &quot;flakyCount&quot;: 42, # Number of flaky test cases, set by the service by rolling up flaky test
+              # attempts.
               #
-              # For example, a mobile test requires provisioning a device where the test
-              # executes, and that provisioning can fail.
-          &quot;abortedByUser&quot;: True or False, # If the end user aborted the test execution before a pass or fail could be
-              # determined.
-              # For example, the user pressed ctrl-c which sent a kill signal to the test
-              # runner while the test was running.
-        },
-        &quot;successDetail&quot;: { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not SUCCESS.
-            #
-            # Optional
-            # LINT.IfChange
-          &quot;otherNativeCrash&quot;: True or False, # If a native process other than the app crashed.
-        },
-        &quot;skippedDetail&quot;: { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
-            #
-            # Returns INVALID_ARGUMENT if this field is set
-            # but the summary is not SKIPPED.
-            #
-            # Optional
-          &quot;incompatibleAppVersion&quot;: True or False, # If the App doesn&#x27;t support the specific API level.
-          &quot;incompatibleDevice&quot;: True or False, # If the requested OS version doesn&#x27;t run on the specific device model.
-          &quot;incompatibleArchitecture&quot;: True or False, # If the App doesn&#x27;t run on the specific architecture, for example, x86.
-        },
-      },
-      &quot;toolExecutionStep&quot;: { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don&#x27;t explicitly support).
-          # For example: running cp to copy artifacts from one location to another.
-        &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
-            #
-            # - In response: present if set by create/update request
-            # - In create/update request: optional
-            # copying artifacts or deploying code.
-          &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
-              # argv in a C program).
+              # Present only for rollup test suite overview at environment level. A step
+              # cannot have flaky test cases.
+          &quot;errorCount&quot;: 42, # Number of test cases in error, typically set by the service by parsing the
+              # xml_source.
               #
-              # - In response: present if set by create request
-              # - In create request: optional
-              # - In update request: never set
-            &quot;A String&quot;,
-          ],
-          &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
-              # exited.
+              # - In create/response: always set
+              # - In update request: never
+          &quot;totalCount&quot;: 42, # Number of test cases, typically set by the service by parsing the
+              # xml_source.
               #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, a FAILED_PRECONDITION error will be
-              #   returned if an exit_code is already set.
-            &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
-                # successful.
+              # - In create/response: always set
+              # - In update request: never
+          &quot;skippedCount&quot;: 42, # Number of test cases not run, typically set by the service by parsing the
+              # xml_source.
+              #
+              # - In create/response: always set
+              # - In update request: never
+          &quot;xmlSource&quot;: { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
+              # XML file is stored.
+              #
+              # Note: Multiple test suites can share the same xml_source
+              #
+              # Returns INVALID_ARGUMENT if the uri format is not supported.
+              #
+              # - In create/response: optional
+              # - In update request: never
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
                 #
                 # - In response: always set
                 # - In create/update request: always set
           },
-          &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+        },
+      ],
+      &quot;testTiming&quot;: { # Testing timing break down to know phases. # The timing break down of the test execution.
+          #
+          # - In response: present if set by create or update
+          # - In create/update request: optional
+        &quot;testProcessDuration&quot;: { #  # How long it took to run the test process.
+            #
+            # - In response: present if previously set.
+            # - In create/update request: optional
+            # A Duration represents a signed, fixed-length span of time represented
+            # as a count of seconds and fractions of seconds at nanosecond
+            # resolution. It is independent of any calendar and concepts like &quot;day&quot;
+            # or &quot;month&quot;. It is related to Timestamp in that the difference between
+            # two Timestamp values is a Duration and it can be added or subtracted
+            # from a Timestamp. Range is approximately +-10,000 years.
+          &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
+              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
+              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+          &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
+              # of time. Durations less than one second are represented with a 0
+              # `seconds` field and a positive or negative `nanos` field. For durations
+              # of one second or more, a non-zero value for the `nanos` field must be
+              # of the same sign as the `seconds` field. Must be from -999,999,999
+              # to +999,999,999 inclusive.
+        },
+      },
+      &quot;testIssues&quot;: [ # Issues observed during the test execution.
+          #
+          # For example, if the mobile app under test crashed during the test,
+          # the error message and the stack trace content can be recorded here
+          # to assist debugging.
+          #
+          # - In response: present if set by create or update
+          # - In create/update request: optional
+        { # An issue detected occurring during a test execution.
+          &quot;warning&quot;: { #  # Warning message with additional details of the issue.
+              # Should always be a message from com.google.devtools.toolresults.v1.warnings
+              # `Any` contains an arbitrary serialized protocol buffer message along with a
+              # URL that describes the type of the serialized message.
               #
-              # This field can be set before the tool has exited in order to be able to
-              # have access to a live view of the logs while the tool is running.
+              # Protobuf library provides support to pack/unpack Any values in the form
+              # of utility functions or additional generated methods of the Any type.
               #
-              # The maximum allowed number of tool logs per step is 1000.
+              # Example 1: Pack and unpack a message in C++.
               #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a file.
+              #     Foo foo = ...;
+              #     Any any;
+              #     any.PackFrom(foo);
+              #     ...
+              #     if (any.UnpackTo(&amp;foo)) {
+              #       ...
+              #     }
+              #
+              # Example 2: Pack and unpack a message in Java.
+              #
+              #     Foo foo = ...;
+              #     Any any = Any.pack(foo);
+              #     ...
+              #     if (any.is(Foo.class)) {
+              #       foo = any.unpack(Foo.class);
+              #     }
+              #
+              #  Example 3: Pack and unpack a message in Python.
+              #
+              #     foo = Foo(...)
+              #     any = Any()
+              #     any.Pack(foo)
+              #     ...
+              #     if any.Is(Foo.DESCRIPTOR):
+              #       any.Unpack(foo)
+              #       ...
+              #
+              #  Example 4: Pack and unpack a message in Go
+              #
+              #      foo := &amp;pb.Foo{...}
+              #      any, err := ptypes.MarshalAny(foo)
+              #      ...
+              #      foo := &amp;pb.Foo{}
+              #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
+              #        ...
+              #      }
+              #
+              # The pack methods provided by protobuf library will by default use
+              # &#x27;type.googleapis.com/full.type.name&#x27; as the type URL and the unpack
+              # methods only use the fully qualified type name after the last &#x27;/&#x27;
+              # in the type URL, for example &quot;foo.bar.com/x/y.z&quot; will yield type
+              # name &quot;y.z&quot;.
+              #
+              #
+              # # JSON
+              #
+              # The JSON representation of an `Any` value uses the regular
+              # representation of the deserialized, embedded message, with an
+              # additional field `@type` which contains the type URL. Example:
+              #
+              #     package google.profile;
+              #     message Person {
+              #       string first_name = 1;
+              #       string last_name = 2;
+              #     }
+              #
+              #     {
+              #       &quot;@type&quot;: &quot;type.googleapis.com/google.profile.Person&quot;,
+              #       &quot;firstName&quot;: &lt;string&gt;,
+              #       &quot;lastName&quot;: &lt;string&gt;
+              #     }
+              #
+              # If the embedded message type is well-known and has a custom JSON
+              # representation, that representation will be embedded adding a field
+              # `value` which holds the custom JSON in addition to the `@type`
+              # field. Example (for message google.protobuf.Duration):
+              #
+              #     {
+              #       &quot;@type&quot;: &quot;type.googleapis.com/google.protobuf.Duration&quot;,
+              #       &quot;value&quot;: &quot;1.212s&quot;
+              #     }
+            &quot;value&quot;: &quot;A String&quot;, # Must be a valid serialized protocol buffer of the above specified type.
+            &quot;typeUrl&quot;: &quot;A String&quot;, # A URL/resource name that uniquely identifies the type of the serialized
+                # protocol buffer message. This string must contain at least
+                # one &quot;/&quot; character. The last segment of the URL&#x27;s path must represent
+                # the fully qualified name of the type (as in
+                # `path/google.protobuf.Duration`). The name should be in a canonical form
+                # (e.g., leading &quot;.&quot; is not accepted).
+                #
+                # In practice, teams usually precompile into the binary all types that they
+                # expect it to use in the context of Any. However, for URLs which use the
+                # scheme `http`, `https`, or no scheme, one can optionally set up a type
+                # server that maps type URLs to message definitions as follows:
+                #
+                # * If no scheme is provided, `https` is assumed.
+                # * An HTTP GET on the URL must yield a google.protobuf.Type
+                #   value in binary format, or produce an error.
+                # * Applications are allowed to cache lookup results based on the
+                #   URL, or have them precompiled into a binary to avoid any
+                #   lookup. Therefore, binary compatibility needs to be preserved
+                #   on changes to types. (Use versioned type names to manage
+                #   breaking changes.)
+                #
+                # Note: this functionality is not currently available in the official
+                # protobuf release, and it is not used for type URLs beginning with
+                # type.googleapis.com.
+                #
+                # Schemes other than `http`, `https` (or the empty scheme) might be
+                # used with implementation specific semantics.
+          },
+          &quot;severity&quot;: &quot;A String&quot;, # Severity of issue.
+              # Required.
+          &quot;stackTrace&quot;: { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
+            &quot;exception&quot;: &quot;A String&quot;, # The stack trace message.
+                #
+                # Required
+          },
+          &quot;type&quot;: &quot;A String&quot;, # Type of issue.
+              # Required.
+          &quot;errorMessage&quot;: &quot;A String&quot;, # A brief human-readable message describing the issue.
+              # Required.
+          &quot;category&quot;: &quot;A String&quot;, # Category of issue.
+              # Required.
+        },
+      ],
+      &quot;toolExecution&quot;: { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
+          #
+          # The exit code of this tool will be used to determine if the test passed.
+          #
+          # - In response: always set
+          # - In create/update request: optional
+          # copying artifacts or deploying code.
+        &quot;commandLineArguments&quot;: [ # The full tokenized command line including the program name (equivalent to
+            # argv in a C program).
+            #
+            # - In response: present if set by create request
+            # - In create request: optional
+            # - In update request: never set
+          &quot;A String&quot;,
+        ],
+        &quot;exitCode&quot;: { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
+            # exited.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, a FAILED_PRECONDITION error will be
+            #   returned if an exit_code is already set.
+          &quot;number&quot;: 42, # Tool execution exit code. A value of 0 means that the execution was
+              # successful.
+              #
+              # - In response: always set
+              # - In create/update request: always set
+        },
+        &quot;toolLogs&quot;: [ # References to any plain text logs output the tool execution.
+            #
+            # This field can be set before the tool has exited in order to be able to
+            # have access to a live view of the logs while the tool is running.
+            #
+            # The maximum allowed number of tool logs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a file.
+            &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
+                #
+                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
+                # or in gsutil format: gs://mybucket/path/to/test.xml
+                # with version-specific info,
+                # gs://mybucket/path/to/test.xml#1360383693690000
+                #
+                # An INVALID_ARGUMENT error will be returned if the URI format is not
+                # supported.
+                #
+                # - In response: always set
+                # - In create/update request: always set
+          },
+        ],
+        &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
+            #
+            # The maximum allowed number of tool outputs per step is 1000.
+            #
+            # - In response: present if set by create/update request
+            # - In create request: optional
+            # - In update request: optional, any value provided will be appended to the
+            #   existing list
+          { # A reference to a ToolExecution output file.
+            &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                #
+                # Test case references are canonically ordered lexicographically by these three
+                # factors:
+                # * First, by test_suite_name.
+                # * Second, by class_name.
+                # * Third, by name.
+              &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
+              &quot;className&quot;: &quot;A String&quot;, # The name of the class.
+              &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
+                  #
+                  # Required.
+            },
+            &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
+                #
+                # - In response: present if set by create/update request
+                # - In create/update request: optional
+                # calendar, encoded as a count of seconds and fractions of seconds at
+                # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+                # January 1, 1970, in the proleptic Gregorian calendar which extends the
+                # Gregorian calendar backwards to year one.
+                #
+                # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+                # second table is needed for interpretation, using a [24-hour linear
+                # smear](https://developers.google.com/time/smear).
+                #
+                # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+                # restricting to that range, we ensure that we can convert to and from [RFC
+                # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+              &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+                  # second values with fractions must still have non-negative nanos values
+                  # that count forward in time. Must be from 0 to 999,999,999
+                  # inclusive.
+              &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+                  # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+                  # 9999-12-31T23:59:59Z inclusive.
+            },
+            &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
+                #
+                # - In response: always set
+                # - In create/update request: always set
               &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
                   #
                   # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
@@ -6285,124 +6374,35 @@
                   # - In response: always set
                   # - In create/update request: always set
             },
-          ],
-          &quot;toolOutputs&quot;: [ # References to opaque files of any format output by the tool execution.
-              #
-              # The maximum allowed number of tool outputs per step is 1000.
-              #
-              # - In response: present if set by create/update request
-              # - In create request: optional
-              # - In update request: optional, any value provided will be appended to the
-              #   existing list
-            { # A reference to a ToolExecution output file.
-              &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  # calendar, encoded as a count of seconds and fractions of seconds at
-                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
-                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
-                  # Gregorian calendar backwards to year one.
-                  #
-                  # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
-                  # second table is needed for interpretation, using a [24-hour linear
-                  # smear](https://developers.google.com/time/smear).
-                  #
-                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
-                  # restricting to that range, we ensure that we can convert to and from [RFC
-                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
-                &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
-                    # second values with fractions must still have non-negative nanos values
-                    # that count forward in time. Must be from 0 to 999,999,999
-                    # inclusive.
-                &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
-                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
-                    # 9999-12-31T23:59:59Z inclusive.
-              },
-              &quot;output&quot;: { # A reference to a file. # A FileReference to an output file.
-                  #
-                  # - In response: always set
-                  # - In create/update request: always set
-                &quot;fileUri&quot;: &quot;A String&quot;, # The URI of a file stored in Google Cloud Storage.
-                    #
-                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
-                    # or in gsutil format: gs://mybucket/path/to/test.xml
-                    # with version-specific info,
-                    # gs://mybucket/path/to/test.xml#1360383693690000
-                    #
-                    # An INVALID_ARGUMENT error will be returned if the URI format is not
-                    # supported.
-                    #
-                    # - In response: always set
-                    # - In create/update request: always set
-              },
-              &quot;testCase&quot;: { # A reference to a test case. # The test case to which this output file belongs.
-                  #
-                  # - In response: present if set by create/update request
-                  # - In create/update request: optional
-                  #
-                  # Test case references are canonically ordered lexicographically by these three
-                  # factors:
-                  # * First, by test_suite_name.
-                  # * Second, by class_name.
-                  # * Third, by name.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the test case.
-                    #
-                    # Required.
-                &quot;testSuiteName&quot;: &quot;A String&quot;, # The name of the test suite to which this test case belongs.
-                &quot;className&quot;: &quot;A String&quot;, # The name of the class.
-              },
-            },
-          ],
-        },
+          },
+        ],
       },
-      &quot;deviceUsageDuration&quot;: { #  # How much the device resource is used to perform the test.
-          #
-          # This is the device usage used for billing purpose, which is different from
-          # the run_duration, for example, infrastructure failure won&#x27;t be charged for
-          # device usage.
-          #
-          # PRECONDITION_FAILED will be returned if one attempts to set a
-          # device_usage on a step which already has this field set.
-          #
-          # - In response: present if previously set.
-          # - In create request: optional
-          # - In update request: optional
-          # A Duration represents a signed, fixed-length span of time represented
-          # as a count of seconds and fractions of seconds at nanosecond
-          # resolution. It is independent of any calendar and concepts like &quot;day&quot;
-          # or &quot;month&quot;. It is related to Timestamp in that the difference between
-          # two Timestamp values is a Duration and it can be added or subtracted
-          # from a Timestamp. Range is approximately +-10,000 years.
-        &quot;nanos&quot;: 42, # Signed fractions of a second at nanosecond resolution of the span
-            # of time. Durations less than one second are represented with a 0
-            # `seconds` field and a positive or negative `nanos` field. For durations
-            # of one second or more, a non-zero value for the `nanos` field must be
-            # of the same sign as the `seconds` field. Must be from -999,999,999
-            # to +999,999,999 inclusive.
-        &quot;seconds&quot;: &quot;A String&quot;, # Signed seconds of the span of time. Must be from -315,576,000,000
-            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
-            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-      },
-      &quot;labels&quot;: [ # Arbitrary user-supplied key/value pairs that are associated with the
-          # step.
-          #
-          # Users are responsible for managing the key namespace such that keys
-          # don&#x27;t accidentally collide.
-          #
-          # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
-          # if the length of any of the keys or values exceeds 100 characters.
-          #
-          # - In response: always set
-          # - In create request: optional
-          # - In update request: optional; any new key/value pair will be added to the
-          #   map, and any new value for an existing key will update that key&#x27;s value
-        {
-          &quot;value&quot;: &quot;A String&quot;,
-          &quot;key&quot;: &quot;A String&quot;,
-        },
-      ],
-    }</pre>
+    },
+    &quot;creationTime&quot;: { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
+        #
+        # - In response: always set
+        # - In create/update request: never set
+        # calendar, encoded as a count of seconds and fractions of seconds at
+        # nanosecond resolution. The count is relative to an epoch at UTC midnight on
+        # January 1, 1970, in the proleptic Gregorian calendar which extends the
+        # Gregorian calendar backwards to year one.
+        #
+        # All minutes are 60 seconds long. Leap seconds are &quot;smeared&quot; so that no leap
+        # second table is needed for interpretation, using a [24-hour linear
+        # smear](https://developers.google.com/time/smear).
+        #
+        # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
+        # restricting to that range, we ensure that we can convert to and from [RFC
+        # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
+      &quot;nanos&quot;: 42, # Non-negative fractions of a second at nanosecond resolution. Negative
+          # second values with fractions must still have non-negative nanos values
+          # that count forward in time. Must be from 0 to 999,999,999
+          # inclusive.
+      &quot;seconds&quot;: &quot;A String&quot;, # Represents seconds of UTC time since Unix epoch
+          # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+          # 9999-12-31T23:59:59Z inclusive.
+    },
+  }</pre>
 </div>
 
 </body></html>
\ No newline at end of file