docs: docs update (#911)

Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly:
- [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/google-api-python-client/issues/new/choose) before writing your code!  That way we can discuss the change, evaluate designs, and agree on the general idea
- [ ] Ensure the tests and linter pass
- [ ] Code coverage does not decrease (if any source code was changed)
- [ ] Appropriate docs were updated (if necessary)

Fixes #<issue_number_goes_here> 🦕
diff --git a/docs/dyn/toolresults_v1beta3.steps.html b/docs/dyn/toolresults_v1beta3.steps.html
new file mode 100644
index 0000000..bb9a051
--- /dev/null
+++ b/docs/dyn/toolresults_v1beta3.steps.html
@@ -0,0 +1,6408 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="toolresults_v1beta3.html">Cloud Tool Results API</a> . <a href="toolresults_v1beta3.steps.html">steps</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="#accessibilityClusters">accessibilityClusters(name, locale=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists accessibility clusters for a given Step</p>
+<p class="toc_element">
+  <code><a href="#create">create(projectId, historyId, executionId, body=None, requestId=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a Step.</p>
+<p class="toc_element">
+  <code><a href="#get">get(projectId, historyId, executionId, stepId, x__xgafv=None)</a></code></p>
+<p class="firstline">Gets a Step.</p>
+<p class="toc_element">
+  <code><a href="#getPerfMetricsSummary">getPerfMetricsSummary(projectId, historyId, executionId, stepId, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves a PerfMetricsSummary.</p>
+<p class="toc_element">
+  <code><a href="#list">list(projectId, historyId, executionId, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists Steps for a given Execution.</p>
+<p class="toc_element">
+  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
+<p class="toc_element">
+  <code><a href="#patch">patch(projectId, historyId, executionId, stepId, body=None, requestId=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates an existing Step with the supplied partial entity.</p>
+<p class="toc_element">
+  <code><a href="#publishXunitXmlFiles">publishXunitXmlFiles(projectId, historyId, executionId, stepId, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Publish xml files to an existing Step.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="accessibilityClusters">accessibilityClusters(name, locale=None, x__xgafv=None)</code>
+  <pre>Lists accessibility clusters for a given 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
+- FAILED_PRECONDITION - if an argument in the request happens to be
+                        invalid; e.g. if the locale format is incorrect
+- NOT_FOUND - if the containing Step does not exist
+
+Args:
+  name: string, A full resource name of the step.
+For example, projects/my-project/histories/bh.1234567890abcdef/executions/
+1234567890123456789/steps/bs.1234567890abcdef
+
+Required. (required)
+  locale: string, The accepted format is the canonical Unicode format with hyphen as a
+delimiter. Language must be lowercase, Language Script - Capitalized,
+Region - UPPERCASE.
+See http://www.unicode.org/reports/tr35/#Unicode_locale_identifier for
+details.
+
+Required.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for AccessibilityService.ListStepAccessibilityClusters.
+    &quot;clusters&quot;: [ # A sequence of accessibility suggestions, grouped into clusters.
+        # Within the sequence, clusters that belong to the same SuggestionCategory
+        # should be adjacent.
+        # Within each category, clusters should be ordered by their
+        # SuggestionPriority (ERRORs first).
+        # The categories should be ordered by their highest priority cluster.
+      { # A set of similar suggestions that we suspect are closely related.
+          #
+          # This proto and most of the nested protos are branched from
+          # foxandcrown.prelaunchreport.service.SuggestionClusterProto, replacing PLR&#x27;s
+          # dependencies with FTL&#x27;s.
+        &quot;suggestions&quot;: [ # A sequence of suggestions. All of the suggestions within a cluster must
+            # have the same SuggestionPriority and belong to the same SuggestionCategory.
+            # Suggestions with the same screenshot URL should be adjacent.
+          {
+            &quot;title&quot;: &quot;A String&quot;, # General title for the suggestion, in the user&#x27;s language, without markup.
+                # Always set.
+            &quot;priority&quot;: &quot;A String&quot;, # Relative importance of a suggestion.
+                # Always set.
+            &quot;resourceName&quot;: &quot;A String&quot;, # Reference to a view element, identified by its resource name, if it has
+                # one.
+            &quot;secondaryPriority&quot;: 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.
+            &quot;region&quot;: { # A rectangular region. # Region within the screenshot that is relevant to this suggestion.
+                # Optional.
+              &quot;leftPx&quot;: 42, # The left side of the rectangle, in pixels.
+                  # Always set.
+              &quot;topPx&quot;: 42, # The top of the rectangle, in pixels.
+                  # Always set.
+              &quot;heightPx&quot;: 42, # The height, in pixels.
+                  # Always set.
+              &quot;widthPx&quot;: 42, # The width, in pixels.
+                  # Always set.
+            },
+            &quot;pseudoResourceId&quot;: &quot;A String&quot;, # 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,
+                # an element with resource name; similar to an XPath.
+            &quot;helpUrl&quot;: &quot;A String&quot;, # Reference to a help center article concerning this type of suggestion.
+                # Always set.
+            &quot;longMessage&quot;: { # IMPORTANT: It is unsafe to accept this message from an untrusted source, # Message, in the user&#x27;s language, explaining the suggestion, which may
+                # contain markup.
+                # Always set.
+                # since it&#x27;s trivial for an attacker to forge serialized messages that
+                # don&#x27;t fulfill the type&#x27;s safety contract -- for example, it could contain
+                # attacker controlled script. A system which receives a SafeHtmlProto
+                # implicitly trusts the producer of the SafeHtmlProto. So, it&#x27;s generally safe
+                # to return this message in RPC responses, but generally unsafe to accept it
+                # in RPC requests.
+              &quot;privateDoNotAccessOrElseSafeHtmlWrappedValue&quot;: &quot;A String&quot;, # IMPORTANT: Never set or read this field, even from tests, it is private.
+                  # See documentation at the top of .proto file for programming language
+                  # packages with which to create or read this message.
+            },
+            &quot;shortMessage&quot;: { # IMPORTANT: It is unsafe to accept this message from an untrusted source, # Concise message, in the user&#x27;s language, representing the suggestion,
+                # which may contain markup.
+                # Always set.
+                # since it&#x27;s trivial for an attacker to forge serialized messages that
+                # don&#x27;t fulfill the type&#x27;s safety contract -- for example, it could contain
+                # attacker controlled script. A system which receives a SafeHtmlProto
+                # implicitly trusts the producer of the SafeHtmlProto. So, it&#x27;s generally safe
+                # to return this message in RPC responses, but generally unsafe to accept it
+                # in RPC requests.
+              &quot;privateDoNotAccessOrElseSafeHtmlWrappedValue&quot;: &quot;A String&quot;, # IMPORTANT: Never set or read this field, even from tests, it is private.
+                  # See documentation at the top of .proto file for programming language
+                  # packages with which to create or read this message.
+            },
+            &quot;screenId&quot;: &quot;A String&quot;, # ID of the screen for the suggestion.
+                # It is used for getting the corresponding screenshot path. For example,
+                # screen_id &quot;1&quot; corresponds to &quot;1.png&quot; file in GCS.
+                # Always set.
+          },
+        ],
+        &quot;category&quot;: &quot;A String&quot;, # Category in which these types of suggestions should appear.
+            # Always set.
+      },
+    ],
+    &quot;name&quot;: &quot;A String&quot;, # A full resource name of the step.
+        # For example, projects/my-project/histories/bh.1234567890abcdef/executions/
+        # 1234567890123456789/steps/bs.1234567890abcdef
+        #
+        # Always presents.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="create">create(projectId, historyId, executionId, body=None, requestId=None, x__xgafv=None)</code>
+  <pre>Creates a Step.
+
+The returned Step will have the id set.
+
+May return any of the following canonical error codes:
+
+- PERMISSION_DENIED - if the user is not authorized to write to project
+- INVALID_ARGUMENT - if the request is malformed
+- FAILED_PRECONDITION - if the step is too large (more than 10Mib)
+- NOT_FOUND - if the containing Execution does not exist
+
+Args:
+  projectId: string, Required. A Project id. (required)
+  historyId: string, Required. A History id. (required)
+  executionId: string, Required. An Execution id. (required)
+  body: object, The request body.
+    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;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;,
+      },
+    ],
+  }
+
+  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>
+</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>
+</div>
+
+<div class="method">
+    <code class="details" id="getPerfMetricsSummary">getPerfMetricsSummary(projectId, historyId, executionId, stepId, x__xgafv=None)</code>
+  <pre>Retrieves a PerfMetricsSummary.
+
+May return any of the following error code(s):
+- NOT_FOUND - The specified PerfMetricsSummary does not exist
+
+Args:
+  projectId: string, The cloud project (required)
+  historyId: string, A tool results history ID. (required)
+  executionId: string, A tool results execution ID. (required)
+  stepId: string, A tool results step ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A summary of perf metrics collected and performance environment info
+      &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
+        &quot;cpuInfo&quot;: { # CPU related environment info
+          &quot;numberOfCores&quot;: 42, # the number of CPU cores
+          &quot;cpuProcessor&quot;: &quot;A String&quot;, # description of the device processor ie &#x27;1.8 GHz hexa core 64-bit ARMv8-A&#x27;
+          &quot;cpuSpeedInGhz&quot;: 3.14, # the CPU clock speed in GHz
+        },
+        &quot;memoryInfo&quot;: { # Memory related environment info
+          &quot;memoryTotalInKibibyte&quot;: &quot;A String&quot;, # Total memory available on the device in KiB
+          &quot;memoryCapInKibibyte&quot;: &quot;A String&quot;, # Maximum memory that can be allocated to the process in KiB
+        },
+      },
+      &quot;graphicsStats&quot;: { # Graphics statistics for the App. # Graphics statistics for the entire run. Statistics are reset at the
+          # beginning of the run and collected at the end of the run.
+          # The information is collected from &#x27;adb shell dumpsys graphicsstats&#x27;.
+          # 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)
+          {
+            &quot;frameCount&quot;: &quot;A String&quot;, # Number of frames in the bucket.
+            &quot;renderMillis&quot;: &quot;A String&quot;, # Lower bound of render time in milliseconds.
+          },
+        ],
+        &quot;totalFrames&quot;: &quot;A String&quot;, # Total frames rendered by package.
+        &quot;p50Millis&quot;: &quot;A String&quot;, # 50th percentile frame render time in milliseconds.
+        &quot;slowUiThreadCount&quot;: &quot;A String&quot;, # Total &quot;slow UI thread&quot; events.
+        &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;projectId&quot;: &quot;A String&quot;, # The cloud project
+          # @OutputOnly
+      &quot;perfMetrics&quot;: [ # Set of resource collected
+        &quot;A String&quot;,
+      ],
+      &quot;appStartTime&quot;: {
+        &quot;initialDisplayTime&quot;: { #  # The time from app start to the first displayed activity being drawn,
+            # as reported in Logcat. See
+            # https://developer.android.com/topic/performance/launch-time.html#time-initial
+            # 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;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
+            # Activity.reportFullyDrawn(). See
+            # https://developer.android.com/topic/performance/launch-time.html#time-full
+            # 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;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>
+
+<div class="method">
+    <code class="details" id="list">list(projectId, historyId, executionId, pageToken=None, pageSize=None, x__xgafv=None)</code>
+  <pre>Lists Steps for a given Execution.
+
+The steps are sorted by creation_time in descending order. The
+step_id key will be used to order the steps with the same
+creation_time.
+
+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
+- FAILED_PRECONDITION - if an argument in the request happens to be
+                        invalid; e.g. if an attempt is made to list the
+                        children of a nonexistent Step
+- NOT_FOUND - if the containing Execution 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)
+  pageToken: string, A continuation token to resume the query at the next item.
+
+Optional.
+  pageSize: integer, The maximum number of Steps to fetch.
+
+Default value: 25. The server will use this default if the field is not set
+or has a value of 0.
+
+Optional.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  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).
+            #
+            # 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>
+</div>
+
+<div class="method">
+    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
+  <pre>Retrieves the next page of results.
+
+Args:
+  previous_request: The request for the previous page. (required)
+  previous_response: The response from the request for the previous page. (required)
+
+Returns:
+  A request object that you can call &#x27;execute()&#x27; on to request the next
+  page. Returns None if there are no more items in the collection.
+    </pre>
+</div>
+
+<div class="method">
+    <code class="details" id="patch">patch(projectId, historyId, executionId, stepId, body=None, requestId=None, x__xgafv=None)</code>
+  <pre>Updates an existing Step with the supplied partial entity.
+
+May return any of the following canonical error codes:
+
+- PERMISSION_DENIED - if the user is not authorized to write project
+- INVALID_ARGUMENT - if the request is malformed
+- FAILED_PRECONDITION - if the requested state transition is illegal
+                        (e.g try to upload a duplicate xml file), if the
+                        updated step is too large (more than 10Mib)
+- NOT_FOUND - if the containing Execution 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)
+  body: object, The request body.
+    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;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;,
+      },
+    ],
+  }
+
+  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>
+</div>
+
+<div class="method">
+    <code class="details" id="publishXunitXmlFiles">publishXunitXmlFiles(projectId, historyId, executionId, stepId, body=None, x__xgafv=None)</code>
+  <pre>Publish xml files to an existing Step.
+
+May return any of the following canonical error codes:
+
+- PERMISSION_DENIED - if the user is not authorized to write project
+- INVALID_ARGUMENT - if the request is malformed
+- FAILED_PRECONDITION - if the requested state transition is illegal,
+e.g try to upload a duplicate xml file or a file too large.
+- NOT_FOUND - if the containing Execution 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.
+Note: This step must include a TestExecutionStep.
+
+Required. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for StepService.PublishXunitXmlFiles.
+    &quot;xunitXmlFiles&quot;: [ # URI of the Xunit XML files to publish.
+        # 
+        # The maximum size of the file this reference is pointing to is 50MB.
+        # 
+        # Required.
+      { # 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
+      },
+    ],
+  }
+
+  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>
+</div>
+
+</body></html>
\ No newline at end of file