# Cloud Tool Results API . projects . histories . executions . steps

## Instance Methods

Returns the perfMetricsSummary Resource.

Returns the perfSampleSeries Resource.

Returns the testCases Resource.

Returns the thumbnails Resource.

Lists accessibility clusters for a given Step

Creates a Step.

Gets a Step.

Retrieves a PerfMetricsSummary.

Lists Steps for a given Execution.

Retrieves the next page of results.

Updates an existing Step with the supplied partial entity.

Publish xml files to an existing Step.

### Method Details

`accessibilityClusters(name, locale=None, x__xgafv=None)`

    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.
        "clusters": [ # 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's
              # dependencies with FTL's.
            "category": "A String", # Category in which these types of suggestions should appear.
                # Always set.
            "suggestions": [ # 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.
              {
                "screenId": "A String", # ID of the screen for the suggestion.
                    # It is used for getting the corresponding screenshot path. For example,
                    # screen_id "1" corresponds to "1.png" file in GCS.
                    # Always set.
                "secondaryPriority": 3.14, # Relative importance of a suggestion as compared with other suggestions
                    # that have the same priority and category.
                    # This is a meaningless value that can be used to order suggestions that are
                    # in the same category and have the same priority.
                    # The larger values have higher priority (i.e., are more important).
                    # Optional.
                "shortMessage": { # IMPORTANT: It is unsafe to accept this message from an untrusted source, # Concise message, in the user's language, representing the suggestion,
                    # which may contain markup.
                    # Always set.
                    # since it's trivial for an attacker to forge serialized messages that
                    # don't fulfill the type'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's generally safe
                    # to return this message in RPC responses, but generally unsafe to accept it
                    # in RPC requests.
                  "privateDoNotAccessOrElseSafeHtmlWrappedValue": "A String", # 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.
                },
                "longMessage": { # IMPORTANT: It is unsafe to accept this message from an untrusted source, # Message, in the user's language, explaining the suggestion, which may
                    # contain markup.
                    # Always set.
                    # since it's trivial for an attacker to forge serialized messages that
                    # don't fulfill the type'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's generally safe
                    # to return this message in RPC responses, but generally unsafe to accept it
                    # in RPC requests.
                  "privateDoNotAccessOrElseSafeHtmlWrappedValue": "A String", # 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.
                },
                "helpUrl": "A String", # Reference to a help center article concerning this type of suggestion.
                    # Always set.
                "priority": "A String", # Relative importance of a suggestion.
                    # Always set.
                "pseudoResourceId": "A String", # A somewhat human readable identifier of the source view, if it does not
                    # have a resource_name. This is a path within the accessibility hierarchy,
                    # an element with resource name; similar to an XPath.
                "region": { # A rectangular region. # Region within the screenshot that is relevant to this suggestion.
                    # Optional.
                  "leftPx": 42, # The left side of the rectangle, in pixels.
                      # Always set.
                  "heightPx": 42, # The height, in pixels.
                      # Always set.
                  "topPx": 42, # The top of the rectangle, in pixels.
                      # Always set.
                  "widthPx": 42, # The width, in pixels.
                      # Always set.
                },
                "resourceName": "A String", # Reference to a view element, identified by its resource name, if it has
                    # one.
                "title": "A String", # General title for the suggestion, in the user's language, without markup.
                    # Always set.
              },
            ],
          },
        ],
        "name": "A String", # A full resource name of the step.
            # For example, projects/my-project/histories/bh.1234567890abcdef/executions/
            # 1234567890123456789/steps/bs.1234567890abcdef
            #
            # Always presents.
      }

`create(projectId, historyId, executionId, body=None, requestId=None, x__xgafv=None)`

    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'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
        "runDuration": { #  # How long it took for this step to run.
            #
            # If unset, this is set to the difference between creation_time and
            # completion_time when the step is set to the COMPLETE state. In some cases,
            # it is appropriate to set this value separately: For instance, if a step is
            # created, but the operation it represents is queued for a few minutes before
            # it executes, it would be appropriate not to include the time spent queued
            # in its run_duration.
            #
            # PRECONDITION_FAILED will be returned if one attempts to set a
            # run_duration on a step which already has this field set.
            #
            # - In response: present if previously set; always present on COMPLETE step
            # - In create request: optional
            # - In update request: optional
            # A Duration represents a signed, fixed-length span of time represented
            # as a count of seconds and fractions of seconds at nanosecond
            # resolution. It is independent of any calendar and concepts like "day"
            # or "month". It is related to Timestamp in that the difference between
            # two Timestamp values is a Duration and it can be added or subtracted
            # from a Timestamp. Range is approximately +-10,000 years.
          "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
          "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
              # of time. Durations less than one second are represented with a 0
              # `seconds` field and a positive or negative `nanos` field. For durations
              # of one second or more, a non-zero value for the `nanos` field must be
              # of the same sign as the `seconds` field. Must be from -999,999,999
              # to +999,999,999 inclusive.
        },
        "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
            #
            # - In response: always set
            # - In create/update request: never set
            # calendar, encoded as a count of seconds and fractions of seconds at
            # nanosecond resolution. The count is relative to an epoch at UTC midnight on
            # January 1, 1970, in the proleptic Gregorian calendar which extends the
            # Gregorian calendar backwards to year one.
            #
            # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
            # second table is needed for interpretation, using a [24-hour linear
            # smear](https://developers.google.com/time/smear).
            #
            # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
            # restricting to that range, we ensure that we can convert to and from [RFC
            # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
          "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
              # second values with fractions must still have non-negative nanos values
              # that count forward in time. Must be from 0 to 999,999,999
              # inclusive.
          "seconds": "A String", # Represents seconds of UTC time since Unix epoch
              # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
              # 9999-12-31T23:59:59Z inclusive.
        },
        "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
            #
            # This value will be set automatically when state transitions to
            # COMPLETE.
            #
            # - In response: set if the execution state is COMPLETE.
            # - In create/update request: never set
            # calendar, encoded as a count of seconds and fractions of seconds at
            # nanosecond resolution. The count is relative to an epoch at UTC midnight on
            # January 1, 1970, in the proleptic Gregorian calendar which extends the
            # Gregorian calendar backwards to year one.
            #
            # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
            # second table is needed for interpretation, using a [24-hour linear
            # smear](https://developers.google.com/time/smear).
            #
            # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
            # restricting to that range, we ensure that we can convert to and from [RFC
            # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
          "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
              # second values with fractions must still have non-negative nanos values
              # that count forward in time. Must be from 0 to 999,999,999
              # inclusive.
          "seconds": "A String", # Represents seconds of UTC time since Unix epoch
              # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
              # 9999-12-31T23:59:59Z inclusive.
        },
        "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
            # These details can be used identify which group this step is part of.
            # It also identifies the groups 'primary step' which indexes all the group
            # members.
            #
            # - In response: present if previously set.
            # - In create request: optional, set iff this step was performed more than
            # once.
            # - In update request: optional
          "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
              # outcome of each individual step.
            "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
                # configuration as a group.
            "individualOutcome": [ # Step Id and outcome of each individual step.
              { # Step Id and outcome of each individual step that was run as a group with
                  # other steps with the same configuration.
                "runDuration": { #  # How long it took for this step to run.
                    # A Duration represents a signed, fixed-length span of time represented
                    # as a count of seconds and fractions of seconds at nanosecond
                    # resolution. It is independent of any calendar and concepts like "day"
                    # or "month". It is related to Timestamp in that the difference between
                    # two Timestamp values is a Duration and it can be added or subtracted
                    # from a Timestamp. Range is approximately +-10,000 years.
                  "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                      # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                      # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                  "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                      # of time. Durations less than one second are represented with a 0
                      # `seconds` field and a positive or negative `nanos` field. For durations
                      # of one second or more, a non-zero value for the `nanos` field must be
                      # of the same sign as the `seconds` field. Must be from -999,999,999
                      # to +999,999,999 inclusive.
                },
                "multistepNumber": 42, # Unique int given to each step.
                    # Ranges from 0(inclusive) to total number of steps(exclusive).
                    # The primary step is 0.
                "outcomeSummary": "A String",
                "stepId": "A String",
              },
            ],
          },
          "multistepNumber": 42, # Unique int given to each step.
              # Ranges from 0(inclusive) to total number of steps(exclusive).
              # The primary step is 0.
          "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
        },
        "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
            # step.
            #
            # Users are responsible for managing the key namespace such that keys
            # don't accidentally collide.
            #
            # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
            # if the length of any of the keys or values exceeds 100 characters.
            #
            # - In response: always set
            # - In create request: optional
            # - In update request: optional; any new key/value pair will be added to the
            #   map, and any new value for an existing key will update that key's value
          {
            "value": "A String",
            "key": "A String",
          },
        ],
        "name": "A String", # A short human-readable name to display in the UI.
            # Maximum of 100 characters.
            # For example: Clean build
            #
            # A PRECONDITION_FAILED will be returned upon creating a new step if it
            # shares its name and dimension_value with an existing step. If two steps
            # represent a similar action, but have different dimension values, they
            # should share the same name. For instance, if the same set of tests is
            # run on two different platforms, the two steps should have the same name.
            #
            # - In response: always set
            # - In create request: always set
            # - In update request: never set
        "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
            #
            # This is the device usage used for billing purpose, which is different from
            # the run_duration, for example, infrastructure failure won't be charged for
            # device usage.
            #
            # PRECONDITION_FAILED will be returned if one attempts to set a
            # device_usage on a step which already has this field set.
            #
            # - In response: present if previously set.
            # - In create request: optional
            # - In update request: optional
            # A Duration represents a signed, fixed-length span of time represented
            # as a count of seconds and fractions of seconds at nanosecond
            # resolution. It is independent of any calendar and concepts like "day"
            # or "month". It is related to Timestamp in that the difference between
            # two Timestamp values is a Duration and it can be added or subtracted
            # from a Timestamp. Range is approximately +-10,000 years.
          "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
          "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
              # of time. Durations less than one second are represented with a 0
              # `seconds` field and a positive or negative `nanos` field. For durations
              # of one second or more, a non-zero value for the `nanos` field must be
              # of the same sign as the `seconds` field. Must be from -999,999,999
              # to +999,999,999 inclusive.
        },
        "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
            # For example: running cp to copy artifacts from one location to another.
          "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
              # copying artifacts or deploying code.
            "toolLogs": [ # References to any plain text logs output the tool execution.
                #
                # This field can be set before the tool has exited in order to be able to
                # have access to a live view of the logs while the tool is running.
                #
                # The maximum allowed number of tool logs per step is 1000.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, any value provided will be appended to the
                #   existing list
              { # A reference to a file.
                "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                    #
                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                    # or in gsutil format: gs://mybucket/path/to/test.xml
                    # with version-specific info,
                    # gs://mybucket/path/to/test.xml#1360383693690000
                    #
                    # An INVALID_ARGUMENT error will be returned if the URI format is not
                    # supported.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            ],
            "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                # argv in a C program).
                #
                # - In response: present if set by create request
                # - In create request: optional
                # - In update request: never set
              "A String",
            ],
            "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                #
                # The maximum allowed number of tool outputs per step is 1000.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, any value provided will be appended to the
                #   existing list
              { # A reference to a ToolExecution output file.
                "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    #
                    # Test case references are canonically ordered lexicographically by these three
                    # factors:
                    # * First, by test_suite_name.
                    # * Second, by class_name.
                    # * Third, by name.
                  "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                  "className": "A String", # The name of the class.
                  "name": "A String", # The name of the test case.
                      #
                      # Required.
                },
                "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    # calendar, encoded as a count of seconds and fractions of seconds at
                    # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                    # January 1, 1970, in the proleptic Gregorian calendar which extends the
                    # Gregorian calendar backwards to year one.
                    #
                    # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                    # second table is needed for interpretation, using a [24-hour linear
                    # smear](https://developers.google.com/time/smear).
                    #
                    # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                    # restricting to that range, we ensure that we can convert to and from [RFC
                    # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                  "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                      # second values with fractions must still have non-negative nanos values
                      # that count forward in time. Must be from 0 to 999,999,999
                      # inclusive.
                  "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                      # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                      # 9999-12-31T23:59:59Z inclusive.
                },
                "output": { # A reference to a file. # A FileReference to an output file.
                    #
                    # - In response: always set
                    # - In create/update request: always set
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              },
            ],
            "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                # exited.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, a FAILED_PRECONDITION error will be
                #   returned if an exit_code is already set.
              "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                  # successful.
                  #
                  # - In response: always set
                  # - In create/update request: always set
            },
          },
        },
        "stepId": "A String", # A unique identifier within a Execution for this Step.
            #
            # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
            #
            # - In response: always set
            # - In create/update request: never set
        "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
            #
            # It accepts ant-junit xml files which will be parsed into structured test
            # results by the service. Xml file paths are updated in order to append more
            # files, however they can't be deleted.
            #
            # Users can also add test results manually by using the test_result field.
          "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
              #
              # The exit code of this tool will be used to determine if the test passed.
              #
              # - In response: always set
              # - In create/update request: optional
              # copying artifacts or deploying code.
            "toolLogs": [ # References to any plain text logs output the tool execution.
                #
                # This field can be set before the tool has exited in order to be able to
                # have access to a live view of the logs while the tool is running.
                #
                # The maximum allowed number of tool logs per step is 1000.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, any value provided will be appended to the
                #   existing list
              { # A reference to a file.
                "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                    #
                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                    # or in gsutil format: gs://mybucket/path/to/test.xml
                    # with version-specific info,
                    # gs://mybucket/path/to/test.xml#1360383693690000
                    #
                    # An INVALID_ARGUMENT error will be returned if the URI format is not
                    # supported.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            ],
            "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                # argv in a C program).
                #
                # - In response: present if set by create request
                # - In create request: optional
                # - In update request: never set
              "A String",
            ],
            "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                #
                # The maximum allowed number of tool outputs per step is 1000.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, any value provided will be appended to the
                #   existing list
              { # A reference to a ToolExecution output file.
                "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    #
                    # Test case references are canonically ordered lexicographically by these three
                    # factors:
                    # * First, by test_suite_name.
                    # * Second, by class_name.
                    # * Third, by name.
                  "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                  "className": "A String", # The name of the class.
                  "name": "A String", # The name of the test case.
                      #
                      # Required.
                },
                "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    # calendar, encoded as a count of seconds and fractions of seconds at
                    # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                    # January 1, 1970, in the proleptic Gregorian calendar which extends the
                    # Gregorian calendar backwards to year one.
                    #
                    # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                    # second table is needed for interpretation, using a [24-hour linear
                    # smear](https://developers.google.com/time/smear).
                    #
                    # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                    # restricting to that range, we ensure that we can convert to and from [RFC
                    # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                  "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                      # second values with fractions must still have non-negative nanos values
                      # that count forward in time. Must be from 0 to 999,999,999
                      # inclusive.
                  "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                      # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                      # 9999-12-31T23:59:59Z inclusive.
                },
                "output": { # A reference to a file. # A FileReference to an output file.
                    #
                    # - In response: always set
                    # - In create/update request: always set
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              },
            ],
            "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                # exited.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, a FAILED_PRECONDITION error will be
                #   returned if an exit_code is already set.
              "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                  # successful.
                  #
                  # - In response: always set
                  # - In create/update request: always set
            },
          },
          "testIssues": [ # Issues observed during the test execution.
              #
              # For example, if the mobile app under test crashed during the test,
              # the error message and the stack trace content can be recorded here
              # to assist debugging.
              #
              # - In response: present if set by create or update
              # - In create/update request: optional
            { # An issue detected occurring during a test execution.
              "warning": { #  # Warning message with additional details of the issue.
                  # Should always be a message from com.google.devtools.toolresults.v1.warnings
                  # `Any` contains an arbitrary serialized protocol buffer message along with a
                  # URL that describes the type of the serialized message.
                  #
                  # Protobuf library provides support to pack/unpack Any values in the form
                  # of utility functions or additional generated methods of the Any type.
                  #
                  # Example 1: Pack and unpack a message in C++.
                  #
                  #     Foo foo = ...;
                  #     Any any;
                  #     any.PackFrom(foo);
                  #     ...
                  #     if (any.UnpackTo(&foo)) {
                  #       ...
                  #     }
                  #
                  # Example 2: Pack and unpack a message in Java.
                  #
                  #     Foo foo = ...;
                  #     Any any = Any.pack(foo);
                  #     ...
                  #     if (any.is(Foo.class)) {
                  #       foo = any.unpack(Foo.class);
                  #     }
                  #
                  #  Example 3: Pack and unpack a message in Python.
                  #
                  #     foo = Foo(...)
                  #     any = Any()
                  #     any.Pack(foo)
                  #     ...
                  #     if any.Is(Foo.DESCRIPTOR):
                  #       any.Unpack(foo)
                  #       ...
                  #
                  #  Example 4: Pack and unpack a message in Go
                  #
                  #      foo := &pb.Foo{...}
                  #      any, err := ptypes.MarshalAny(foo)
                  #      ...
                  #      foo := &pb.Foo{}
                  #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
                  #        ...
                  #      }
                  #
                  # The pack methods provided by protobuf library will by default use
                  # 'type.googleapis.com/full.type.name' as the type URL and the unpack
                  # methods only use the fully qualified type name after the last '/'
                  # in the type URL, for example "foo.bar.com/x/y.z" will yield type
                  # name "y.z".
                  #
                  #
                  # # JSON
                  #
                  # The JSON representation of an `Any` value uses the regular
                  # representation of the deserialized, embedded message, with an
                  # additional field `@type` which contains the type URL. Example:
                  #
                  #     package google.profile;
                  #     message Person {
                  #       string first_name = 1;
                  #       string last_name = 2;
                  #     }
                  #
                  #     {
                  #       "@type": "type.googleapis.com/google.profile.Person",
                  #       "firstName": <string>,
                  #       "lastName": <string>
                  #     }
                  #
                  # If the embedded message type is well-known and has a custom JSON
                  # representation, that representation will be embedded adding a field
                  # `value` which holds the custom JSON in addition to the `@type`
                  # field. Example (for message google.protobuf.Duration):
                  #
                  #     {
                  #       "@type": "type.googleapis.com/google.protobuf.Duration",
                  #       "value": "1.212s"
                  #     }
                "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
                "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
                    # protocol buffer message. This string must contain at least
                    # one "/" character. The last segment of the URL's path must represent
                    # the fully qualified name of the type (as in
                    # `path/google.protobuf.Duration`). The name should be in a canonical form
                    # (e.g., leading "." is not accepted).
                    #
                    # In practice, teams usually precompile into the binary all types that they
                    # expect it to use in the context of Any. However, for URLs which use the
                    # scheme `http`, `https`, or no scheme, one can optionally set up a type
                    # server that maps type URLs to message definitions as follows:
                    #
                    # * If no scheme is provided, `https` is assumed.
                    # * An HTTP GET on the URL must yield a google.protobuf.Type
                    #   value in binary format, or produce an error.
                    # * Applications are allowed to cache lookup results based on the
                    #   URL, or have them precompiled into a binary to avoid any
                    #   lookup. Therefore, binary compatibility needs to be preserved
                    #   on changes to types. (Use versioned type names to manage
                    #   breaking changes.)
                    #
                    # Note: this functionality is not currently available in the official
                    # protobuf release, and it is not used for type URLs beginning with
                    # type.googleapis.com.
                    #
                    # Schemes other than `http`, `https` (or the empty scheme) might be
                    # used with implementation specific semantics.
              },
              "type": "A String", # Type of issue.
                  # Required.
              "category": "A String", # Category of issue.
                  # Required.
              "severity": "A String", # Severity of issue.
                  # Required.
              "errorMessage": "A String", # A brief human-readable message describing the issue.
                  # Required.
              "stackTrace": { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
                "exception": "A String", # The stack trace message.
                    #
                    # Required
              },
            },
          ],
          "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
              # log by server, or uploaded directly by user. This references should only be
              # called when test suites are fully parsed or uploaded.
              #
              # The maximum allowed number of test suite overviews per step is 1000.
              #
              # - In response: always set
              # - In create request: optional
              # - In update request: never (use publishXunitXmlFiles custom method instead)
            { # A summary of a test suite result either parsed from XML or uploaded
                # directly by a user.
                #
                # Note: the API related comments are for StepService only. This message is
                # also being used in ExecutionService in a read only mode for the corresponding
                # step.
              "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
                  # XML file is stored.
                  #
                  # Note: Multiple test suites can share the same xml_source
                  #
                  # Returns INVALID_ARGUMENT if the uri format is not supported.
                  #
                  # - In create/response: optional
                  # - In update request: never
                "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                    #
                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                    # or in gsutil format: gs://mybucket/path/to/test.xml
                    # with version-specific info,
                    # gs://mybucket/path/to/test.xml#1360383693690000
                    #
                    # An INVALID_ARGUMENT error will be returned if the URI format is not
                    # supported.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
              "elapsedTime": { #  # Elapsed time of test suite.
                  # A Duration represents a signed, fixed-length span of time represented
                  # as a count of seconds and fractions of seconds at nanosecond
                  # resolution. It is independent of any calendar and concepts like "day"
                  # or "month". It is related to Timestamp in that the difference between
                  # two Timestamp values is a Duration and it can be added or subtracted
                  # from a Timestamp. Range is approximately +-10,000 years.
                "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                    # of time. Durations less than one second are represented with a 0
                    # `seconds` field and a positive or negative `nanos` field. For durations
                    # of one second or more, a non-zero value for the `nanos` field must be
                    # of the same sign as the `seconds` field. Must be from -999,999,999
                    # to +999,999,999 inclusive.
              },
              "name": "A String", # The name of the test suite.
                  #
                  # - In create/response: always set
                  # - In update request: never
              "totalCount": 42, # Number of test cases, typically set by the service by parsing the
                  # xml_source.
                  #
                  # - In create/response: always set
                  # - In update request: never
              "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
                  # xml_source.
                  #
                  # - In create/response: always set
                  # - In update request: never
              "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
                  # attempts.
                  #
                  # Present only for rollup test suite overview at environment level. A step
                  # cannot have flaky test cases.
              "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
                  # xml_source.
                  #
                  # - In create/response: always set
                  # - In update request: never
              "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
                  # xml_source. May also be set by the user.
                  #
                  # - In create/response: always set
                  # - In update request: never
            },
          ],
          "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
              #
              # - In response: present if set by create or update
              # - In create/update request: optional
            "testProcessDuration": { #  # How long it took to run the test process.
                #
                # - In response: present if previously set.
                # - In create/update request: optional
                # A Duration represents a signed, fixed-length span of time represented
                # as a count of seconds and fractions of seconds at nanosecond
                # resolution. It is independent of any calendar and concepts like "day"
                # or "month". It is related to Timestamp in that the difference between
                # two Timestamp values is a Duration and it can be added or subtracted
                # from a Timestamp. Range is approximately +-10,000 years.
              "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
              "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                  # of time. Durations less than one second are represented with a 0
                  # `seconds` field and a positive or negative `nanos` field. For durations
                  # of one second or more, a non-zero value for the `nanos` field must be
                  # of the same sign as the `seconds` field. Must be from -999,999,999
                  # to +999,999,999 inclusive.
            },
          },
        },
        "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
            #
            # - In response: present if set by create/update request
            # - In create/update request: optional
          "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
              #
              # Returns INVALID_ARGUMENT if this field is set
              # but the summary is not INCONCLUSIVE.
              #
              # Optional
            "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
                # infrastructure failures
            "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
                # depends on a component other than the system under test which failed.
                #
                # For example, a mobile test requires provisioning a device where the test
                # executes, and that provisioning can fail.
            "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
                # determined.
                # For example, the user pressed ctrl-c which sent a kill signal to the test
                # runner while the test was running.
          },
          "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
              #
              # Returns INVALID_ARGUMENT if this field is set
              # but the summary is not SKIPPED.
              #
              # Optional
            "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
            "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
            "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
          },
          "summary": "A String", # The simplest way to interpret a result.
              #
              # Required
          "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
              #
              # Returns INVALID_ARGUMENT if this field is set
              # but the summary is not FAILURE.
              #
              # Optional
            "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
            "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
                # This might be caused by trying to run a test on an unsupported platform.
            "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
            "failedRoboscript": True or False, # If the Roboscript failed to complete successfully, e.g., because a
                # Roboscript action or assertion failed or a Roboscript action could not be
                # matched during the entire crawl.
            "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
            "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
                # start.
          },
          "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
              #
              # Returns INVALID_ARGUMENT if this field is set
              # but the summary is not SUCCESS.
              #
              # Optional
              # LINT.IfChange
            "otherNativeCrash": True or False, # If a native process other than the app crashed.
          },
        },
        "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
            # then this field allows the child to specify the values of the dimensions.
            #
            # The keys must exactly match the dimension_definition of the execution.
            #
            # For example, if the execution has
            # `dimension_definition = ['attempt', 'device']`
            # then a step must define values for those dimensions, eg.
            # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
            #
            # If a step does not participate in one dimension of the matrix,
            # the value for that dimension should be empty string.
            # For example, if one of the tests is executed by a runner which
            # does not support retries, the step could have
            # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
            #
            # If the step does not participate in any dimensions of the matrix,
            # it may leave dimension_value unset.
            #
            # A PRECONDITION_FAILED will be returned if any of the keys do not exist
            # in the dimension_definition of the execution.
            #
            # A PRECONDITION_FAILED will be returned if another step in this execution
            # already has the same name and dimension_value, but differs on other data
            # fields, for example, step field is different.
            #
            # A PRECONDITION_FAILED will be returned if dimension_value is set, and
            # there is a dimension_definition in the execution which is not specified
            # as one of the keys.
            #
            # - In response: present if set by create
            # - In create request: optional
            # - In update request: never set
          {
            "key": "A String",
            "value": "A String",
          },
        ],
        "hasImages": True or False, # Whether any of the outputs of this step are images whose
            # thumbnails can be fetched with ListThumbnails.
            #
            # - In response: always set
            # - In create/update request: never set
        "description": "A String", # A description of this tool
            # For example: mvn clean package -D skipTests=true
            #
            # - In response: present if set by create/update request
            # - In create/update request: optional
        "state": "A String", # The initial state is IN_PROGRESS.
            # The only legal state transitions are
            # * IN_PROGRESS -> COMPLETE
            #
            # A PRECONDITION_FAILED will be returned if an invalid transition is
            # requested.
            #
            # It is valid to create Step with a state set to COMPLETE.
            # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
            # returned if the state is set to COMPLETE multiple times.
            #
            # - In response: always set
            # - In create/update request: optional
      }

      requestId: string, A unique request ID for server to detect duplicated requests.
    For example, a UUID.

    Optional, but strongly recommended.
      x__xgafv: string, V1 error format.
        Allowed values
          1 - v1 error format
          2 - v2 error format

    Returns:
      An object of the form:

        { # A Step represents a single operation performed as part of
            # Execution. A step can be used to represent the execution of a tool (
            # for example a test runner execution or an execution of a compiler).
            #
            # Steps can overlap (for instance two steps might have the same
            # start time if some operations are done in parallel).
            #
            # Here is an example, let's consider that we have a continuous build is
            # executing a test runner for each iteration. The workflow would look like:
            # - user creates a Execution with id 1
            # - 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
          "runDuration": { #  # How long it took for this step to run.
              #
              # If unset, this is set to the difference between creation_time and
              # completion_time when the step is set to the COMPLETE state. In some cases,
              # it is appropriate to set this value separately: For instance, if a step is
              # created, but the operation it represents is queued for a few minutes before
              # it executes, it would be appropriate not to include the time spent queued
              # in its run_duration.
              #
              # PRECONDITION_FAILED will be returned if one attempts to set a
              # run_duration on a step which already has this field set.
              #
              # - In response: present if previously set; always present on COMPLETE step
              # - In create request: optional
              # - In update request: optional
              # A Duration represents a signed, fixed-length span of time represented
              # as a count of seconds and fractions of seconds at nanosecond
              # resolution. It is independent of any calendar and concepts like "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
              #
              # - In response: always set
              # - In create/update request: never set
              # calendar, encoded as a count of seconds and fractions of seconds at
              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
              # January 1, 1970, in the proleptic Gregorian calendar which extends the
              # Gregorian calendar backwards to year one.
              #
              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
              # second table is needed for interpretation, using a [24-hour linear
              # smear](https://developers.google.com/time/smear).
              #
              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
              # restricting to that range, we ensure that we can convert to and from [RFC
              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                # second values with fractions must still have non-negative nanos values
                # that count forward in time. Must be from 0 to 999,999,999
                # inclusive.
            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                # 9999-12-31T23:59:59Z inclusive.
          },
          "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
              #
              # This value will be set automatically when state transitions to
              # COMPLETE.
              #
              # - In response: set if the execution state is COMPLETE.
              # - In create/update request: never set
              # calendar, encoded as a count of seconds and fractions of seconds at
              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
              # January 1, 1970, in the proleptic Gregorian calendar which extends the
              # Gregorian calendar backwards to year one.
              #
              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
              # second table is needed for interpretation, using a [24-hour linear
              # smear](https://developers.google.com/time/smear).
              #
              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
              # restricting to that range, we ensure that we can convert to and from [RFC
              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                # second values with fractions must still have non-negative nanos values
                # that count forward in time. Must be from 0 to 999,999,999
                # inclusive.
            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                # 9999-12-31T23:59:59Z inclusive.
          },
          "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
              # These details can be used identify which group this step is part of.
              # It also identifies the groups 'primary step' which indexes all the group
              # members.
              #
              # - In response: present if previously set.
              # - In create request: optional, set iff this step was performed more than
              # once.
              # - In update request: optional
            "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
                # outcome of each individual step.
              "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
                  # configuration as a group.
              "individualOutcome": [ # Step Id and outcome of each individual step.
                { # Step Id and outcome of each individual step that was run as a group with
                    # other steps with the same configuration.
                  "runDuration": { #  # How long it took for this step to run.
                      # A Duration represents a signed, fixed-length span of time represented
                      # as a count of seconds and fractions of seconds at nanosecond
                      # resolution. It is independent of any calendar and concepts like "day"
                      # or "month". It is related to Timestamp in that the difference between
                      # two Timestamp values is a Duration and it can be added or subtracted
                      # from a Timestamp. Range is approximately +-10,000 years.
                    "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                    "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                        # of time. Durations less than one second are represented with a 0
                        # `seconds` field and a positive or negative `nanos` field. For durations
                        # of one second or more, a non-zero value for the `nanos` field must be
                        # of the same sign as the `seconds` field. Must be from -999,999,999
                        # to +999,999,999 inclusive.
                  },
                  "multistepNumber": 42, # Unique int given to each step.
                      # Ranges from 0(inclusive) to total number of steps(exclusive).
                      # The primary step is 0.
                  "outcomeSummary": "A String",
                  "stepId": "A String",
                },
              ],
            },
            "multistepNumber": 42, # Unique int given to each step.
                # Ranges from 0(inclusive) to total number of steps(exclusive).
                # The primary step is 0.
            "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
          },
          "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
              # step.
              #
              # Users are responsible for managing the key namespace such that keys
              # don't accidentally collide.
              #
              # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
              # if the length of any of the keys or values exceeds 100 characters.
              #
              # - In response: always set
              # - In create request: optional
              # - In update request: optional; any new key/value pair will be added to the
              #   map, and any new value for an existing key will update that key's value
            {
              "value": "A String",
              "key": "A String",
            },
          ],
          "name": "A String", # A short human-readable name to display in the UI.
              # Maximum of 100 characters.
              # For example: Clean build
              #
              # A PRECONDITION_FAILED will be returned upon creating a new step if it
              # shares its name and dimension_value with an existing step. If two steps
              # represent a similar action, but have different dimension values, they
              # should share the same name. For instance, if the same set of tests is
              # run on two different platforms, the two steps should have the same name.
              #
              # - In response: always set
              # - In create request: always set
              # - In update request: never set
          "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
              #
              # This is the device usage used for billing purpose, which is different from
              # the run_duration, for example, infrastructure failure won't be charged for
              # device usage.
              #
              # PRECONDITION_FAILED will be returned if one attempts to set a
              # device_usage on a step which already has this field set.
              #
              # - In response: present if previously set.
              # - In create request: optional
              # - In update request: optional
              # A Duration represents a signed, fixed-length span of time represented
              # as a count of seconds and fractions of seconds at nanosecond
              # resolution. It is independent of any calendar and concepts like "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
              # For example: running cp to copy artifacts from one location to another.
            "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
                #
                # - In response: present if set by create/update request
                # - In create/update request: optional
                # copying artifacts or deploying code.
              "toolLogs": [ # References to any plain text logs output the tool execution.
                  #
                  # This field can be set before the tool has exited in order to be able to
                  # have access to a live view of the logs while the tool is running.
                  #
                  # The maximum allowed number of tool logs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a file.
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              ],
              "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                  # argv in a C program).
                  #
                  # - In response: present if set by create request
                  # - In create request: optional
                  # - In update request: never set
                "A String",
              ],
              "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                  #
                  # The maximum allowed number of tool outputs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a ToolExecution output file.
                  "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      #
                      # Test case references are canonically ordered lexicographically by these three
                      # factors:
                      # * First, by test_suite_name.
                      # * Second, by class_name.
                      # * Third, by name.
                    "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                    "className": "A String", # The name of the class.
                    "name": "A String", # The name of the test case.
                        #
                        # Required.
                  },
                  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      # calendar, encoded as a count of seconds and fractions of seconds at
                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
                      # Gregorian calendar backwards to year one.
                      #
                      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                      # second table is needed for interpretation, using a [24-hour linear
                      # smear](https://developers.google.com/time/smear).
                      #
                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                      # restricting to that range, we ensure that we can convert to and from [RFC
                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                        # second values with fractions must still have non-negative nanos values
                        # that count forward in time. Must be from 0 to 999,999,999
                        # inclusive.
                    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                        # 9999-12-31T23:59:59Z inclusive.
                  },
                  "output": { # A reference to a file. # A FileReference to an output file.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                    "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                        #
                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                        # or in gsutil format: gs://mybucket/path/to/test.xml
                        # with version-specific info,
                        # gs://mybucket/path/to/test.xml#1360383693690000
                        #
                        # An INVALID_ARGUMENT error will be returned if the URI format is not
                        # supported.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              ],
              "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                  # exited.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, a FAILED_PRECONDITION error will be
                  #   returned if an exit_code is already set.
                "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                    # successful.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            },
          },
          "stepId": "A String", # A unique identifier within a Execution for this Step.
              #
              # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
              #
              # - In response: always set
              # - In create/update request: never set
          "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
              #
              # It accepts ant-junit xml files which will be parsed into structured test
              # results by the service. Xml file paths are updated in order to append more
              # files, however they can't be deleted.
              #
              # Users can also add test results manually by using the test_result field.
            "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
                #
                # The exit code of this tool will be used to determine if the test passed.
                #
                # - In response: always set
                # - In create/update request: optional
                # copying artifacts or deploying code.
              "toolLogs": [ # References to any plain text logs output the tool execution.
                  #
                  # This field can be set before the tool has exited in order to be able to
                  # have access to a live view of the logs while the tool is running.
                  #
                  # The maximum allowed number of tool logs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a file.
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              ],
              "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                  # argv in a C program).
                  #
                  # - In response: present if set by create request
                  # - In create request: optional
                  # - In update request: never set
                "A String",
              ],
              "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                  #
                  # The maximum allowed number of tool outputs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a ToolExecution output file.
                  "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      #
                      # Test case references are canonically ordered lexicographically by these three
                      # factors:
                      # * First, by test_suite_name.
                      # * Second, by class_name.
                      # * Third, by name.
                    "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                    "className": "A String", # The name of the class.
                    "name": "A String", # The name of the test case.
                        #
                        # Required.
                  },
                  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      # calendar, encoded as a count of seconds and fractions of seconds at
                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
                      # Gregorian calendar backwards to year one.
                      #
                      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                      # second table is needed for interpretation, using a [24-hour linear
                      # smear](https://developers.google.com/time/smear).
                      #
                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                      # restricting to that range, we ensure that we can convert to and from [RFC
                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                        # second values with fractions must still have non-negative nanos values
                        # that count forward in time. Must be from 0 to 999,999,999
                        # inclusive.
                    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                        # 9999-12-31T23:59:59Z inclusive.
                  },
                  "output": { # A reference to a file. # A FileReference to an output file.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                    "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                        #
                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                        # or in gsutil format: gs://mybucket/path/to/test.xml
                        # with version-specific info,
                        # gs://mybucket/path/to/test.xml#1360383693690000
                        #
                        # An INVALID_ARGUMENT error will be returned if the URI format is not
                        # supported.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              ],
              "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                  # exited.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, a FAILED_PRECONDITION error will be
                  #   returned if an exit_code is already set.
                "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                    # successful.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            },
            "testIssues": [ # Issues observed during the test execution.
                #
                # For example, if the mobile app under test crashed during the test,
                # the error message and the stack trace content can be recorded here
                # to assist debugging.
                #
                # - In response: present if set by create or update
                # - In create/update request: optional
              { # An issue detected occurring during a test execution.
                "warning": { #  # Warning message with additional details of the issue.
                    # Should always be a message from com.google.devtools.toolresults.v1.warnings
                    # `Any` contains an arbitrary serialized protocol buffer message along with a
                    # URL that describes the type of the serialized message.
                    #
                    # Protobuf library provides support to pack/unpack Any values in the form
                    # of utility functions or additional generated methods of the Any type.
                    #
                    # Example 1: Pack and unpack a message in C++.
                    #
                    #     Foo foo = ...;
                    #     Any any;
                    #     any.PackFrom(foo);
                    #     ...
                    #     if (any.UnpackTo(&foo)) {
                    #       ...
                    #     }
                    #
                    # Example 2: Pack and unpack a message in Java.
                    #
                    #     Foo foo = ...;
                    #     Any any = Any.pack(foo);
                    #     ...
                    #     if (any.is(Foo.class)) {
                    #       foo = any.unpack(Foo.class);
                    #     }
                    #
                    #  Example 3: Pack and unpack a message in Python.
                    #
                    #     foo = Foo(...)
                    #     any = Any()
                    #     any.Pack(foo)
                    #     ...
                    #     if any.Is(Foo.DESCRIPTOR):
                    #       any.Unpack(foo)
                    #       ...
                    #
                    #  Example 4: Pack and unpack a message in Go
                    #
                    #      foo := &pb.Foo{...}
                    #      any, err := ptypes.MarshalAny(foo)
                    #      ...
                    #      foo := &pb.Foo{}
                    #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
                    #        ...
                    #      }
                    #
                    # The pack methods provided by protobuf library will by default use
                    # 'type.googleapis.com/full.type.name' as the type URL and the unpack
                    # methods only use the fully qualified type name after the last '/'
                    # in the type URL, for example "foo.bar.com/x/y.z" will yield type
                    # name "y.z".
                    #
                    #
                    # # JSON
                    #
                    # The JSON representation of an `Any` value uses the regular
                    # representation of the deserialized, embedded message, with an
                    # additional field `@type` which contains the type URL. Example:
                    #
                    #     package google.profile;
                    #     message Person {
                    #       string first_name = 1;
                    #       string last_name = 2;
                    #     }
                    #
                    #     {
                    #       "@type": "type.googleapis.com/google.profile.Person",
                    #       "firstName": <string>,
                    #       "lastName": <string>
                    #     }
                    #
                    # If the embedded message type is well-known and has a custom JSON
                    # representation, that representation will be embedded adding a field
                    # `value` which holds the custom JSON in addition to the `@type`
                    # field. Example (for message google.protobuf.Duration):
                    #
                    #     {
                    #       "@type": "type.googleapis.com/google.protobuf.Duration",
                    #       "value": "1.212s"
                    #     }
                  "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
                  "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
                      # protocol buffer message. This string must contain at least
                      # one "/" character. The last segment of the URL's path must represent
                      # the fully qualified name of the type (as in
                      # `path/google.protobuf.Duration`). The name should be in a canonical form
                      # (e.g., leading "." is not accepted).
                      #
                      # In practice, teams usually precompile into the binary all types that they
                      # expect it to use in the context of Any. However, for URLs which use the
                      # scheme `http`, `https`, or no scheme, one can optionally set up a type
                      # server that maps type URLs to message definitions as follows:
                      #
                      # * If no scheme is provided, `https` is assumed.
                      # * An HTTP GET on the URL must yield a google.protobuf.Type
                      #   value in binary format, or produce an error.
                      # * Applications are allowed to cache lookup results based on the
                      #   URL, or have them precompiled into a binary to avoid any
                      #   lookup. Therefore, binary compatibility needs to be preserved
                      #   on changes to types. (Use versioned type names to manage
                      #   breaking changes.)
                      #
                      # Note: this functionality is not currently available in the official
                      # protobuf release, and it is not used for type URLs beginning with
                      # type.googleapis.com.
                      #
                      # Schemes other than `http`, `https` (or the empty scheme) might be
                      # used with implementation specific semantics.
                },
                "type": "A String", # Type of issue.
                    # Required.
                "category": "A String", # Category of issue.
                    # Required.
                "severity": "A String", # Severity of issue.
                    # Required.
                "errorMessage": "A String", # A brief human-readable message describing the issue.
                    # Required.
                "stackTrace": { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
                  "exception": "A String", # The stack trace message.
                      #
                      # Required
                },
              },
            ],
            "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
                # log by server, or uploaded directly by user. This references should only be
                # called when test suites are fully parsed or uploaded.
                #
                # The maximum allowed number of test suite overviews per step is 1000.
                #
                # - In response: always set
                # - In create request: optional
                # - In update request: never (use publishXunitXmlFiles custom method instead)
              { # A summary of a test suite result either parsed from XML or uploaded
                  # directly by a user.
                  #
                  # Note: the API related comments are for StepService only. This message is
                  # also being used in ExecutionService in a read only mode for the corresponding
                  # step.
                "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
                    # XML file is stored.
                    #
                    # Note: Multiple test suites can share the same xml_source
                    #
                    # Returns INVALID_ARGUMENT if the uri format is not supported.
                    #
                    # - In create/response: optional
                    # - In update request: never
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
                "elapsedTime": { #  # Elapsed time of test suite.
                    # A Duration represents a signed, fixed-length span of time represented
                    # as a count of seconds and fractions of seconds at nanosecond
                    # resolution. It is independent of any calendar and concepts like "day"
                    # or "month". It is related to Timestamp in that the difference between
                    # two Timestamp values is a Duration and it can be added or subtracted
                    # from a Timestamp. Range is approximately +-10,000 years.
                  "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                      # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                      # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                  "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                      # of time. Durations less than one second are represented with a 0
                      # `seconds` field and a positive or negative `nanos` field. For durations
                      # of one second or more, a non-zero value for the `nanos` field must be
                      # of the same sign as the `seconds` field. Must be from -999,999,999
                      # to +999,999,999 inclusive.
                },
                "name": "A String", # The name of the test suite.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "totalCount": 42, # Number of test cases, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
                    # attempts.
                    #
                    # Present only for rollup test suite overview at environment level. A step
                    # cannot have flaky test cases.
                "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
                    # xml_source. May also be set by the user.
                    #
                    # - In create/response: always set
                    # - In update request: never
              },
            ],
            "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
                #
                # - In response: present if set by create or update
                # - In create/update request: optional
              "testProcessDuration": { #  # How long it took to run the test process.
                  #
                  # - In response: present if previously set.
                  # - In create/update request: optional
                  # A Duration represents a signed, fixed-length span of time represented
                  # as a count of seconds and fractions of seconds at nanosecond
                  # resolution. It is independent of any calendar and concepts like "day"
                  # or "month". It is related to Timestamp in that the difference between
                  # two Timestamp values is a Duration and it can be added or subtracted
                  # from a Timestamp. Range is approximately +-10,000 years.
                "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                    # of time. Durations less than one second are represented with a 0
                    # `seconds` field and a positive or negative `nanos` field. For durations
                    # of one second or more, a non-zero value for the `nanos` field must be
                    # of the same sign as the `seconds` field. Must be from -999,999,999
                    # to +999,999,999 inclusive.
              },
            },
          },
          "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
            "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not INCONCLUSIVE.
                #
                # Optional
              "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
                  # infrastructure failures
              "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
                  # depends on a component other than the system under test which failed.
                  #
                  # For example, a mobile test requires provisioning a device where the test
                  # executes, and that provisioning can fail.
              "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
                  # determined.
                  # For example, the user pressed ctrl-c which sent a kill signal to the test
                  # runner while the test was running.
            },
            "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not SKIPPED.
                #
                # Optional
              "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
              "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
              "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
            },
            "summary": "A String", # The simplest way to interpret a result.
                #
                # Required
            "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not FAILURE.
                #
                # Optional
              "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
              "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
                  # This might be caused by trying to run a test on an unsupported platform.
              "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
              "failedRoboscript": True or False, # If the Roboscript failed to complete successfully, e.g., because a
                  # Roboscript action or assertion failed or a Roboscript action could not be
                  # matched during the entire crawl.
              "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
              "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
                  # start.
            },
            "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not SUCCESS.
                #
                # Optional
                # LINT.IfChange
              "otherNativeCrash": True or False, # If a native process other than the app crashed.
            },
          },
          "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
              # then this field allows the child to specify the values of the dimensions.
              #
              # The keys must exactly match the dimension_definition of the execution.
              #
              # For example, if the execution has
              # `dimension_definition = ['attempt', 'device']`
              # then a step must define values for those dimensions, eg.
              # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
              #
              # If a step does not participate in one dimension of the matrix,
              # the value for that dimension should be empty string.
              # For example, if one of the tests is executed by a runner which
              # does not support retries, the step could have
              # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
              #
              # If the step does not participate in any dimensions of the matrix,
              # it may leave dimension_value unset.
              #
              # A PRECONDITION_FAILED will be returned if any of the keys do not exist
              # in the dimension_definition of the execution.
              #
              # A PRECONDITION_FAILED will be returned if another step in this execution
              # already has the same name and dimension_value, but differs on other data
              # fields, for example, step field is different.
              #
              # A PRECONDITION_FAILED will be returned if dimension_value is set, and
              # there is a dimension_definition in the execution which is not specified
              # as one of the keys.
              #
              # - In response: present if set by create
              # - In create request: optional
              # - In update request: never set
            {
              "key": "A String",
              "value": "A String",
            },
          ],
          "hasImages": True or False, # Whether any of the outputs of this step are images whose
              # thumbnails can be fetched with ListThumbnails.
              #
              # - In response: always set
              # - In create/update request: never set
          "description": "A String", # A description of this tool
              # For example: mvn clean package -D skipTests=true
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
          "state": "A String", # The initial state is IN_PROGRESS.
              # The only legal state transitions are
              # * IN_PROGRESS -> COMPLETE
              #
              # A PRECONDITION_FAILED will be returned if an invalid transition is
              # requested.
              #
              # It is valid to create Step with a state set to COMPLETE.
              # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
              # returned if the state is set to COMPLETE multiple times.
              #
              # - In response: always set
              # - In create/update request: optional
        }

`get(projectId, historyId, executionId, stepId, x__xgafv=None)`

    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'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
          "runDuration": { #  # How long it took for this step to run.
              #
              # If unset, this is set to the difference between creation_time and
              # completion_time when the step is set to the COMPLETE state. In some cases,
              # it is appropriate to set this value separately: For instance, if a step is
              # created, but the operation it represents is queued for a few minutes before
              # it executes, it would be appropriate not to include the time spent queued
              # in its run_duration.
              #
              # PRECONDITION_FAILED will be returned if one attempts to set a
              # run_duration on a step which already has this field set.
              #
              # - In response: present if previously set; always present on COMPLETE step
              # - In create request: optional
              # - In update request: optional
              # A Duration represents a signed, fixed-length span of time represented
              # as a count of seconds and fractions of seconds at nanosecond
              # resolution. It is independent of any calendar and concepts like "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
              #
              # - In response: always set
              # - In create/update request: never set
              # calendar, encoded as a count of seconds and fractions of seconds at
              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
              # January 1, 1970, in the proleptic Gregorian calendar which extends the
              # Gregorian calendar backwards to year one.
              #
              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
              # second table is needed for interpretation, using a [24-hour linear
              # smear](https://developers.google.com/time/smear).
              #
              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
              # restricting to that range, we ensure that we can convert to and from [RFC
              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                # second values with fractions must still have non-negative nanos values
                # that count forward in time. Must be from 0 to 999,999,999
                # inclusive.
            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                # 9999-12-31T23:59:59Z inclusive.
          },
          "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
              #
              # This value will be set automatically when state transitions to
              # COMPLETE.
              #
              # - In response: set if the execution state is COMPLETE.
              # - In create/update request: never set
              # calendar, encoded as a count of seconds and fractions of seconds at
              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
              # January 1, 1970, in the proleptic Gregorian calendar which extends the
              # Gregorian calendar backwards to year one.
              #
              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
              # second table is needed for interpretation, using a [24-hour linear
              # smear](https://developers.google.com/time/smear).
              #
              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
              # restricting to that range, we ensure that we can convert to and from [RFC
              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                # second values with fractions must still have non-negative nanos values
                # that count forward in time. Must be from 0 to 999,999,999
                # inclusive.
            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                # 9999-12-31T23:59:59Z inclusive.
          },
          "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
              # These details can be used identify which group this step is part of.
              # It also identifies the groups 'primary step' which indexes all the group
              # members.
              #
              # - In response: present if previously set.
              # - In create request: optional, set iff this step was performed more than
              # once.
              # - In update request: optional
            "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
                # outcome of each individual step.
              "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
                  # configuration as a group.
              "individualOutcome": [ # Step Id and outcome of each individual step.
                { # Step Id and outcome of each individual step that was run as a group with
                    # other steps with the same configuration.
                  "runDuration": { #  # How long it took for this step to run.
                      # A Duration represents a signed, fixed-length span of time represented
                      # as a count of seconds and fractions of seconds at nanosecond
                      # resolution. It is independent of any calendar and concepts like "day"
                      # or "month". It is related to Timestamp in that the difference between
                      # two Timestamp values is a Duration and it can be added or subtracted
                      # from a Timestamp. Range is approximately +-10,000 years.
                    "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                    "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                        # of time. Durations less than one second are represented with a 0
                        # `seconds` field and a positive or negative `nanos` field. For durations
                        # of one second or more, a non-zero value for the `nanos` field must be
                        # of the same sign as the `seconds` field. Must be from -999,999,999
                        # to +999,999,999 inclusive.
                  },
                  "multistepNumber": 42, # Unique int given to each step.
                      # Ranges from 0(inclusive) to total number of steps(exclusive).
                      # The primary step is 0.
                  "outcomeSummary": "A String",
                  "stepId": "A String",
                },
              ],
            },
            "multistepNumber": 42, # Unique int given to each step.
                # Ranges from 0(inclusive) to total number of steps(exclusive).
                # The primary step is 0.
            "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
          },
          "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
              # step.
              #
              # Users are responsible for managing the key namespace such that keys
              # don't accidentally collide.
              #
              # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
              # if the length of any of the keys or values exceeds 100 characters.
              #
              # - In response: always set
              # - In create request: optional
              # - In update request: optional; any new key/value pair will be added to the
              #   map, and any new value for an existing key will update that key's value
            {
              "value": "A String",
              "key": "A String",
            },
          ],
          "name": "A String", # A short human-readable name to display in the UI.
              # Maximum of 100 characters.
              # For example: Clean build
              #
              # A PRECONDITION_FAILED will be returned upon creating a new step if it
              # shares its name and dimension_value with an existing step. If two steps
              # represent a similar action, but have different dimension values, they
              # should share the same name. For instance, if the same set of tests is
              # run on two different platforms, the two steps should have the same name.
              #
              # - In response: always set
              # - In create request: always set
              # - In update request: never set
          "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
              #
              # This is the device usage used for billing purpose, which is different from
              # the run_duration, for example, infrastructure failure won't be charged for
              # device usage.
              #
              # PRECONDITION_FAILED will be returned if one attempts to set a
              # device_usage on a step which already has this field set.
              #
              # - In response: present if previously set.
              # - In create request: optional
              # - In update request: optional
              # A Duration represents a signed, fixed-length span of time represented
              # as a count of seconds and fractions of seconds at nanosecond
              # resolution. It is independent of any calendar and concepts like "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
              # For example: running cp to copy artifacts from one location to another.
            "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
                #
                # - In response: present if set by create/update request
                # - In create/update request: optional
                # copying artifacts or deploying code.
              "toolLogs": [ # References to any plain text logs output the tool execution.
                  #
                  # This field can be set before the tool has exited in order to be able to
                  # have access to a live view of the logs while the tool is running.
                  #
                  # The maximum allowed number of tool logs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a file.
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              ],
              "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                  # argv in a C program).
                  #
                  # - In response: present if set by create request
                  # - In create request: optional
                  # - In update request: never set
                "A String",
              ],
              "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                  #
                  # The maximum allowed number of tool outputs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a ToolExecution output file.
                  "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      #
                      # Test case references are canonically ordered lexicographically by these three
                      # factors:
                      # * First, by test_suite_name.
                      # * Second, by class_name.
                      # * Third, by name.
                    "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                    "className": "A String", # The name of the class.
                    "name": "A String", # The name of the test case.
                        #
                        # Required.
                  },
                  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      # calendar, encoded as a count of seconds and fractions of seconds at
                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
                      # Gregorian calendar backwards to year one.
                      #
                      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                      # second table is needed for interpretation, using a [24-hour linear
                      # smear](https://developers.google.com/time/smear).
                      #
                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                      # restricting to that range, we ensure that we can convert to and from [RFC
                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                        # second values with fractions must still have non-negative nanos values
                        # that count forward in time. Must be from 0 to 999,999,999
                        # inclusive.
                    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                        # 9999-12-31T23:59:59Z inclusive.
                  },
                  "output": { # A reference to a file. # A FileReference to an output file.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                    "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                        #
                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                        # or in gsutil format: gs://mybucket/path/to/test.xml
                        # with version-specific info,
                        # gs://mybucket/path/to/test.xml#1360383693690000
                        #
                        # An INVALID_ARGUMENT error will be returned if the URI format is not
                        # supported.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              ],
              "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                  # exited.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, a FAILED_PRECONDITION error will be
                  #   returned if an exit_code is already set.
                "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                    # successful.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            },
          },
          "stepId": "A String", # A unique identifier within a Execution for this Step.
              #
              # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
              #
              # - In response: always set
              # - In create/update request: never set
          "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
              #
              # It accepts ant-junit xml files which will be parsed into structured test
              # results by the service. Xml file paths are updated in order to append more
              # files, however they can't be deleted.
              #
              # Users can also add test results manually by using the test_result field.
            "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
                #
                # The exit code of this tool will be used to determine if the test passed.
                #
                # - In response: always set
                # - In create/update request: optional
                # copying artifacts or deploying code.
              "toolLogs": [ # References to any plain text logs output the tool execution.
                  #
                  # This field can be set before the tool has exited in order to be able to
                  # have access to a live view of the logs while the tool is running.
                  #
                  # The maximum allowed number of tool logs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a file.
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              ],
              "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                  # argv in a C program).
                  #
                  # - In response: present if set by create request
                  # - In create request: optional
                  # - In update request: never set
                "A String",
              ],
              "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                  #
                  # The maximum allowed number of tool outputs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a ToolExecution output file.
                  "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      #
                      # Test case references are canonically ordered lexicographically by these three
                      # factors:
                      # * First, by test_suite_name.
                      # * Second, by class_name.
                      # * Third, by name.
                    "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                    "className": "A String", # The name of the class.
                    "name": "A String", # The name of the test case.
                        #
                        # Required.
                  },
                  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      # calendar, encoded as a count of seconds and fractions of seconds at
                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
                      # Gregorian calendar backwards to year one.
                      #
                      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                      # second table is needed for interpretation, using a [24-hour linear
                      # smear](https://developers.google.com/time/smear).
                      #
                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                      # restricting to that range, we ensure that we can convert to and from [RFC
                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                        # second values with fractions must still have non-negative nanos values
                        # that count forward in time. Must be from 0 to 999,999,999
                        # inclusive.
                    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                        # 9999-12-31T23:59:59Z inclusive.
                  },
                  "output": { # A reference to a file. # A FileReference to an output file.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                    "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                        #
                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                        # or in gsutil format: gs://mybucket/path/to/test.xml
                        # with version-specific info,
                        # gs://mybucket/path/to/test.xml#1360383693690000
                        #
                        # An INVALID_ARGUMENT error will be returned if the URI format is not
                        # supported.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              ],
              "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                  # exited.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, a FAILED_PRECONDITION error will be
                  #   returned if an exit_code is already set.
                "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                    # successful.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            },
            "testIssues": [ # Issues observed during the test execution.
                #
                # For example, if the mobile app under test crashed during the test,
                # the error message and the stack trace content can be recorded here
                # to assist debugging.
                #
                # - In response: present if set by create or update
                # - In create/update request: optional
              { # An issue detected occurring during a test execution.
                "warning": { #  # Warning message with additional details of the issue.
                    # Should always be a message from com.google.devtools.toolresults.v1.warnings
                    # `Any` contains an arbitrary serialized protocol buffer message along with a
                    # URL that describes the type of the serialized message.
                    #
                    # Protobuf library provides support to pack/unpack Any values in the form
                    # of utility functions or additional generated methods of the Any type.
                    #
                    # Example 1: Pack and unpack a message in C++.
                    #
                    #     Foo foo = ...;
                    #     Any any;
                    #     any.PackFrom(foo);
                    #     ...
                    #     if (any.UnpackTo(&foo)) {
                    #       ...
                    #     }
                    #
                    # Example 2: Pack and unpack a message in Java.
                    #
                    #     Foo foo = ...;
                    #     Any any = Any.pack(foo);
                    #     ...
                    #     if (any.is(Foo.class)) {
                    #       foo = any.unpack(Foo.class);
                    #     }
                    #
                    #  Example 3: Pack and unpack a message in Python.
                    #
                    #     foo = Foo(...)
                    #     any = Any()
                    #     any.Pack(foo)
                    #     ...
                    #     if any.Is(Foo.DESCRIPTOR):
                    #       any.Unpack(foo)
                    #       ...
                    #
                    #  Example 4: Pack and unpack a message in Go
                    #
                    #      foo := &pb.Foo{...}
                    #      any, err := ptypes.MarshalAny(foo)
                    #      ...
                    #      foo := &pb.Foo{}
                    #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
                    #        ...
                    #      }
                    #
                    # The pack methods provided by protobuf library will by default use
                    # 'type.googleapis.com/full.type.name' as the type URL and the unpack
                    # methods only use the fully qualified type name after the last '/'
                    # in the type URL, for example "foo.bar.com/x/y.z" will yield type
                    # name "y.z".
                    #
                    #
                    # # JSON
                    #
                    # The JSON representation of an `Any` value uses the regular
                    # representation of the deserialized, embedded message, with an
                    # additional field `@type` which contains the type URL. Example:
                    #
                    #     package google.profile;
                    #     message Person {
                    #       string first_name = 1;
                    #       string last_name = 2;
                    #     }
                    #
                    #     {
                    #       "@type": "type.googleapis.com/google.profile.Person",
                    #       "firstName": <string>,
                    #       "lastName": <string>
                    #     }
                    #
                    # If the embedded message type is well-known and has a custom JSON
                    # representation, that representation will be embedded adding a field
                    # `value` which holds the custom JSON in addition to the `@type`
                    # field. Example (for message google.protobuf.Duration):
                    #
                    #     {
                    #       "@type": "type.googleapis.com/google.protobuf.Duration",
                    #       "value": "1.212s"
                    #     }
                  "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
                  "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
                      # protocol buffer message. This string must contain at least
                      # one "/" character. The last segment of the URL's path must represent
                      # the fully qualified name of the type (as in
                      # `path/google.protobuf.Duration`). The name should be in a canonical form
                      # (e.g., leading "." is not accepted).
                      #
                      # In practice, teams usually precompile into the binary all types that they
                      # expect it to use in the context of Any. However, for URLs which use the
                      # scheme `http`, `https`, or no scheme, one can optionally set up a type
                      # server that maps type URLs to message definitions as follows:
                      #
                      # * If no scheme is provided, `https` is assumed.
                      # * An HTTP GET on the URL must yield a google.protobuf.Type
                      #   value in binary format, or produce an error.
                      # * Applications are allowed to cache lookup results based on the
                      #   URL, or have them precompiled into a binary to avoid any
                      #   lookup. Therefore, binary compatibility needs to be preserved
                      #   on changes to types. (Use versioned type names to manage
                      #   breaking changes.)
                      #
                      # Note: this functionality is not currently available in the official
                      # protobuf release, and it is not used for type URLs beginning with
                      # type.googleapis.com.
                      #
                      # Schemes other than `http`, `https` (or the empty scheme) might be
                      # used with implementation specific semantics.
                },
                "type": "A String", # Type of issue.
                    # Required.
                "category": "A String", # Category of issue.
                    # Required.
                "severity": "A String", # Severity of issue.
                    # Required.
                "errorMessage": "A String", # A brief human-readable message describing the issue.
                    # Required.
                "stackTrace": { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
                  "exception": "A String", # The stack trace message.
                      #
                      # Required
                },
              },
            ],
            "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
                # log by server, or uploaded directly by user. This references should only be
                # called when test suites are fully parsed or uploaded.
                #
                # The maximum allowed number of test suite overviews per step is 1000.
                #
                # - In response: always set
                # - In create request: optional
                # - In update request: never (use publishXunitXmlFiles custom method instead)
              { # A summary of a test suite result either parsed from XML or uploaded
                  # directly by a user.
                  #
                  # Note: the API related comments are for StepService only. This message is
                  # also being used in ExecutionService in a read only mode for the corresponding
                  # step.
                "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
                    # XML file is stored.
                    #
                    # Note: Multiple test suites can share the same xml_source
                    #
                    # Returns INVALID_ARGUMENT if the uri format is not supported.
                    #
                    # - In create/response: optional
                    # - In update request: never
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
                "elapsedTime": { #  # Elapsed time of test suite.
                    # A Duration represents a signed, fixed-length span of time represented
                    # as a count of seconds and fractions of seconds at nanosecond
                    # resolution. It is independent of any calendar and concepts like "day"
                    # or "month". It is related to Timestamp in that the difference between
                    # two Timestamp values is a Duration and it can be added or subtracted
                    # from a Timestamp. Range is approximately +-10,000 years.
                  "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                      # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                      # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                  "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                      # of time. Durations less than one second are represented with a 0
                      # `seconds` field and a positive or negative `nanos` field. For durations
                      # of one second or more, a non-zero value for the `nanos` field must be
                      # of the same sign as the `seconds` field. Must be from -999,999,999
                      # to +999,999,999 inclusive.
                },
                "name": "A String", # The name of the test suite.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "totalCount": 42, # Number of test cases, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
                    # attempts.
                    #
                    # Present only for rollup test suite overview at environment level. A step
                    # cannot have flaky test cases.
                "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
                    # xml_source. May also be set by the user.
                    #
                    # - In create/response: always set
                    # - In update request: never
              },
            ],
            "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
                #
                # - In response: present if set by create or update
                # - In create/update request: optional
              "testProcessDuration": { #  # How long it took to run the test process.
                  #
                  # - In response: present if previously set.
                  # - In create/update request: optional
                  # A Duration represents a signed, fixed-length span of time represented
                  # as a count of seconds and fractions of seconds at nanosecond
                  # resolution. It is independent of any calendar and concepts like "day"
                  # or "month". It is related to Timestamp in that the difference between
                  # two Timestamp values is a Duration and it can be added or subtracted
                  # from a Timestamp. Range is approximately +-10,000 years.
                "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                    # of time. Durations less than one second are represented with a 0
                    # `seconds` field and a positive or negative `nanos` field. For durations
                    # of one second or more, a non-zero value for the `nanos` field must be
                    # of the same sign as the `seconds` field. Must be from -999,999,999
                    # to +999,999,999 inclusive.
              },
            },
          },
          "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
            "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not INCONCLUSIVE.
                #
                # Optional
              "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
                  # infrastructure failures
              "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
                  # depends on a component other than the system under test which failed.
                  #
                  # For example, a mobile test requires provisioning a device where the test
                  # executes, and that provisioning can fail.
              "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
                  # determined.
                  # For example, the user pressed ctrl-c which sent a kill signal to the test
                  # runner while the test was running.
            },
            "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not SKIPPED.
                #
                # Optional
              "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
              "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
              "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
            },
            "summary": "A String", # The simplest way to interpret a result.
                #
                # Required
            "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not FAILURE.
                #
                # Optional
              "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
              "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
                  # This might be caused by trying to run a test on an unsupported platform.
              "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
              "failedRoboscript": True or False, # If the Roboscript failed to complete successfully, e.g., because a
                  # Roboscript action or assertion failed or a Roboscript action could not be
                  # matched during the entire crawl.
              "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
              "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
                  # start.
            },
            "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not SUCCESS.
                #
                # Optional
                # LINT.IfChange
              "otherNativeCrash": True or False, # If a native process other than the app crashed.
            },
          },
          "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
              # then this field allows the child to specify the values of the dimensions.
              #
              # The keys must exactly match the dimension_definition of the execution.
              #
              # For example, if the execution has
              # `dimension_definition = ['attempt', 'device']`
              # then a step must define values for those dimensions, eg.
              # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
              #
              # If a step does not participate in one dimension of the matrix,
              # the value for that dimension should be empty string.
              # For example, if one of the tests is executed by a runner which
              # does not support retries, the step could have
              # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
              #
              # If the step does not participate in any dimensions of the matrix,
              # it may leave dimension_value unset.
              #
              # A PRECONDITION_FAILED will be returned if any of the keys do not exist
              # in the dimension_definition of the execution.
              #
              # A PRECONDITION_FAILED will be returned if another step in this execution
              # already has the same name and dimension_value, but differs on other data
              # fields, for example, step field is different.
              #
              # A PRECONDITION_FAILED will be returned if dimension_value is set, and
              # there is a dimension_definition in the execution which is not specified
              # as one of the keys.
              #
              # - In response: present if set by create
              # - In create request: optional
              # - In update request: never set
            {
              "key": "A String",
              "value": "A String",
            },
          ],
          "hasImages": True or False, # Whether any of the outputs of this step are images whose
              # thumbnails can be fetched with ListThumbnails.
              #
              # - In response: always set
              # - In create/update request: never set
          "description": "A String", # A description of this tool
              # For example: mvn clean package -D skipTests=true
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
          "state": "A String", # The initial state is IN_PROGRESS.
              # The only legal state transitions are
              # * IN_PROGRESS -> COMPLETE
              #
              # A PRECONDITION_FAILED will be returned if an invalid transition is
              # requested.
              #
              # It is valid to create Step with a state set to COMPLETE.
              # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
              # returned if the state is set to COMPLETE multiple times.
              #
              # - In response: always set
              # - In create/update request: optional
        }

`getPerfMetricsSummary(projectId, historyId, executionId, stepId, x__xgafv=None)`

    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
        "stepId": "A String", # A tool results step ID.
            # @OutputOnly
        "graphicsStats": { # 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 'adb shell dumpsys graphicsstats'.
            # For more info see:
            # https://developer.android.com/training/testing/performance.html
            # Statistics will only be present for API 23+.
          "highInputLatencyCount": "A String", # Total "high input latency" events.
          "p50Millis": "A String", # 50th percentile frame render time in milliseconds.
          "slowUiThreadCount": "A String", # Total "slow UI thread" events.
          "slowDrawCount": "A String", # Total "slow draw" events.
          "missedVsyncCount": "A String", # Total "missed vsync" events.
          "jankyFrames": "A String", # Total frames with slow render time. Should be <= total_frames.
          "totalFrames": "A String", # Total frames rendered by package.
          "p99Millis": "A String", # 99th percentile frame render time in milliseconds.
          "buckets": [ # Histogram of frame render times. There should be 154 buckets ranging from
              # [5ms, 6ms) to [4950ms, infinity)
            {
              "frameCount": "A String", # Number of frames in the bucket.
              "renderMillis": "A String", # Lower bound of render time in milliseconds.
            },
          ],
          "slowBitmapUploadCount": "A String", # Total "slow bitmap upload" events.
          "p90Millis": "A String", # 90th percentile frame render time in milliseconds.
          "p95Millis": "A String", # 95th percentile frame render time in milliseconds.
        },
        "appStartTime": {
          "fullyDrawnTime": { #  # Optional. The time from app start to reaching the developer-reported
              # "fully drawn" 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 "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "initialDisplayTime": { #  # 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 "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
        },
        "projectId": "A String", # The cloud project
            # @OutputOnly
        "historyId": "A String", # A tool results history ID.
            # @OutputOnly
        "perfEnvironment": { # Encapsulates performance environment info # Describes the environment in which the performance metrics were collected
          "cpuInfo": { # CPU related environment info
            "cpuProcessor": "A String", # description of the device processor ie '1.8 GHz hexa core 64-bit ARMv8-A'
            "numberOfCores": 42, # the number of CPU cores
            "cpuSpeedInGhz": 3.14, # the CPU clock speed in GHz
          },
          "memoryInfo": { # Memory related environment info
            "memoryTotalInKibibyte": "A String", # Total memory available on the device in KiB
            "memoryCapInKibibyte": "A String", # Maximum memory that can be allocated to the process in KiB
          },
        },
        "perfMetrics": [ # Set of resource collected
          "A String",
        ],
        "executionId": "A String", # A tool results execution ID.
            # @OutputOnly
      }

`list(projectId, historyId, executionId, pageSize=None, pageToken=None, x__xgafv=None)`

    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)
      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.
      pageToken: string, A continuation token to resume the query at the next item.

    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.
        "steps": [ # 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'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
              "runDuration": { #  # How long it took for this step to run.
                  #
                  # If unset, this is set to the difference between creation_time and
                  # completion_time when the step is set to the COMPLETE state. In some cases,
                  # it is appropriate to set this value separately: For instance, if a step is
                  # created, but the operation it represents is queued for a few minutes before
                  # it executes, it would be appropriate not to include the time spent queued
                  # in its run_duration.
                  #
                  # PRECONDITION_FAILED will be returned if one attempts to set a
                  # run_duration on a step which already has this field set.
                  #
                  # - In response: present if previously set; always present on COMPLETE step
                  # - In create request: optional
                  # - In update request: optional
                  # A Duration represents a signed, fixed-length span of time represented
                  # as a count of seconds and fractions of seconds at nanosecond
                  # resolution. It is independent of any calendar and concepts like "day"
                  # or "month". It is related to Timestamp in that the difference between
                  # two Timestamp values is a Duration and it can be added or subtracted
                  # from a Timestamp. Range is approximately +-10,000 years.
                "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                    # of time. Durations less than one second are represented with a 0
                    # `seconds` field and a positive or negative `nanos` field. For durations
                    # of one second or more, a non-zero value for the `nanos` field must be
                    # of the same sign as the `seconds` field. Must be from -999,999,999
                    # to +999,999,999 inclusive.
              },
              "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
                  #
                  # - In response: always set
                  # - In create/update request: never set
                  # calendar, encoded as a count of seconds and fractions of seconds at
                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
                  # Gregorian calendar backwards to year one.
                  #
                  # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                  # second table is needed for interpretation, using a [24-hour linear
                  # smear](https://developers.google.com/time/smear).
                  #
                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                  # restricting to that range, we ensure that we can convert to and from [RFC
                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                    # second values with fractions must still have non-negative nanos values
                    # that count forward in time. Must be from 0 to 999,999,999
                    # inclusive.
                "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                    # 9999-12-31T23:59:59Z inclusive.
              },
              "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
                  #
                  # This value will be set automatically when state transitions to
                  # COMPLETE.
                  #
                  # - In response: set if the execution state is COMPLETE.
                  # - In create/update request: never set
                  # calendar, encoded as a count of seconds and fractions of seconds at
                  # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                  # January 1, 1970, in the proleptic Gregorian calendar which extends the
                  # Gregorian calendar backwards to year one.
                  #
                  # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                  # second table is needed for interpretation, using a [24-hour linear
                  # smear](https://developers.google.com/time/smear).
                  #
                  # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                  # restricting to that range, we ensure that we can convert to and from [RFC
                  # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                    # second values with fractions must still have non-negative nanos values
                    # that count forward in time. Must be from 0 to 999,999,999
                    # inclusive.
                "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                    # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                    # 9999-12-31T23:59:59Z inclusive.
              },
              "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
                  # These details can be used identify which group this step is part of.
                  # It also identifies the groups 'primary step' which indexes all the group
                  # members.
                  #
                  # - In response: present if previously set.
                  # - In create request: optional, set iff this step was performed more than
                  # once.
                  # - In update request: optional
                "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
                    # outcome of each individual step.
                  "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
                      # configuration as a group.
                  "individualOutcome": [ # Step Id and outcome of each individual step.
                    { # Step Id and outcome of each individual step that was run as a group with
                        # other steps with the same configuration.
                      "runDuration": { #  # How long it took for this step to run.
                          # A Duration represents a signed, fixed-length span of time represented
                          # as a count of seconds and fractions of seconds at nanosecond
                          # resolution. It is independent of any calendar and concepts like "day"
                          # or "month". It is related to Timestamp in that the difference between
                          # two Timestamp values is a Duration and it can be added or subtracted
                          # from a Timestamp. Range is approximately +-10,000 years.
                        "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                            # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                            # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                        "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                            # of time. Durations less than one second are represented with a 0
                            # `seconds` field and a positive or negative `nanos` field. For durations
                            # of one second or more, a non-zero value for the `nanos` field must be
                            # of the same sign as the `seconds` field. Must be from -999,999,999
                            # to +999,999,999 inclusive.
                      },
                      "multistepNumber": 42, # Unique int given to each step.
                          # Ranges from 0(inclusive) to total number of steps(exclusive).
                          # The primary step is 0.
                      "outcomeSummary": "A String",
                      "stepId": "A String",
                    },
                  ],
                },
                "multistepNumber": 42, # Unique int given to each step.
                    # Ranges from 0(inclusive) to total number of steps(exclusive).
                    # The primary step is 0.
                "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
              },
              "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
                  # step.
                  #
                  # Users are responsible for managing the key namespace such that keys
                  # don't accidentally collide.
                  #
                  # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
                  # if the length of any of the keys or values exceeds 100 characters.
                  #
                  # - In response: always set
                  # - In create request: optional
                  # - In update request: optional; any new key/value pair will be added to the
                  #   map, and any new value for an existing key will update that key's value
                {
                  "value": "A String",
                  "key": "A String",
                },
              ],
              "name": "A String", # A short human-readable name to display in the UI.
                  # Maximum of 100 characters.
                  # For example: Clean build
                  #
                  # A PRECONDITION_FAILED will be returned upon creating a new step if it
                  # shares its name and dimension_value with an existing step. If two steps
                  # represent a similar action, but have different dimension values, they
                  # should share the same name. For instance, if the same set of tests is
                  # run on two different platforms, the two steps should have the same name.
                  #
                  # - In response: always set
                  # - In create request: always set
                  # - In update request: never set
              "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
                  #
                  # This is the device usage used for billing purpose, which is different from
                  # the run_duration, for example, infrastructure failure won't be charged for
                  # device usage.
                  #
                  # PRECONDITION_FAILED will be returned if one attempts to set a
                  # device_usage on a step which already has this field set.
                  #
                  # - In response: present if previously set.
                  # - In create request: optional
                  # - In update request: optional
                  # A Duration represents a signed, fixed-length span of time represented
                  # as a count of seconds and fractions of seconds at nanosecond
                  # resolution. It is independent of any calendar and concepts like "day"
                  # or "month". It is related to Timestamp in that the difference between
                  # two Timestamp values is a Duration and it can be added or subtracted
                  # from a Timestamp. Range is approximately +-10,000 years.
                "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                    # of time. Durations less than one second are represented with a 0
                    # `seconds` field and a positive or negative `nanos` field. For durations
                    # of one second or more, a non-zero value for the `nanos` field must be
                    # of the same sign as the `seconds` field. Must be from -999,999,999
                    # to +999,999,999 inclusive.
              },
              "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
                  # For example: running cp to copy artifacts from one location to another.
                "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    # copying artifacts or deploying code.
                  "toolLogs": [ # References to any plain text logs output the tool execution.
                      #
                      # This field can be set before the tool has exited in order to be able to
                      # have access to a live view of the logs while the tool is running.
                      #
                      # The maximum allowed number of tool logs per step is 1000.
                      #
                      # - In response: present if set by create/update request
                      # - In create request: optional
                      # - In update request: optional, any value provided will be appended to the
                      #   existing list
                    { # A reference to a file.
                      "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                          #
                          # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                          # or in gsutil format: gs://mybucket/path/to/test.xml
                          # with version-specific info,
                          # gs://mybucket/path/to/test.xml#1360383693690000
                          #
                          # An INVALID_ARGUMENT error will be returned if the URI format is not
                          # supported.
                          #
                          # - In response: always set
                          # - In create/update request: always set
                    },
                  ],
                  "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                      # argv in a C program).
                      #
                      # - In response: present if set by create request
                      # - In create request: optional
                      # - In update request: never set
                    "A String",
                  ],
                  "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                      #
                      # The maximum allowed number of tool outputs per step is 1000.
                      #
                      # - In response: present if set by create/update request
                      # - In create request: optional
                      # - In update request: optional, any value provided will be appended to the
                      #   existing list
                    { # A reference to a ToolExecution output file.
                      "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                          #
                          # - In response: present if set by create/update request
                          # - In create/update request: optional
                          #
                          # Test case references are canonically ordered lexicographically by these three
                          # factors:
                          # * First, by test_suite_name.
                          # * Second, by class_name.
                          # * Third, by name.
                        "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                        "className": "A String", # The name of the class.
                        "name": "A String", # The name of the test case.
                            #
                            # Required.
                      },
                      "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                          #
                          # - In response: present if set by create/update request
                          # - In create/update request: optional
                          # calendar, encoded as a count of seconds and fractions of seconds at
                          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                          # January 1, 1970, in the proleptic Gregorian calendar which extends the
                          # Gregorian calendar backwards to year one.
                          #
                          # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                          # second table is needed for interpretation, using a [24-hour linear
                          # smear](https://developers.google.com/time/smear).
                          #
                          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                          # restricting to that range, we ensure that we can convert to and from [RFC
                          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                        "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                            # second values with fractions must still have non-negative nanos values
                            # that count forward in time. Must be from 0 to 999,999,999
                            # inclusive.
                        "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                            # 9999-12-31T23:59:59Z inclusive.
                      },
                      "output": { # A reference to a file. # A FileReference to an output file.
                          #
                          # - In response: always set
                          # - In create/update request: always set
                        "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                            #
                            # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                            # or in gsutil format: gs://mybucket/path/to/test.xml
                            # with version-specific info,
                            # gs://mybucket/path/to/test.xml#1360383693690000
                            #
                            # An INVALID_ARGUMENT error will be returned if the URI format is not
                            # supported.
                            #
                            # - In response: always set
                            # - In create/update request: always set
                      },
                    },
                  ],
                  "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                      # exited.
                      #
                      # - In response: present if set by create/update request
                      # - In create request: optional
                      # - In update request: optional, a FAILED_PRECONDITION error will be
                      #   returned if an exit_code is already set.
                    "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                        # successful.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              },
              "stepId": "A String", # A unique identifier within a Execution for this Step.
                  #
                  # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
                  #
                  # - In response: always set
                  # - In create/update request: never set
              "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
                  #
                  # It accepts ant-junit xml files which will be parsed into structured test
                  # results by the service. Xml file paths are updated in order to append more
                  # files, however they can't be deleted.
                  #
                  # Users can also add test results manually by using the test_result field.
                "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
                    #
                    # The exit code of this tool will be used to determine if the test passed.
                    #
                    # - In response: always set
                    # - In create/update request: optional
                    # copying artifacts or deploying code.
                  "toolLogs": [ # References to any plain text logs output the tool execution.
                      #
                      # This field can be set before the tool has exited in order to be able to
                      # have access to a live view of the logs while the tool is running.
                      #
                      # The maximum allowed number of tool logs per step is 1000.
                      #
                      # - In response: present if set by create/update request
                      # - In create request: optional
                      # - In update request: optional, any value provided will be appended to the
                      #   existing list
                    { # A reference to a file.
                      "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                          #
                          # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                          # or in gsutil format: gs://mybucket/path/to/test.xml
                          # with version-specific info,
                          # gs://mybucket/path/to/test.xml#1360383693690000
                          #
                          # An INVALID_ARGUMENT error will be returned if the URI format is not
                          # supported.
                          #
                          # - In response: always set
                          # - In create/update request: always set
                    },
                  ],
                  "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                      # argv in a C program).
                      #
                      # - In response: present if set by create request
                      # - In create request: optional
                      # - In update request: never set
                    "A String",
                  ],
                  "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                      #
                      # The maximum allowed number of tool outputs per step is 1000.
                      #
                      # - In response: present if set by create/update request
                      # - In create request: optional
                      # - In update request: optional, any value provided will be appended to the
                      #   existing list
                    { # A reference to a ToolExecution output file.
                      "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                          #
                          # - In response: present if set by create/update request
                          # - In create/update request: optional
                          #
                          # Test case references are canonically ordered lexicographically by these three
                          # factors:
                          # * First, by test_suite_name.
                          # * Second, by class_name.
                          # * Third, by name.
                        "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                        "className": "A String", # The name of the class.
                        "name": "A String", # The name of the test case.
                            #
                            # Required.
                      },
                      "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                          #
                          # - In response: present if set by create/update request
                          # - In create/update request: optional
                          # calendar, encoded as a count of seconds and fractions of seconds at
                          # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                          # January 1, 1970, in the proleptic Gregorian calendar which extends the
                          # Gregorian calendar backwards to year one.
                          #
                          # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                          # second table is needed for interpretation, using a [24-hour linear
                          # smear](https://developers.google.com/time/smear).
                          #
                          # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                          # restricting to that range, we ensure that we can convert to and from [RFC
                          # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                        "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                            # second values with fractions must still have non-negative nanos values
                            # that count forward in time. Must be from 0 to 999,999,999
                            # inclusive.
                        "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                            # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                            # 9999-12-31T23:59:59Z inclusive.
                      },
                      "output": { # A reference to a file. # A FileReference to an output file.
                          #
                          # - In response: always set
                          # - In create/update request: always set
                        "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                            #
                            # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                            # or in gsutil format: gs://mybucket/path/to/test.xml
                            # with version-specific info,
                            # gs://mybucket/path/to/test.xml#1360383693690000
                            #
                            # An INVALID_ARGUMENT error will be returned if the URI format is not
                            # supported.
                            #
                            # - In response: always set
                            # - In create/update request: always set
                      },
                    },
                  ],
                  "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                      # exited.
                      #
                      # - In response: present if set by create/update request
                      # - In create request: optional
                      # - In update request: optional, a FAILED_PRECONDITION error will be
                      #   returned if an exit_code is already set.
                    "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                        # successful.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
                "testIssues": [ # Issues observed during the test execution.
                    #
                    # For example, if the mobile app under test crashed during the test,
                    # the error message and the stack trace content can be recorded here
                    # to assist debugging.
                    #
                    # - In response: present if set by create or update
                    # - In create/update request: optional
                  { # An issue detected occurring during a test execution.
                    "warning": { #  # Warning message with additional details of the issue.
                        # Should always be a message from com.google.devtools.toolresults.v1.warnings
                        # `Any` contains an arbitrary serialized protocol buffer message along with a
                        # URL that describes the type of the serialized message.
                        #
                        # Protobuf library provides support to pack/unpack Any values in the form
                        # of utility functions or additional generated methods of the Any type.
                        #
                        # Example 1: Pack and unpack a message in C++.
                        #
                        #     Foo foo = ...;
                        #     Any any;
                        #     any.PackFrom(foo);
                        #     ...
                        #     if (any.UnpackTo(&foo)) {
                        #       ...
                        #     }
                        #
                        # Example 2: Pack and unpack a message in Java.
                        #
                        #     Foo foo = ...;
                        #     Any any = Any.pack(foo);
                        #     ...
                        #     if (any.is(Foo.class)) {
                        #       foo = any.unpack(Foo.class);
                        #     }
                        #
                        #  Example 3: Pack and unpack a message in Python.
                        #
                        #     foo = Foo(...)
                        #     any = Any()
                        #     any.Pack(foo)
                        #     ...
                        #     if any.Is(Foo.DESCRIPTOR):
                        #       any.Unpack(foo)
                        #       ...
                        #
                        #  Example 4: Pack and unpack a message in Go
                        #
                        #      foo := &pb.Foo{...}
                        #      any, err := ptypes.MarshalAny(foo)
                        #      ...
                        #      foo := &pb.Foo{}
                        #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
                        #        ...
                        #      }
                        #
                        # The pack methods provided by protobuf library will by default use
                        # 'type.googleapis.com/full.type.name' as the type URL and the unpack
                        # methods only use the fully qualified type name after the last '/'
                        # in the type URL, for example "foo.bar.com/x/y.z" will yield type
                        # name "y.z".
                        #
                        #
                        # # JSON
                        #
                        # The JSON representation of an `Any` value uses the regular
                        # representation of the deserialized, embedded message, with an
                        # additional field `@type` which contains the type URL. Example:
                        #
                        #     package google.profile;
                        #     message Person {
                        #       string first_name = 1;
                        #       string last_name = 2;
                        #     }
                        #
                        #     {
                        #       "@type": "type.googleapis.com/google.profile.Person",
                        #       "firstName": <string>,
                        #       "lastName": <string>
                        #     }
                        #
                        # If the embedded message type is well-known and has a custom JSON
                        # representation, that representation will be embedded adding a field
                        # `value` which holds the custom JSON in addition to the `@type`
                        # field. Example (for message google.protobuf.Duration):
                        #
                        #     {
                        #       "@type": "type.googleapis.com/google.protobuf.Duration",
                        #       "value": "1.212s"
                        #     }
                      "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
                      "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
                          # protocol buffer message. This string must contain at least
                          # one "/" character. The last segment of the URL's path must represent
                          # the fully qualified name of the type (as in
                          # `path/google.protobuf.Duration`). The name should be in a canonical form
                          # (e.g., leading "." is not accepted).
                          #
                          # In practice, teams usually precompile into the binary all types that they
                          # expect it to use in the context of Any. However, for URLs which use the
                          # scheme `http`, `https`, or no scheme, one can optionally set up a type
                          # server that maps type URLs to message definitions as follows:
                          #
                          # * If no scheme is provided, `https` is assumed.
                          # * An HTTP GET on the URL must yield a google.protobuf.Type
                          #   value in binary format, or produce an error.
                          # * Applications are allowed to cache lookup results based on the
                          #   URL, or have them precompiled into a binary to avoid any
                          #   lookup. Therefore, binary compatibility needs to be preserved
                          #   on changes to types. (Use versioned type names to manage
                          #   breaking changes.)
                          #
                          # Note: this functionality is not currently available in the official
                          # protobuf release, and it is not used for type URLs beginning with
                          # type.googleapis.com.
                          #
                          # Schemes other than `http`, `https` (or the empty scheme) might be
                          # used with implementation specific semantics.
                    },
                    "type": "A String", # Type of issue.
                        # Required.
                    "category": "A String", # Category of issue.
                        # Required.
                    "severity": "A String", # Severity of issue.
                        # Required.
                    "errorMessage": "A String", # A brief human-readable message describing the issue.
                        # Required.
                    "stackTrace": { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
                      "exception": "A String", # The stack trace message.
                          #
                          # Required
                    },
                  },
                ],
                "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
                    # log by server, or uploaded directly by user. This references should only be
                    # called when test suites are fully parsed or uploaded.
                    #
                    # The maximum allowed number of test suite overviews per step is 1000.
                    #
                    # - In response: always set
                    # - In create request: optional
                    # - In update request: never (use publishXunitXmlFiles custom method instead)
                  { # A summary of a test suite result either parsed from XML or uploaded
                      # directly by a user.
                      #
                      # Note: the API related comments are for StepService only. This message is
                      # also being used in ExecutionService in a read only mode for the corresponding
                      # step.
                    "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
                        # XML file is stored.
                        #
                        # Note: Multiple test suites can share the same xml_source
                        #
                        # Returns INVALID_ARGUMENT if the uri format is not supported.
                        #
                        # - In create/response: optional
                        # - In update request: never
                      "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                          #
                          # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                          # or in gsutil format: gs://mybucket/path/to/test.xml
                          # with version-specific info,
                          # gs://mybucket/path/to/test.xml#1360383693690000
                          #
                          # An INVALID_ARGUMENT error will be returned if the URI format is not
                          # supported.
                          #
                          # - In response: always set
                          # - In create/update request: always set
                    },
                    "elapsedTime": { #  # Elapsed time of test suite.
                        # A Duration represents a signed, fixed-length span of time represented
                        # as a count of seconds and fractions of seconds at nanosecond
                        # resolution. It is independent of any calendar and concepts like "day"
                        # or "month". It is related to Timestamp in that the difference between
                        # two Timestamp values is a Duration and it can be added or subtracted
                        # from a Timestamp. Range is approximately +-10,000 years.
                      "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                          # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                          # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                      "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                          # of time. Durations less than one second are represented with a 0
                          # `seconds` field and a positive or negative `nanos` field. For durations
                          # of one second or more, a non-zero value for the `nanos` field must be
                          # of the same sign as the `seconds` field. Must be from -999,999,999
                          # to +999,999,999 inclusive.
                    },
                    "name": "A String", # The name of the test suite.
                        #
                        # - In create/response: always set
                        # - In update request: never
                    "totalCount": 42, # Number of test cases, typically set by the service by parsing the
                        # xml_source.
                        #
                        # - In create/response: always set
                        # - In update request: never
                    "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
                        # xml_source.
                        #
                        # - In create/response: always set
                        # - In update request: never
                    "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
                        # attempts.
                        #
                        # Present only for rollup test suite overview at environment level. A step
                        # cannot have flaky test cases.
                    "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
                        # xml_source.
                        #
                        # - In create/response: always set
                        # - In update request: never
                    "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
                        # xml_source. May also be set by the user.
                        #
                        # - In create/response: always set
                        # - In update request: never
                  },
                ],
                "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
                    #
                    # - In response: present if set by create or update
                    # - In create/update request: optional
                  "testProcessDuration": { #  # How long it took to run the test process.
                      #
                      # - In response: present if previously set.
                      # - In create/update request: optional
                      # A Duration represents a signed, fixed-length span of time represented
                      # as a count of seconds and fractions of seconds at nanosecond
                      # resolution. It is independent of any calendar and concepts like "day"
                      # or "month". It is related to Timestamp in that the difference between
                      # two Timestamp values is a Duration and it can be added or subtracted
                      # from a Timestamp. Range is approximately +-10,000 years.
                    "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                    "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                        # of time. Durations less than one second are represented with a 0
                        # `seconds` field and a positive or negative `nanos` field. For durations
                        # of one second or more, a non-zero value for the `nanos` field must be
                        # of the same sign as the `seconds` field. Must be from -999,999,999
                        # to +999,999,999 inclusive.
                  },
                },
              },
              "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
                  #
                  # - In response: present if set by create/update request
                  # - In create/update request: optional
                "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
                    #
                    # Returns INVALID_ARGUMENT if this field is set
                    # but the summary is not INCONCLUSIVE.
                    #
                    # Optional
                  "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
                      # infrastructure failures
                  "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
                      # depends on a component other than the system under test which failed.
                      #
                      # For example, a mobile test requires provisioning a device where the test
                      # executes, and that provisioning can fail.
                  "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
                      # determined.
                      # For example, the user pressed ctrl-c which sent a kill signal to the test
                      # runner while the test was running.
                },
                "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
                    #
                    # Returns INVALID_ARGUMENT if this field is set
                    # but the summary is not SKIPPED.
                    #
                    # Optional
                  "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
                  "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
                  "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
                },
                "summary": "A String", # The simplest way to interpret a result.
                    #
                    # Required
                "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
                    #
                    # Returns INVALID_ARGUMENT if this field is set
                    # but the summary is not FAILURE.
                    #
                    # Optional
                  "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
                  "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
                      # This might be caused by trying to run a test on an unsupported platform.
                  "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
                  "failedRoboscript": True or False, # If the Roboscript failed to complete successfully, e.g., because a
                      # Roboscript action or assertion failed or a Roboscript action could not be
                      # matched during the entire crawl.
                  "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
                  "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
                      # start.
                },
                "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
                    #
                    # Returns INVALID_ARGUMENT if this field is set
                    # but the summary is not SUCCESS.
                    #
                    # Optional
                    # LINT.IfChange
                  "otherNativeCrash": True or False, # If a native process other than the app crashed.
                },
              },
              "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
                  # then this field allows the child to specify the values of the dimensions.
                  #
                  # The keys must exactly match the dimension_definition of the execution.
                  #
                  # For example, if the execution has
                  # `dimension_definition = ['attempt', 'device']`
                  # then a step must define values for those dimensions, eg.
                  # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
                  #
                  # If a step does not participate in one dimension of the matrix,
                  # the value for that dimension should be empty string.
                  # For example, if one of the tests is executed by a runner which
                  # does not support retries, the step could have
                  # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
                  #
                  # If the step does not participate in any dimensions of the matrix,
                  # it may leave dimension_value unset.
                  #
                  # A PRECONDITION_FAILED will be returned if any of the keys do not exist
                  # in the dimension_definition of the execution.
                  #
                  # A PRECONDITION_FAILED will be returned if another step in this execution
                  # already has the same name and dimension_value, but differs on other data
                  # fields, for example, step field is different.
                  #
                  # A PRECONDITION_FAILED will be returned if dimension_value is set, and
                  # there is a dimension_definition in the execution which is not specified
                  # as one of the keys.
                  #
                  # - In response: present if set by create
                  # - In create request: optional
                  # - In update request: never set
                {
                  "key": "A String",
                  "value": "A String",
                },
              ],
              "hasImages": True or False, # Whether any of the outputs of this step are images whose
                  # thumbnails can be fetched with ListThumbnails.
                  #
                  # - In response: always set
                  # - In create/update request: never set
              "description": "A String", # A description of this tool
                  # For example: mvn clean package -D skipTests=true
                  #
                  # - In response: present if set by create/update request
                  # - In create/update request: optional
              "state": "A String", # The initial state is IN_PROGRESS.
                  # The only legal state transitions are
                  # * IN_PROGRESS -> COMPLETE
                  #
                  # A PRECONDITION_FAILED will be returned if an invalid transition is
                  # requested.
                  #
                  # It is valid to create Step with a state set to COMPLETE.
                  # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
                  # returned if the state is set to COMPLETE multiple times.
                  #
                  # - In response: always set
                  # - In create/update request: optional
            },
        ],
        "nextPageToken": "A String", # 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.
      }

`list_next(previous_request, previous_response)`

    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 'execute()' on to request the next
      page. Returns None if there are no more items in the collection.

`patch(projectId, historyId, executionId, stepId, body=None, requestId=None, x__xgafv=None)`

    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'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
        "runDuration": { #  # How long it took for this step to run.
            #
            # If unset, this is set to the difference between creation_time and
            # completion_time when the step is set to the COMPLETE state. In some cases,
            # it is appropriate to set this value separately: For instance, if a step is
            # created, but the operation it represents is queued for a few minutes before
            # it executes, it would be appropriate not to include the time spent queued
            # in its run_duration.
            #
            # PRECONDITION_FAILED will be returned if one attempts to set a
            # run_duration on a step which already has this field set.
            #
            # - In response: present if previously set; always present on COMPLETE step
            # - In create request: optional
            # - In update request: optional
            # A Duration represents a signed, fixed-length span of time represented
            # as a count of seconds and fractions of seconds at nanosecond
            # resolution. It is independent of any calendar and concepts like "day"
            # or "month". It is related to Timestamp in that the difference between
            # two Timestamp values is a Duration and it can be added or subtracted
            # from a Timestamp. Range is approximately +-10,000 years.
          "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
          "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
              # of time. Durations less than one second are represented with a 0
              # `seconds` field and a positive or negative `nanos` field. For durations
              # of one second or more, a non-zero value for the `nanos` field must be
              # of the same sign as the `seconds` field. Must be from -999,999,999
              # to +999,999,999 inclusive.
        },
        "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
            #
            # - In response: always set
            # - In create/update request: never set
            # calendar, encoded as a count of seconds and fractions of seconds at
            # nanosecond resolution. The count is relative to an epoch at UTC midnight on
            # January 1, 1970, in the proleptic Gregorian calendar which extends the
            # Gregorian calendar backwards to year one.
            #
            # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
            # second table is needed for interpretation, using a [24-hour linear
            # smear](https://developers.google.com/time/smear).
            #
            # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
            # restricting to that range, we ensure that we can convert to and from [RFC
            # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
          "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
              # second values with fractions must still have non-negative nanos values
              # that count forward in time. Must be from 0 to 999,999,999
              # inclusive.
          "seconds": "A String", # Represents seconds of UTC time since Unix epoch
              # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
              # 9999-12-31T23:59:59Z inclusive.
        },
        "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
            #
            # This value will be set automatically when state transitions to
            # COMPLETE.
            #
            # - In response: set if the execution state is COMPLETE.
            # - In create/update request: never set
            # calendar, encoded as a count of seconds and fractions of seconds at
            # nanosecond resolution. The count is relative to an epoch at UTC midnight on
            # January 1, 1970, in the proleptic Gregorian calendar which extends the
            # Gregorian calendar backwards to year one.
            #
            # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
            # second table is needed for interpretation, using a [24-hour linear
            # smear](https://developers.google.com/time/smear).
            #
            # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
            # restricting to that range, we ensure that we can convert to and from [RFC
            # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
          "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
              # second values with fractions must still have non-negative nanos values
              # that count forward in time. Must be from 0 to 999,999,999
              # inclusive.
          "seconds": "A String", # Represents seconds of UTC time since Unix epoch
              # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
              # 9999-12-31T23:59:59Z inclusive.
        },
        "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
            # These details can be used identify which group this step is part of.
            # It also identifies the groups 'primary step' which indexes all the group
            # members.
            #
            # - In response: present if previously set.
            # - In create request: optional, set iff this step was performed more than
            # once.
            # - In update request: optional
          "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
              # outcome of each individual step.
            "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
                # configuration as a group.
            "individualOutcome": [ # Step Id and outcome of each individual step.
              { # Step Id and outcome of each individual step that was run as a group with
                  # other steps with the same configuration.
                "runDuration": { #  # How long it took for this step to run.
                    # A Duration represents a signed, fixed-length span of time represented
                    # as a count of seconds and fractions of seconds at nanosecond
                    # resolution. It is independent of any calendar and concepts like "day"
                    # or "month". It is related to Timestamp in that the difference between
                    # two Timestamp values is a Duration and it can be added or subtracted
                    # from a Timestamp. Range is approximately +-10,000 years.
                  "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                      # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                      # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                  "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                      # of time. Durations less than one second are represented with a 0
                      # `seconds` field and a positive or negative `nanos` field. For durations
                      # of one second or more, a non-zero value for the `nanos` field must be
                      # of the same sign as the `seconds` field. Must be from -999,999,999
                      # to +999,999,999 inclusive.
                },
                "multistepNumber": 42, # Unique int given to each step.
                    # Ranges from 0(inclusive) to total number of steps(exclusive).
                    # The primary step is 0.
                "outcomeSummary": "A String",
                "stepId": "A String",
              },
            ],
          },
          "multistepNumber": 42, # Unique int given to each step.
              # Ranges from 0(inclusive) to total number of steps(exclusive).
              # The primary step is 0.
          "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
        },
        "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
            # step.
            #
            # Users are responsible for managing the key namespace such that keys
            # don't accidentally collide.
            #
            # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
            # if the length of any of the keys or values exceeds 100 characters.
            #
            # - In response: always set
            # - In create request: optional
            # - In update request: optional; any new key/value pair will be added to the
            #   map, and any new value for an existing key will update that key's value
          {
            "value": "A String",
            "key": "A String",
          },
        ],
        "name": "A String", # A short human-readable name to display in the UI.
            # Maximum of 100 characters.
            # For example: Clean build
            #
            # A PRECONDITION_FAILED will be returned upon creating a new step if it
            # shares its name and dimension_value with an existing step. If two steps
            # represent a similar action, but have different dimension values, they
            # should share the same name. For instance, if the same set of tests is
            # run on two different platforms, the two steps should have the same name.
            #
            # - In response: always set
            # - In create request: always set
            # - In update request: never set
        "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
            #
            # This is the device usage used for billing purpose, which is different from
            # the run_duration, for example, infrastructure failure won't be charged for
            # device usage.
            #
            # PRECONDITION_FAILED will be returned if one attempts to set a
            # device_usage on a step which already has this field set.
            #
            # - In response: present if previously set.
            # - In create request: optional
            # - In update request: optional
            # A Duration represents a signed, fixed-length span of time represented
            # as a count of seconds and fractions of seconds at nanosecond
            # resolution. It is independent of any calendar and concepts like "day"
            # or "month". It is related to Timestamp in that the difference between
            # two Timestamp values is a Duration and it can be added or subtracted
            # from a Timestamp. Range is approximately +-10,000 years.
          "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
              # to +315,576,000,000 inclusive. Note: these bounds are computed from:
              # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
          "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
              # of time. Durations less than one second are represented with a 0
              # `seconds` field and a positive or negative `nanos` field. For durations
              # of one second or more, a non-zero value for the `nanos` field must be
              # of the same sign as the `seconds` field. Must be from -999,999,999
              # to +999,999,999 inclusive.
        },
        "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
            # For example: running cp to copy artifacts from one location to another.
          "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
              # copying artifacts or deploying code.
            "toolLogs": [ # References to any plain text logs output the tool execution.
                #
                # This field can be set before the tool has exited in order to be able to
                # have access to a live view of the logs while the tool is running.
                #
                # The maximum allowed number of tool logs per step is 1000.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, any value provided will be appended to the
                #   existing list
              { # A reference to a file.
                "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                    #
                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                    # or in gsutil format: gs://mybucket/path/to/test.xml
                    # with version-specific info,
                    # gs://mybucket/path/to/test.xml#1360383693690000
                    #
                    # An INVALID_ARGUMENT error will be returned if the URI format is not
                    # supported.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            ],
            "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                # argv in a C program).
                #
                # - In response: present if set by create request
                # - In create request: optional
                # - In update request: never set
              "A String",
            ],
            "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                #
                # The maximum allowed number of tool outputs per step is 1000.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, any value provided will be appended to the
                #   existing list
              { # A reference to a ToolExecution output file.
                "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    #
                    # Test case references are canonically ordered lexicographically by these three
                    # factors:
                    # * First, by test_suite_name.
                    # * Second, by class_name.
                    # * Third, by name.
                  "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                  "className": "A String", # The name of the class.
                  "name": "A String", # The name of the test case.
                      #
                      # Required.
                },
                "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    # calendar, encoded as a count of seconds and fractions of seconds at
                    # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                    # January 1, 1970, in the proleptic Gregorian calendar which extends the
                    # Gregorian calendar backwards to year one.
                    #
                    # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                    # second table is needed for interpretation, using a [24-hour linear
                    # smear](https://developers.google.com/time/smear).
                    #
                    # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                    # restricting to that range, we ensure that we can convert to and from [RFC
                    # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                  "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                      # second values with fractions must still have non-negative nanos values
                      # that count forward in time. Must be from 0 to 999,999,999
                      # inclusive.
                  "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                      # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                      # 9999-12-31T23:59:59Z inclusive.
                },
                "output": { # A reference to a file. # A FileReference to an output file.
                    #
                    # - In response: always set
                    # - In create/update request: always set
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              },
            ],
            "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                # exited.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, a FAILED_PRECONDITION error will be
                #   returned if an exit_code is already set.
              "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                  # successful.
                  #
                  # - In response: always set
                  # - In create/update request: always set
            },
          },
        },
        "stepId": "A String", # A unique identifier within a Execution for this Step.
            #
            # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
            #
            # - In response: always set
            # - In create/update request: never set
        "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
            #
            # It accepts ant-junit xml files which will be parsed into structured test
            # results by the service. Xml file paths are updated in order to append more
            # files, however they can't be deleted.
            #
            # Users can also add test results manually by using the test_result field.
          "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
              #
              # The exit code of this tool will be used to determine if the test passed.
              #
              # - In response: always set
              # - In create/update request: optional
              # copying artifacts or deploying code.
            "toolLogs": [ # References to any plain text logs output the tool execution.
                #
                # This field can be set before the tool has exited in order to be able to
                # have access to a live view of the logs while the tool is running.
                #
                # The maximum allowed number of tool logs per step is 1000.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, any value provided will be appended to the
                #   existing list
              { # A reference to a file.
                "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                    #
                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                    # or in gsutil format: gs://mybucket/path/to/test.xml
                    # with version-specific info,
                    # gs://mybucket/path/to/test.xml#1360383693690000
                    #
                    # An INVALID_ARGUMENT error will be returned if the URI format is not
                    # supported.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            ],
            "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                # argv in a C program).
                #
                # - In response: present if set by create request
                # - In create request: optional
                # - In update request: never set
              "A String",
            ],
            "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                #
                # The maximum allowed number of tool outputs per step is 1000.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, any value provided will be appended to the
                #   existing list
              { # A reference to a ToolExecution output file.
                "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    #
                    # Test case references are canonically ordered lexicographically by these three
                    # factors:
                    # * First, by test_suite_name.
                    # * Second, by class_name.
                    # * Third, by name.
                  "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                  "className": "A String", # The name of the class.
                  "name": "A String", # The name of the test case.
                      #
                      # Required.
                },
                "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                    #
                    # - In response: present if set by create/update request
                    # - In create/update request: optional
                    # calendar, encoded as a count of seconds and fractions of seconds at
                    # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                    # January 1, 1970, in the proleptic Gregorian calendar which extends the
                    # Gregorian calendar backwards to year one.
                    #
                    # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                    # second table is needed for interpretation, using a [24-hour linear
                    # smear](https://developers.google.com/time/smear).
                    #
                    # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                    # restricting to that range, we ensure that we can convert to and from [RFC
                    # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                  "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                      # second values with fractions must still have non-negative nanos values
                      # that count forward in time. Must be from 0 to 999,999,999
                      # inclusive.
                  "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                      # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                      # 9999-12-31T23:59:59Z inclusive.
                },
                "output": { # A reference to a file. # A FileReference to an output file.
                    #
                    # - In response: always set
                    # - In create/update request: always set
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              },
            ],
            "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                # exited.
                #
                # - In response: present if set by create/update request
                # - In create request: optional
                # - In update request: optional, a FAILED_PRECONDITION error will be
                #   returned if an exit_code is already set.
              "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                  # successful.
                  #
                  # - In response: always set
                  # - In create/update request: always set
            },
          },
          "testIssues": [ # Issues observed during the test execution.
              #
              # For example, if the mobile app under test crashed during the test,
              # the error message and the stack trace content can be recorded here
              # to assist debugging.
              #
              # - In response: present if set by create or update
              # - In create/update request: optional
            { # An issue detected occurring during a test execution.
              "warning": { #  # Warning message with additional details of the issue.
                  # Should always be a message from com.google.devtools.toolresults.v1.warnings
                  # `Any` contains an arbitrary serialized protocol buffer message along with a
                  # URL that describes the type of the serialized message.
                  #
                  # Protobuf library provides support to pack/unpack Any values in the form
                  # of utility functions or additional generated methods of the Any type.
                  #
                  # Example 1: Pack and unpack a message in C++.
                  #
                  #     Foo foo = ...;
                  #     Any any;
                  #     any.PackFrom(foo);
                  #     ...
                  #     if (any.UnpackTo(&foo)) {
                  #       ...
                  #     }
                  #
                  # Example 2: Pack and unpack a message in Java.
                  #
                  #     Foo foo = ...;
                  #     Any any = Any.pack(foo);
                  #     ...
                  #     if (any.is(Foo.class)) {
                  #       foo = any.unpack(Foo.class);
                  #     }
                  #
                  #  Example 3: Pack and unpack a message in Python.
                  #
                  #     foo = Foo(...)
                  #     any = Any()
                  #     any.Pack(foo)
                  #     ...
                  #     if any.Is(Foo.DESCRIPTOR):
                  #       any.Unpack(foo)
                  #       ...
                  #
                  #  Example 4: Pack and unpack a message in Go
                  #
                  #      foo := &pb.Foo{...}
                  #      any, err := ptypes.MarshalAny(foo)
                  #      ...
                  #      foo := &pb.Foo{}
                  #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
                  #        ...
                  #      }
                  #
                  # The pack methods provided by protobuf library will by default use
                  # 'type.googleapis.com/full.type.name' as the type URL and the unpack
                  # methods only use the fully qualified type name after the last '/'
                  # in the type URL, for example "foo.bar.com/x/y.z" will yield type
                  # name "y.z".
                  #
                  #
                  # # JSON
                  #
                  # The JSON representation of an `Any` value uses the regular
                  # representation of the deserialized, embedded message, with an
                  # additional field `@type` which contains the type URL. Example:
                  #
                  #     package google.profile;
                  #     message Person {
                  #       string first_name = 1;
                  #       string last_name = 2;
                  #     }
                  #
                  #     {
                  #       "@type": "type.googleapis.com/google.profile.Person",
                  #       "firstName": <string>,
                  #       "lastName": <string>
                  #     }
                  #
                  # If the embedded message type is well-known and has a custom JSON
                  # representation, that representation will be embedded adding a field
                  # `value` which holds the custom JSON in addition to the `@type`
                  # field. Example (for message google.protobuf.Duration):
                  #
                  #     {
                  #       "@type": "type.googleapis.com/google.protobuf.Duration",
                  #       "value": "1.212s"
                  #     }
                "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
                "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
                    # protocol buffer message. This string must contain at least
                    # one "/" character. The last segment of the URL's path must represent
                    # the fully qualified name of the type (as in
                    # `path/google.protobuf.Duration`). The name should be in a canonical form
                    # (e.g., leading "." is not accepted).
                    #
                    # In practice, teams usually precompile into the binary all types that they
                    # expect it to use in the context of Any. However, for URLs which use the
                    # scheme `http`, `https`, or no scheme, one can optionally set up a type
                    # server that maps type URLs to message definitions as follows:
                    #
                    # * If no scheme is provided, `https` is assumed.
                    # * An HTTP GET on the URL must yield a google.protobuf.Type
                    #   value in binary format, or produce an error.
                    # * Applications are allowed to cache lookup results based on the
                    #   URL, or have them precompiled into a binary to avoid any
                    #   lookup. Therefore, binary compatibility needs to be preserved
                    #   on changes to types. (Use versioned type names to manage
                    #   breaking changes.)
                    #
                    # Note: this functionality is not currently available in the official
                    # protobuf release, and it is not used for type URLs beginning with
                    # type.googleapis.com.
                    #
                    # Schemes other than `http`, `https` (or the empty scheme) might be
                    # used with implementation specific semantics.
              },
              "type": "A String", # Type of issue.
                  # Required.
              "category": "A String", # Category of issue.
                  # Required.
              "severity": "A String", # Severity of issue.
                  # Required.
              "errorMessage": "A String", # A brief human-readable message describing the issue.
                  # Required.
              "stackTrace": { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
                "exception": "A String", # The stack trace message.
                    #
                    # Required
              },
            },
          ],
          "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
              # log by server, or uploaded directly by user. This references should only be
              # called when test suites are fully parsed or uploaded.
              #
              # The maximum allowed number of test suite overviews per step is 1000.
              #
              # - In response: always set
              # - In create request: optional
              # - In update request: never (use publishXunitXmlFiles custom method instead)
            { # A summary of a test suite result either parsed from XML or uploaded
                # directly by a user.
                #
                # Note: the API related comments are for StepService only. This message is
                # also being used in ExecutionService in a read only mode for the corresponding
                # step.
              "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
                  # XML file is stored.
                  #
                  # Note: Multiple test suites can share the same xml_source
                  #
                  # Returns INVALID_ARGUMENT if the uri format is not supported.
                  #
                  # - In create/response: optional
                  # - In update request: never
                "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                    #
                    # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                    # or in gsutil format: gs://mybucket/path/to/test.xml
                    # with version-specific info,
                    # gs://mybucket/path/to/test.xml#1360383693690000
                    #
                    # An INVALID_ARGUMENT error will be returned if the URI format is not
                    # supported.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
              "elapsedTime": { #  # Elapsed time of test suite.
                  # A Duration represents a signed, fixed-length span of time represented
                  # as a count of seconds and fractions of seconds at nanosecond
                  # resolution. It is independent of any calendar and concepts like "day"
                  # or "month". It is related to Timestamp in that the difference between
                  # two Timestamp values is a Duration and it can be added or subtracted
                  # from a Timestamp. Range is approximately +-10,000 years.
                "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                    # of time. Durations less than one second are represented with a 0
                    # `seconds` field and a positive or negative `nanos` field. For durations
                    # of one second or more, a non-zero value for the `nanos` field must be
                    # of the same sign as the `seconds` field. Must be from -999,999,999
                    # to +999,999,999 inclusive.
              },
              "name": "A String", # The name of the test suite.
                  #
                  # - In create/response: always set
                  # - In update request: never
              "totalCount": 42, # Number of test cases, typically set by the service by parsing the
                  # xml_source.
                  #
                  # - In create/response: always set
                  # - In update request: never
              "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
                  # xml_source.
                  #
                  # - In create/response: always set
                  # - In update request: never
              "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
                  # attempts.
                  #
                  # Present only for rollup test suite overview at environment level. A step
                  # cannot have flaky test cases.
              "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
                  # xml_source.
                  #
                  # - In create/response: always set
                  # - In update request: never
              "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
                  # xml_source. May also be set by the user.
                  #
                  # - In create/response: always set
                  # - In update request: never
            },
          ],
          "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
              #
              # - In response: present if set by create or update
              # - In create/update request: optional
            "testProcessDuration": { #  # How long it took to run the test process.
                #
                # - In response: present if previously set.
                # - In create/update request: optional
                # A Duration represents a signed, fixed-length span of time represented
                # as a count of seconds and fractions of seconds at nanosecond
                # resolution. It is independent of any calendar and concepts like "day"
                # or "month". It is related to Timestamp in that the difference between
                # two Timestamp values is a Duration and it can be added or subtracted
                # from a Timestamp. Range is approximately +-10,000 years.
              "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                  # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                  # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
              "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                  # of time. Durations less than one second are represented with a 0
                  # `seconds` field and a positive or negative `nanos` field. For durations
                  # of one second or more, a non-zero value for the `nanos` field must be
                  # of the same sign as the `seconds` field. Must be from -999,999,999
                  # to +999,999,999 inclusive.
            },
          },
        },
        "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
            #
            # - In response: present if set by create/update request
            # - In create/update request: optional
          "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
              #
              # Returns INVALID_ARGUMENT if this field is set
              # but the summary is not INCONCLUSIVE.
              #
              # Optional
            "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
                # infrastructure failures
            "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
                # depends on a component other than the system under test which failed.
                #
                # For example, a mobile test requires provisioning a device where the test
                # executes, and that provisioning can fail.
            "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
                # determined.
                # For example, the user pressed ctrl-c which sent a kill signal to the test
                # runner while the test was running.
          },
          "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
              #
              # Returns INVALID_ARGUMENT if this field is set
              # but the summary is not SKIPPED.
              #
              # Optional
            "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
            "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
            "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
          },
          "summary": "A String", # The simplest way to interpret a result.
              #
              # Required
          "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
              #
              # Returns INVALID_ARGUMENT if this field is set
              # but the summary is not FAILURE.
              #
              # Optional
            "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
            "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
                # This might be caused by trying to run a test on an unsupported platform.
            "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
            "failedRoboscript": True or False, # If the Roboscript failed to complete successfully, e.g., because a
                # Roboscript action or assertion failed or a Roboscript action could not be
                # matched during the entire crawl.
            "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
            "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
                # start.
          },
          "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
              #
              # Returns INVALID_ARGUMENT if this field is set
              # but the summary is not SUCCESS.
              #
              # Optional
              # LINT.IfChange
            "otherNativeCrash": True or False, # If a native process other than the app crashed.
          },
        },
        "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
            # then this field allows the child to specify the values of the dimensions.
            #
            # The keys must exactly match the dimension_definition of the execution.
            #
            # For example, if the execution has
            # `dimension_definition = ['attempt', 'device']`
            # then a step must define values for those dimensions, eg.
            # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
            #
            # If a step does not participate in one dimension of the matrix,
            # the value for that dimension should be empty string.
            # For example, if one of the tests is executed by a runner which
            # does not support retries, the step could have
            # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
            #
            # If the step does not participate in any dimensions of the matrix,
            # it may leave dimension_value unset.
            #
            # A PRECONDITION_FAILED will be returned if any of the keys do not exist
            # in the dimension_definition of the execution.
            #
            # A PRECONDITION_FAILED will be returned if another step in this execution
            # already has the same name and dimension_value, but differs on other data
            # fields, for example, step field is different.
            #
            # A PRECONDITION_FAILED will be returned if dimension_value is set, and
            # there is a dimension_definition in the execution which is not specified
            # as one of the keys.
            #
            # - In response: present if set by create
            # - In create request: optional
            # - In update request: never set
          {
            "key": "A String",
            "value": "A String",
          },
        ],
        "hasImages": True or False, # Whether any of the outputs of this step are images whose
            # thumbnails can be fetched with ListThumbnails.
            #
            # - In response: always set
            # - In create/update request: never set
        "description": "A String", # A description of this tool
            # For example: mvn clean package -D skipTests=true
            #
            # - In response: present if set by create/update request
            # - In create/update request: optional
        "state": "A String", # The initial state is IN_PROGRESS.
            # The only legal state transitions are
            # * IN_PROGRESS -> COMPLETE
            #
            # A PRECONDITION_FAILED will be returned if an invalid transition is
            # requested.
            #
            # It is valid to create Step with a state set to COMPLETE.
            # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
            # returned if the state is set to COMPLETE multiple times.
            #
            # - In response: always set
            # - In create/update request: optional
      }

      requestId: string, A unique request ID for server to detect duplicated requests.
    For example, a UUID.

    Optional, but strongly recommended.
      x__xgafv: string, V1 error format.
        Allowed values
          1 - v1 error format
          2 - v2 error format

    Returns:
      An object of the form:

        { # A Step represents a single operation performed as part of
            # Execution. A step can be used to represent the execution of a tool (
            # for example a test runner execution or an execution of a compiler).
            #
            # Steps can overlap (for instance two steps might have the same
            # start time if some operations are done in parallel).
            #
            # Here is an example, let's consider that we have a continuous build is
            # executing a test runner for each iteration. The workflow would look like:
            # - user creates a Execution with id 1
            # - 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
          "runDuration": { #  # How long it took for this step to run.
              #
              # If unset, this is set to the difference between creation_time and
              # completion_time when the step is set to the COMPLETE state. In some cases,
              # it is appropriate to set this value separately: For instance, if a step is
              # created, but the operation it represents is queued for a few minutes before
              # it executes, it would be appropriate not to include the time spent queued
              # in its run_duration.
              #
              # PRECONDITION_FAILED will be returned if one attempts to set a
              # run_duration on a step which already has this field set.
              #
              # - In response: present if previously set; always present on COMPLETE step
              # - In create request: optional
              # - In update request: optional
              # A Duration represents a signed, fixed-length span of time represented
              # as a count of seconds and fractions of seconds at nanosecond
              # resolution. It is independent of any calendar and concepts like "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
              #
              # - In response: always set
              # - In create/update request: never set
              # calendar, encoded as a count of seconds and fractions of seconds at
              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
              # January 1, 1970, in the proleptic Gregorian calendar which extends the
              # Gregorian calendar backwards to year one.
              #
              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
              # second table is needed for interpretation, using a [24-hour linear
              # smear](https://developers.google.com/time/smear).
              #
              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
              # restricting to that range, we ensure that we can convert to and from [RFC
              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                # second values with fractions must still have non-negative nanos values
                # that count forward in time. Must be from 0 to 999,999,999
                # inclusive.
            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                # 9999-12-31T23:59:59Z inclusive.
          },
          "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
              #
              # This value will be set automatically when state transitions to
              # COMPLETE.
              #
              # - In response: set if the execution state is COMPLETE.
              # - In create/update request: never set
              # calendar, encoded as a count of seconds and fractions of seconds at
              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
              # January 1, 1970, in the proleptic Gregorian calendar which extends the
              # Gregorian calendar backwards to year one.
              #
              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
              # second table is needed for interpretation, using a [24-hour linear
              # smear](https://developers.google.com/time/smear).
              #
              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
              # restricting to that range, we ensure that we can convert to and from [RFC
              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                # second values with fractions must still have non-negative nanos values
                # that count forward in time. Must be from 0 to 999,999,999
                # inclusive.
            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                # 9999-12-31T23:59:59Z inclusive.
          },
          "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
              # These details can be used identify which group this step is part of.
              # It also identifies the groups 'primary step' which indexes all the group
              # members.
              #
              # - In response: present if previously set.
              # - In create request: optional, set iff this step was performed more than
              # once.
              # - In update request: optional
            "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
                # outcome of each individual step.
              "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
                  # configuration as a group.
              "individualOutcome": [ # Step Id and outcome of each individual step.
                { # Step Id and outcome of each individual step that was run as a group with
                    # other steps with the same configuration.
                  "runDuration": { #  # How long it took for this step to run.
                      # A Duration represents a signed, fixed-length span of time represented
                      # as a count of seconds and fractions of seconds at nanosecond
                      # resolution. It is independent of any calendar and concepts like "day"
                      # or "month". It is related to Timestamp in that the difference between
                      # two Timestamp values is a Duration and it can be added or subtracted
                      # from a Timestamp. Range is approximately +-10,000 years.
                    "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                    "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                        # of time. Durations less than one second are represented with a 0
                        # `seconds` field and a positive or negative `nanos` field. For durations
                        # of one second or more, a non-zero value for the `nanos` field must be
                        # of the same sign as the `seconds` field. Must be from -999,999,999
                        # to +999,999,999 inclusive.
                  },
                  "multistepNumber": 42, # Unique int given to each step.
                      # Ranges from 0(inclusive) to total number of steps(exclusive).
                      # The primary step is 0.
                  "outcomeSummary": "A String",
                  "stepId": "A String",
                },
              ],
            },
            "multistepNumber": 42, # Unique int given to each step.
                # Ranges from 0(inclusive) to total number of steps(exclusive).
                # The primary step is 0.
            "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
          },
          "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
              # step.
              #
              # Users are responsible for managing the key namespace such that keys
              # don't accidentally collide.
              #
              # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
              # if the length of any of the keys or values exceeds 100 characters.
              #
              # - In response: always set
              # - In create request: optional
              # - In update request: optional; any new key/value pair will be added to the
              #   map, and any new value for an existing key will update that key's value
            {
              "value": "A String",
              "key": "A String",
            },
          ],
          "name": "A String", # A short human-readable name to display in the UI.
              # Maximum of 100 characters.
              # For example: Clean build
              #
              # A PRECONDITION_FAILED will be returned upon creating a new step if it
              # shares its name and dimension_value with an existing step. If two steps
              # represent a similar action, but have different dimension values, they
              # should share the same name. For instance, if the same set of tests is
              # run on two different platforms, the two steps should have the same name.
              #
              # - In response: always set
              # - In create request: always set
              # - In update request: never set
          "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
              #
              # This is the device usage used for billing purpose, which is different from
              # the run_duration, for example, infrastructure failure won't be charged for
              # device usage.
              #
              # PRECONDITION_FAILED will be returned if one attempts to set a
              # device_usage on a step which already has this field set.
              #
              # - In response: present if previously set.
              # - In create request: optional
              # - In update request: optional
              # A Duration represents a signed, fixed-length span of time represented
              # as a count of seconds and fractions of seconds at nanosecond
              # resolution. It is independent of any calendar and concepts like "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
              # For example: running cp to copy artifacts from one location to another.
            "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
                #
                # - In response: present if set by create/update request
                # - In create/update request: optional
                # copying artifacts or deploying code.
              "toolLogs": [ # References to any plain text logs output the tool execution.
                  #
                  # This field can be set before the tool has exited in order to be able to
                  # have access to a live view of the logs while the tool is running.
                  #
                  # The maximum allowed number of tool logs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a file.
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              ],
              "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                  # argv in a C program).
                  #
                  # - In response: present if set by create request
                  # - In create request: optional
                  # - In update request: never set
                "A String",
              ],
              "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                  #
                  # The maximum allowed number of tool outputs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a ToolExecution output file.
                  "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      #
                      # Test case references are canonically ordered lexicographically by these three
                      # factors:
                      # * First, by test_suite_name.
                      # * Second, by class_name.
                      # * Third, by name.
                    "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                    "className": "A String", # The name of the class.
                    "name": "A String", # The name of the test case.
                        #
                        # Required.
                  },
                  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      # calendar, encoded as a count of seconds and fractions of seconds at
                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
                      # Gregorian calendar backwards to year one.
                      #
                      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                      # second table is needed for interpretation, using a [24-hour linear
                      # smear](https://developers.google.com/time/smear).
                      #
                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                      # restricting to that range, we ensure that we can convert to and from [RFC
                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                        # second values with fractions must still have non-negative nanos values
                        # that count forward in time. Must be from 0 to 999,999,999
                        # inclusive.
                    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                        # 9999-12-31T23:59:59Z inclusive.
                  },
                  "output": { # A reference to a file. # A FileReference to an output file.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                    "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                        #
                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                        # or in gsutil format: gs://mybucket/path/to/test.xml
                        # with version-specific info,
                        # gs://mybucket/path/to/test.xml#1360383693690000
                        #
                        # An INVALID_ARGUMENT error will be returned if the URI format is not
                        # supported.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              ],
              "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                  # exited.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, a FAILED_PRECONDITION error will be
                  #   returned if an exit_code is already set.
                "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                    # successful.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            },
          },
          "stepId": "A String", # A unique identifier within a Execution for this Step.
              #
              # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
              #
              # - In response: always set
              # - In create/update request: never set
          "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
              #
              # It accepts ant-junit xml files which will be parsed into structured test
              # results by the service. Xml file paths are updated in order to append more
              # files, however they can't be deleted.
              #
              # Users can also add test results manually by using the test_result field.
            "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
                #
                # The exit code of this tool will be used to determine if the test passed.
                #
                # - In response: always set
                # - In create/update request: optional
                # copying artifacts or deploying code.
              "toolLogs": [ # References to any plain text logs output the tool execution.
                  #
                  # This field can be set before the tool has exited in order to be able to
                  # have access to a live view of the logs while the tool is running.
                  #
                  # The maximum allowed number of tool logs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a file.
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              ],
              "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                  # argv in a C program).
                  #
                  # - In response: present if set by create request
                  # - In create request: optional
                  # - In update request: never set
                "A String",
              ],
              "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                  #
                  # The maximum allowed number of tool outputs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a ToolExecution output file.
                  "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      #
                      # Test case references are canonically ordered lexicographically by these three
                      # factors:
                      # * First, by test_suite_name.
                      # * Second, by class_name.
                      # * Third, by name.
                    "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                    "className": "A String", # The name of the class.
                    "name": "A String", # The name of the test case.
                        #
                        # Required.
                  },
                  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      # calendar, encoded as a count of seconds and fractions of seconds at
                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
                      # Gregorian calendar backwards to year one.
                      #
                      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                      # second table is needed for interpretation, using a [24-hour linear
                      # smear](https://developers.google.com/time/smear).
                      #
                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                      # restricting to that range, we ensure that we can convert to and from [RFC
                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                        # second values with fractions must still have non-negative nanos values
                        # that count forward in time. Must be from 0 to 999,999,999
                        # inclusive.
                    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                        # 9999-12-31T23:59:59Z inclusive.
                  },
                  "output": { # A reference to a file. # A FileReference to an output file.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                    "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                        #
                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                        # or in gsutil format: gs://mybucket/path/to/test.xml
                        # with version-specific info,
                        # gs://mybucket/path/to/test.xml#1360383693690000
                        #
                        # An INVALID_ARGUMENT error will be returned if the URI format is not
                        # supported.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              ],
              "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                  # exited.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, a FAILED_PRECONDITION error will be
                  #   returned if an exit_code is already set.
                "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                    # successful.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            },
            "testIssues": [ # Issues observed during the test execution.
                #
                # For example, if the mobile app under test crashed during the test,
                # the error message and the stack trace content can be recorded here
                # to assist debugging.
                #
                # - In response: present if set by create or update
                # - In create/update request: optional
              { # An issue detected occurring during a test execution.
                "warning": { #  # Warning message with additional details of the issue.
                    # Should always be a message from com.google.devtools.toolresults.v1.warnings
                    # `Any` contains an arbitrary serialized protocol buffer message along with a
                    # URL that describes the type of the serialized message.
                    #
                    # Protobuf library provides support to pack/unpack Any values in the form
                    # of utility functions or additional generated methods of the Any type.
                    #
                    # Example 1: Pack and unpack a message in C++.
                    #
                    #     Foo foo = ...;
                    #     Any any;
                    #     any.PackFrom(foo);
                    #     ...
                    #     if (any.UnpackTo(&foo)) {
                    #       ...
                    #     }
                    #
                    # Example 2: Pack and unpack a message in Java.
                    #
                    #     Foo foo = ...;
                    #     Any any = Any.pack(foo);
                    #     ...
                    #     if (any.is(Foo.class)) {
                    #       foo = any.unpack(Foo.class);
                    #     }
                    #
                    #  Example 3: Pack and unpack a message in Python.
                    #
                    #     foo = Foo(...)
                    #     any = Any()
                    #     any.Pack(foo)
                    #     ...
                    #     if any.Is(Foo.DESCRIPTOR):
                    #       any.Unpack(foo)
                    #       ...
                    #
                    #  Example 4: Pack and unpack a message in Go
                    #
                    #      foo := &pb.Foo{...}
                    #      any, err := ptypes.MarshalAny(foo)
                    #      ...
                    #      foo := &pb.Foo{}
                    #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
                    #        ...
                    #      }
                    #
                    # The pack methods provided by protobuf library will by default use
                    # 'type.googleapis.com/full.type.name' as the type URL and the unpack
                    # methods only use the fully qualified type name after the last '/'
                    # in the type URL, for example "foo.bar.com/x/y.z" will yield type
                    # name "y.z".
                    #
                    #
                    # # JSON
                    #
                    # The JSON representation of an `Any` value uses the regular
                    # representation of the deserialized, embedded message, with an
                    # additional field `@type` which contains the type URL. Example:
                    #
                    #     package google.profile;
                    #     message Person {
                    #       string first_name = 1;
                    #       string last_name = 2;
                    #     }
                    #
                    #     {
                    #       "@type": "type.googleapis.com/google.profile.Person",
                    #       "firstName": <string>,
                    #       "lastName": <string>
                    #     }
                    #
                    # If the embedded message type is well-known and has a custom JSON
                    # representation, that representation will be embedded adding a field
                    # `value` which holds the custom JSON in addition to the `@type`
                    # field. Example (for message google.protobuf.Duration):
                    #
                    #     {
                    #       "@type": "type.googleapis.com/google.protobuf.Duration",
                    #       "value": "1.212s"
                    #     }
                  "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
                  "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
                      # protocol buffer message. This string must contain at least
                      # one "/" character. The last segment of the URL's path must represent
                      # the fully qualified name of the type (as in
                      # `path/google.protobuf.Duration`). The name should be in a canonical form
                      # (e.g., leading "." is not accepted).
                      #
                      # In practice, teams usually precompile into the binary all types that they
                      # expect it to use in the context of Any. However, for URLs which use the
                      # scheme `http`, `https`, or no scheme, one can optionally set up a type
                      # server that maps type URLs to message definitions as follows:
                      #
                      # * If no scheme is provided, `https` is assumed.
                      # * An HTTP GET on the URL must yield a google.protobuf.Type
                      #   value in binary format, or produce an error.
                      # * Applications are allowed to cache lookup results based on the
                      #   URL, or have them precompiled into a binary to avoid any
                      #   lookup. Therefore, binary compatibility needs to be preserved
                      #   on changes to types. (Use versioned type names to manage
                      #   breaking changes.)
                      #
                      # Note: this functionality is not currently available in the official
                      # protobuf release, and it is not used for type URLs beginning with
                      # type.googleapis.com.
                      #
                      # Schemes other than `http`, `https` (or the empty scheme) might be
                      # used with implementation specific semantics.
                },
                "type": "A String", # Type of issue.
                    # Required.
                "category": "A String", # Category of issue.
                    # Required.
                "severity": "A String", # Severity of issue.
                    # Required.
                "errorMessage": "A String", # A brief human-readable message describing the issue.
                    # Required.
                "stackTrace": { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
                  "exception": "A String", # The stack trace message.
                      #
                      # Required
                },
              },
            ],
            "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
                # log by server, or uploaded directly by user. This references should only be
                # called when test suites are fully parsed or uploaded.
                #
                # The maximum allowed number of test suite overviews per step is 1000.
                #
                # - In response: always set
                # - In create request: optional
                # - In update request: never (use publishXunitXmlFiles custom method instead)
              { # A summary of a test suite result either parsed from XML or uploaded
                  # directly by a user.
                  #
                  # Note: the API related comments are for StepService only. This message is
                  # also being used in ExecutionService in a read only mode for the corresponding
                  # step.
                "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
                    # XML file is stored.
                    #
                    # Note: Multiple test suites can share the same xml_source
                    #
                    # Returns INVALID_ARGUMENT if the uri format is not supported.
                    #
                    # - In create/response: optional
                    # - In update request: never
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
                "elapsedTime": { #  # Elapsed time of test suite.
                    # A Duration represents a signed, fixed-length span of time represented
                    # as a count of seconds and fractions of seconds at nanosecond
                    # resolution. It is independent of any calendar and concepts like "day"
                    # or "month". It is related to Timestamp in that the difference between
                    # two Timestamp values is a Duration and it can be added or subtracted
                    # from a Timestamp. Range is approximately +-10,000 years.
                  "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                      # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                      # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                  "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                      # of time. Durations less than one second are represented with a 0
                      # `seconds` field and a positive or negative `nanos` field. For durations
                      # of one second or more, a non-zero value for the `nanos` field must be
                      # of the same sign as the `seconds` field. Must be from -999,999,999
                      # to +999,999,999 inclusive.
                },
                "name": "A String", # The name of the test suite.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "totalCount": 42, # Number of test cases, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
                    # attempts.
                    #
                    # Present only for rollup test suite overview at environment level. A step
                    # cannot have flaky test cases.
                "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
                    # xml_source. May also be set by the user.
                    #
                    # - In create/response: always set
                    # - In update request: never
              },
            ],
            "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
                #
                # - In response: present if set by create or update
                # - In create/update request: optional
              "testProcessDuration": { #  # How long it took to run the test process.
                  #
                  # - In response: present if previously set.
                  # - In create/update request: optional
                  # A Duration represents a signed, fixed-length span of time represented
                  # as a count of seconds and fractions of seconds at nanosecond
                  # resolution. It is independent of any calendar and concepts like "day"
                  # or "month". It is related to Timestamp in that the difference between
                  # two Timestamp values is a Duration and it can be added or subtracted
                  # from a Timestamp. Range is approximately +-10,000 years.
                "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                    # of time. Durations less than one second are represented with a 0
                    # `seconds` field and a positive or negative `nanos` field. For durations
                    # of one second or more, a non-zero value for the `nanos` field must be
                    # of the same sign as the `seconds` field. Must be from -999,999,999
                    # to +999,999,999 inclusive.
              },
            },
          },
          "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
            "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not INCONCLUSIVE.
                #
                # Optional
              "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
                  # infrastructure failures
              "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
                  # depends on a component other than the system under test which failed.
                  #
                  # For example, a mobile test requires provisioning a device where the test
                  # executes, and that provisioning can fail.
              "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
                  # determined.
                  # For example, the user pressed ctrl-c which sent a kill signal to the test
                  # runner while the test was running.
            },
            "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not SKIPPED.
                #
                # Optional
              "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
              "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
              "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
            },
            "summary": "A String", # The simplest way to interpret a result.
                #
                # Required
            "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not FAILURE.
                #
                # Optional
              "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
              "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
                  # This might be caused by trying to run a test on an unsupported platform.
              "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
              "failedRoboscript": True or False, # If the Roboscript failed to complete successfully, e.g., because a
                  # Roboscript action or assertion failed or a Roboscript action could not be
                  # matched during the entire crawl.
              "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
              "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
                  # start.
            },
            "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not SUCCESS.
                #
                # Optional
                # LINT.IfChange
              "otherNativeCrash": True or False, # If a native process other than the app crashed.
            },
          },
          "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
              # then this field allows the child to specify the values of the dimensions.
              #
              # The keys must exactly match the dimension_definition of the execution.
              #
              # For example, if the execution has
              # `dimension_definition = ['attempt', 'device']`
              # then a step must define values for those dimensions, eg.
              # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
              #
              # If a step does not participate in one dimension of the matrix,
              # the value for that dimension should be empty string.
              # For example, if one of the tests is executed by a runner which
              # does not support retries, the step could have
              # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
              #
              # If the step does not participate in any dimensions of the matrix,
              # it may leave dimension_value unset.
              #
              # A PRECONDITION_FAILED will be returned if any of the keys do not exist
              # in the dimension_definition of the execution.
              #
              # A PRECONDITION_FAILED will be returned if another step in this execution
              # already has the same name and dimension_value, but differs on other data
              # fields, for example, step field is different.
              #
              # A PRECONDITION_FAILED will be returned if dimension_value is set, and
              # there is a dimension_definition in the execution which is not specified
              # as one of the keys.
              #
              # - In response: present if set by create
              # - In create request: optional
              # - In update request: never set
            {
              "key": "A String",
              "value": "A String",
            },
          ],
          "hasImages": True or False, # Whether any of the outputs of this step are images whose
              # thumbnails can be fetched with ListThumbnails.
              #
              # - In response: always set
              # - In create/update request: never set
          "description": "A String", # A description of this tool
              # For example: mvn clean package -D skipTests=true
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
          "state": "A String", # The initial state is IN_PROGRESS.
              # The only legal state transitions are
              # * IN_PROGRESS -> COMPLETE
              #
              # A PRECONDITION_FAILED will be returned if an invalid transition is
              # requested.
              #
              # It is valid to create Step with a state set to COMPLETE.
              # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
              # returned if the state is set to COMPLETE multiple times.
              #
              # - In response: always set
              # - In create/update request: optional
        }

`publishXunitXmlFiles(projectId, historyId, executionId, stepId, body=None, x__xgafv=None)`

    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.
        "xunitXmlFiles": [ # 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.
            "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                #
                # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                # or in gsutil format: gs://mybucket/path/to/test.xml
                # with version-specific info,
                # gs://mybucket/path/to/test.xml#1360383693690000
                #
                # An INVALID_ARGUMENT error will be returned if the URI format is not
                # supported.
                #
                # - In response: always set
                # - In create/update request: always set
          },
        ],
      }

      x__xgafv: string, V1 error format.
        Allowed values
          1 - v1 error format
          2 - v2 error format

    Returns:
      An object of the form:

        { # A Step represents a single operation performed as part of
            # Execution. A step can be used to represent the execution of a tool (
            # for example a test runner execution or an execution of a compiler).
            #
            # Steps can overlap (for instance two steps might have the same
            # start time if some operations are done in parallel).
            #
            # Here is an example, let's consider that we have a continuous build is
            # executing a test runner for each iteration. The workflow would look like:
            # - user creates a Execution with id 1
            # - 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
          "runDuration": { #  # How long it took for this step to run.
              #
              # If unset, this is set to the difference between creation_time and
              # completion_time when the step is set to the COMPLETE state. In some cases,
              # it is appropriate to set this value separately: For instance, if a step is
              # created, but the operation it represents is queued for a few minutes before
              # it executes, it would be appropriate not to include the time spent queued
              # in its run_duration.
              #
              # PRECONDITION_FAILED will be returned if one attempts to set a
              # run_duration on a step which already has this field set.
              #
              # - In response: present if previously set; always present on COMPLETE step
              # - In create request: optional
              # - In update request: optional
              # A Duration represents a signed, fixed-length span of time represented
              # as a count of seconds and fractions of seconds at nanosecond
              # resolution. It is independent of any calendar and concepts like "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step was created.
              #
              # - In response: always set
              # - In create/update request: never set
              # calendar, encoded as a count of seconds and fractions of seconds at
              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
              # January 1, 1970, in the proleptic Gregorian calendar which extends the
              # Gregorian calendar backwards to year one.
              #
              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
              # second table is needed for interpretation, using a [24-hour linear
              # smear](https://developers.google.com/time/smear).
              #
              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
              # restricting to that range, we ensure that we can convert to and from [RFC
              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                # second values with fractions must still have non-negative nanos values
                # that count forward in time. Must be from 0 to 999,999,999
                # inclusive.
            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                # 9999-12-31T23:59:59Z inclusive.
          },
          "completionTime": { # A Timestamp represents a point in time independent of any time zone or local # The time when the step status was set to complete.
              #
              # This value will be set automatically when state transitions to
              # COMPLETE.
              #
              # - In response: set if the execution state is COMPLETE.
              # - In create/update request: never set
              # calendar, encoded as a count of seconds and fractions of seconds at
              # nanosecond resolution. The count is relative to an epoch at UTC midnight on
              # January 1, 1970, in the proleptic Gregorian calendar which extends the
              # Gregorian calendar backwards to year one.
              #
              # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
              # second table is needed for interpretation, using a [24-hour linear
              # smear](https://developers.google.com/time/smear).
              #
              # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
              # restricting to that range, we ensure that we can convert to and from [RFC
              # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
            "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                # second values with fractions must still have non-negative nanos values
                # that count forward in time. Must be from 0 to 999,999,999
                # inclusive.
            "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                # 9999-12-31T23:59:59Z inclusive.
          },
          "multiStep": { # Details when multiple steps are run with the same configuration as a group. # Details when multiple steps are run with the same configuration as a group.
              # These details can be used identify which group this step is part of.
              # It also identifies the groups 'primary step' which indexes all the group
              # members.
              #
              # - In response: present if previously set.
              # - In create request: optional, set iff this step was performed more than
              # once.
              # - In update request: optional
            "primaryStep": { # Stores rollup test status of multiple steps that were run as a group and # Present if it is a primary (original) step.
                # outcome of each individual step.
              "rollUp": "A String", # Rollup test status of multiple steps that were run with the same
                  # configuration as a group.
              "individualOutcome": [ # Step Id and outcome of each individual step.
                { # Step Id and outcome of each individual step that was run as a group with
                    # other steps with the same configuration.
                  "runDuration": { #  # How long it took for this step to run.
                      # A Duration represents a signed, fixed-length span of time represented
                      # as a count of seconds and fractions of seconds at nanosecond
                      # resolution. It is independent of any calendar and concepts like "day"
                      # or "month". It is related to Timestamp in that the difference between
                      # two Timestamp values is a Duration and it can be added or subtracted
                      # from a Timestamp. Range is approximately +-10,000 years.
                    "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                        # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                        # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                    "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                        # of time. Durations less than one second are represented with a 0
                        # `seconds` field and a positive or negative `nanos` field. For durations
                        # of one second or more, a non-zero value for the `nanos` field must be
                        # of the same sign as the `seconds` field. Must be from -999,999,999
                        # to +999,999,999 inclusive.
                  },
                  "multistepNumber": 42, # Unique int given to each step.
                      # Ranges from 0(inclusive) to total number of steps(exclusive).
                      # The primary step is 0.
                  "outcomeSummary": "A String",
                  "stepId": "A String",
                },
              ],
            },
            "multistepNumber": 42, # Unique int given to each step.
                # Ranges from 0(inclusive) to total number of steps(exclusive).
                # The primary step is 0.
            "primaryStepId": "A String", # Step Id of the primary (original) step, which might be this step.
          },
          "labels": [ # Arbitrary user-supplied key/value pairs that are associated with the
              # step.
              #
              # Users are responsible for managing the key namespace such that keys
              # don't accidentally collide.
              #
              # An INVALID_ARGUMENT will be returned if the number of labels exceeds 100 or
              # if the length of any of the keys or values exceeds 100 characters.
              #
              # - In response: always set
              # - In create request: optional
              # - In update request: optional; any new key/value pair will be added to the
              #   map, and any new value for an existing key will update that key's value
            {
              "value": "A String",
              "key": "A String",
            },
          ],
          "name": "A String", # A short human-readable name to display in the UI.
              # Maximum of 100 characters.
              # For example: Clean build
              #
              # A PRECONDITION_FAILED will be returned upon creating a new step if it
              # shares its name and dimension_value with an existing step. If two steps
              # represent a similar action, but have different dimension values, they
              # should share the same name. For instance, if the same set of tests is
              # run on two different platforms, the two steps should have the same name.
              #
              # - In response: always set
              # - In create request: always set
              # - In update request: never set
          "deviceUsageDuration": { #  # How much the device resource is used to perform the test.
              #
              # This is the device usage used for billing purpose, which is different from
              # the run_duration, for example, infrastructure failure won't be charged for
              # device usage.
              #
              # PRECONDITION_FAILED will be returned if one attempts to set a
              # device_usage on a step which already has this field set.
              #
              # - In response: present if previously set.
              # - In create request: optional
              # - In update request: optional
              # A Duration represents a signed, fixed-length span of time represented
              # as a count of seconds and fractions of seconds at nanosecond
              # resolution. It is independent of any calendar and concepts like "day"
              # or "month". It is related to Timestamp in that the difference between
              # two Timestamp values is a Duration and it can be added or subtracted
              # from a Timestamp. Range is approximately +-10,000 years.
            "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
            "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                # of time. Durations less than one second are represented with a 0
                # `seconds` field and a positive or negative `nanos` field. For durations
                # of one second or more, a non-zero value for the `nanos` field must be
                # of the same sign as the `seconds` field. Must be from -999,999,999
                # to +999,999,999 inclusive.
          },
          "toolExecutionStep": { # Generic tool step to be used for binaries we do not explicitly support. # An execution of a tool (used for steps we don't explicitly support).
              # For example: running cp to copy artifacts from one location to another.
            "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # A Tool execution.
                #
                # - In response: present if set by create/update request
                # - In create/update request: optional
                # copying artifacts or deploying code.
              "toolLogs": [ # References to any plain text logs output the tool execution.
                  #
                  # This field can be set before the tool has exited in order to be able to
                  # have access to a live view of the logs while the tool is running.
                  #
                  # The maximum allowed number of tool logs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a file.
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              ],
              "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                  # argv in a C program).
                  #
                  # - In response: present if set by create request
                  # - In create request: optional
                  # - In update request: never set
                "A String",
              ],
              "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                  #
                  # The maximum allowed number of tool outputs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a ToolExecution output file.
                  "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      #
                      # Test case references are canonically ordered lexicographically by these three
                      # factors:
                      # * First, by test_suite_name.
                      # * Second, by class_name.
                      # * Third, by name.
                    "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                    "className": "A String", # The name of the class.
                    "name": "A String", # The name of the test case.
                        #
                        # Required.
                  },
                  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      # calendar, encoded as a count of seconds and fractions of seconds at
                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
                      # Gregorian calendar backwards to year one.
                      #
                      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                      # second table is needed for interpretation, using a [24-hour linear
                      # smear](https://developers.google.com/time/smear).
                      #
                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                      # restricting to that range, we ensure that we can convert to and from [RFC
                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                        # second values with fractions must still have non-negative nanos values
                        # that count forward in time. Must be from 0 to 999,999,999
                        # inclusive.
                    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                        # 9999-12-31T23:59:59Z inclusive.
                  },
                  "output": { # A reference to a file. # A FileReference to an output file.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                    "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                        #
                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                        # or in gsutil format: gs://mybucket/path/to/test.xml
                        # with version-specific info,
                        # gs://mybucket/path/to/test.xml#1360383693690000
                        #
                        # An INVALID_ARGUMENT error will be returned if the URI format is not
                        # supported.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              ],
              "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                  # exited.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, a FAILED_PRECONDITION error will be
                  #   returned if an exit_code is already set.
                "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                    # successful.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            },
          },
          "stepId": "A String", # A unique identifier within a Execution for this Step.
              #
              # Returns INVALID_ARGUMENT if this field is set or overwritten by the caller.
              #
              # - In response: always set
              # - In create/update request: never set
          "testExecutionStep": { # A step that represents running tests. # An execution of a test runner.
              #
              # It accepts ant-junit xml files which will be parsed into structured test
              # results by the service. Xml file paths are updated in order to append more
              # files, however they can't be deleted.
              #
              # Users can also add test results manually by using the test_result field.
            "toolExecution": { # An execution of an arbitrary tool. It could be a test runner or a tool # Represents the execution of the test runner.
                #
                # The exit code of this tool will be used to determine if the test passed.
                #
                # - In response: always set
                # - In create/update request: optional
                # copying artifacts or deploying code.
              "toolLogs": [ # References to any plain text logs output the tool execution.
                  #
                  # This field can be set before the tool has exited in order to be able to
                  # have access to a live view of the logs while the tool is running.
                  #
                  # The maximum allowed number of tool logs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a file.
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
              ],
              "commandLineArguments": [ # The full tokenized command line including the program name (equivalent to
                  # argv in a C program).
                  #
                  # - In response: present if set by create request
                  # - In create request: optional
                  # - In update request: never set
                "A String",
              ],
              "toolOutputs": [ # References to opaque files of any format output by the tool execution.
                  #
                  # The maximum allowed number of tool outputs per step is 1000.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, any value provided will be appended to the
                  #   existing list
                { # A reference to a ToolExecution output file.
                  "testCase": { # A reference to a test case. # The test case to which this output file belongs.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      #
                      # Test case references are canonically ordered lexicographically by these three
                      # factors:
                      # * First, by test_suite_name.
                      # * Second, by class_name.
                      # * Third, by name.
                    "testSuiteName": "A String", # The name of the test suite to which this test case belongs.
                    "className": "A String", # The name of the class.
                    "name": "A String", # The name of the test case.
                        #
                        # Required.
                  },
                  "creationTime": { # A Timestamp represents a point in time independent of any time zone or local # The creation time of the file.
                      #
                      # - In response: present if set by create/update request
                      # - In create/update request: optional
                      # calendar, encoded as a count of seconds and fractions of seconds at
                      # nanosecond resolution. The count is relative to an epoch at UTC midnight on
                      # January 1, 1970, in the proleptic Gregorian calendar which extends the
                      # Gregorian calendar backwards to year one.
                      #
                      # All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
                      # second table is needed for interpretation, using a [24-hour linear
                      # smear](https://developers.google.com/time/smear).
                      #
                      # The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
                      # restricting to that range, we ensure that we can convert to and from [RFC
                      # 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
                    "nanos": 42, # Non-negative fractions of a second at nanosecond resolution. Negative
                        # second values with fractions must still have non-negative nanos values
                        # that count forward in time. Must be from 0 to 999,999,999
                        # inclusive.
                    "seconds": "A String", # Represents seconds of UTC time since Unix epoch
                        # 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
                        # 9999-12-31T23:59:59Z inclusive.
                  },
                  "output": { # A reference to a file. # A FileReference to an output file.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                    "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                        #
                        # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                        # or in gsutil format: gs://mybucket/path/to/test.xml
                        # with version-specific info,
                        # gs://mybucket/path/to/test.xml#1360383693690000
                        #
                        # An INVALID_ARGUMENT error will be returned if the URI format is not
                        # supported.
                        #
                        # - In response: always set
                        # - In create/update request: always set
                  },
                },
              ],
              "exitCode": { # Exit code from a tool execution. # Tool execution exit code. This field will be set once the tool has
                  # exited.
                  #
                  # - In response: present if set by create/update request
                  # - In create request: optional
                  # - In update request: optional, a FAILED_PRECONDITION error will be
                  #   returned if an exit_code is already set.
                "number": 42, # Tool execution exit code. A value of 0 means that the execution was
                    # successful.
                    #
                    # - In response: always set
                    # - In create/update request: always set
              },
            },
            "testIssues": [ # Issues observed during the test execution.
                #
                # For example, if the mobile app under test crashed during the test,
                # the error message and the stack trace content can be recorded here
                # to assist debugging.
                #
                # - In response: present if set by create or update
                # - In create/update request: optional
              { # An issue detected occurring during a test execution.
                "warning": { #  # Warning message with additional details of the issue.
                    # Should always be a message from com.google.devtools.toolresults.v1.warnings
                    # `Any` contains an arbitrary serialized protocol buffer message along with a
                    # URL that describes the type of the serialized message.
                    #
                    # Protobuf library provides support to pack/unpack Any values in the form
                    # of utility functions or additional generated methods of the Any type.
                    #
                    # Example 1: Pack and unpack a message in C++.
                    #
                    #     Foo foo = ...;
                    #     Any any;
                    #     any.PackFrom(foo);
                    #     ...
                    #     if (any.UnpackTo(&foo)) {
                    #       ...
                    #     }
                    #
                    # Example 2: Pack and unpack a message in Java.
                    #
                    #     Foo foo = ...;
                    #     Any any = Any.pack(foo);
                    #     ...
                    #     if (any.is(Foo.class)) {
                    #       foo = any.unpack(Foo.class);
                    #     }
                    #
                    #  Example 3: Pack and unpack a message in Python.
                    #
                    #     foo = Foo(...)
                    #     any = Any()
                    #     any.Pack(foo)
                    #     ...
                    #     if any.Is(Foo.DESCRIPTOR):
                    #       any.Unpack(foo)
                    #       ...
                    #
                    #  Example 4: Pack and unpack a message in Go
                    #
                    #      foo := &pb.Foo{...}
                    #      any, err := ptypes.MarshalAny(foo)
                    #      ...
                    #      foo := &pb.Foo{}
                    #      if err := ptypes.UnmarshalAny(any, foo); err != nil {
                    #        ...
                    #      }
                    #
                    # The pack methods provided by protobuf library will by default use
                    # 'type.googleapis.com/full.type.name' as the type URL and the unpack
                    # methods only use the fully qualified type name after the last '/'
                    # in the type URL, for example "foo.bar.com/x/y.z" will yield type
                    # name "y.z".
                    #
                    #
                    # # JSON
                    #
                    # The JSON representation of an `Any` value uses the regular
                    # representation of the deserialized, embedded message, with an
                    # additional field `@type` which contains the type URL. Example:
                    #
                    #     package google.profile;
                    #     message Person {
                    #       string first_name = 1;
                    #       string last_name = 2;
                    #     }
                    #
                    #     {
                    #       "@type": "type.googleapis.com/google.profile.Person",
                    #       "firstName": <string>,
                    #       "lastName": <string>
                    #     }
                    #
                    # If the embedded message type is well-known and has a custom JSON
                    # representation, that representation will be embedded adding a field
                    # `value` which holds the custom JSON in addition to the `@type`
                    # field. Example (for message google.protobuf.Duration):
                    #
                    #     {
                    #       "@type": "type.googleapis.com/google.protobuf.Duration",
                    #       "value": "1.212s"
                    #     }
                  "value": "A String", # Must be a valid serialized protocol buffer of the above specified type.
                  "typeUrl": "A String", # A URL/resource name that uniquely identifies the type of the serialized
                      # protocol buffer message. This string must contain at least
                      # one "/" character. The last segment of the URL's path must represent
                      # the fully qualified name of the type (as in
                      # `path/google.protobuf.Duration`). The name should be in a canonical form
                      # (e.g., leading "." is not accepted).
                      #
                      # In practice, teams usually precompile into the binary all types that they
                      # expect it to use in the context of Any. However, for URLs which use the
                      # scheme `http`, `https`, or no scheme, one can optionally set up a type
                      # server that maps type URLs to message definitions as follows:
                      #
                      # * If no scheme is provided, `https` is assumed.
                      # * An HTTP GET on the URL must yield a google.protobuf.Type
                      #   value in binary format, or produce an error.
                      # * Applications are allowed to cache lookup results based on the
                      #   URL, or have them precompiled into a binary to avoid any
                      #   lookup. Therefore, binary compatibility needs to be preserved
                      #   on changes to types. (Use versioned type names to manage
                      #   breaking changes.)
                      #
                      # Note: this functionality is not currently available in the official
                      # protobuf release, and it is not used for type URLs beginning with
                      # type.googleapis.com.
                      #
                      # Schemes other than `http`, `https` (or the empty scheme) might be
                      # used with implementation specific semantics.
                },
                "type": "A String", # Type of issue.
                    # Required.
                "category": "A String", # Category of issue.
                    # Required.
                "severity": "A String", # Severity of issue.
                    # Required.
                "errorMessage": "A String", # A brief human-readable message describing the issue.
                    # Required.
                "stackTrace": { # A stacktrace. # Deprecated in favor of stack trace fields inside specific warnings.
                  "exception": "A String", # The stack trace message.
                      #
                      # Required
                },
              },
            ],
            "testSuiteOverviews": [ # List of test suite overview contents. This could be parsed from xUnit XML
                # log by server, or uploaded directly by user. This references should only be
                # called when test suites are fully parsed or uploaded.
                #
                # The maximum allowed number of test suite overviews per step is 1000.
                #
                # - In response: always set
                # - In create request: optional
                # - In update request: never (use publishXunitXmlFiles custom method instead)
              { # A summary of a test suite result either parsed from XML or uploaded
                  # directly by a user.
                  #
                  # Note: the API related comments are for StepService only. This message is
                  # also being used in ExecutionService in a read only mode for the corresponding
                  # step.
                "xmlSource": { # A reference to a file. # If this test suite was parsed from XML, this is the URI where the original
                    # XML file is stored.
                    #
                    # Note: Multiple test suites can share the same xml_source
                    #
                    # Returns INVALID_ARGUMENT if the uri format is not supported.
                    #
                    # - In create/response: optional
                    # - In update request: never
                  "fileUri": "A String", # The URI of a file stored in Google Cloud Storage.
                      #
                      # For example: http://storage.googleapis.com/mybucket/path/to/test.xml
                      # or in gsutil format: gs://mybucket/path/to/test.xml
                      # with version-specific info,
                      # gs://mybucket/path/to/test.xml#1360383693690000
                      #
                      # An INVALID_ARGUMENT error will be returned if the URI format is not
                      # supported.
                      #
                      # - In response: always set
                      # - In create/update request: always set
                },
                "elapsedTime": { #  # Elapsed time of test suite.
                    # A Duration represents a signed, fixed-length span of time represented
                    # as a count of seconds and fractions of seconds at nanosecond
                    # resolution. It is independent of any calendar and concepts like "day"
                    # or "month". It is related to Timestamp in that the difference between
                    # two Timestamp values is a Duration and it can be added or subtracted
                    # from a Timestamp. Range is approximately +-10,000 years.
                  "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                      # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                      # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                  "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                      # of time. Durations less than one second are represented with a 0
                      # `seconds` field and a positive or negative `nanos` field. For durations
                      # of one second or more, a non-zero value for the `nanos` field must be
                      # of the same sign as the `seconds` field. Must be from -999,999,999
                      # to +999,999,999 inclusive.
                },
                "name": "A String", # The name of the test suite.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "totalCount": 42, # Number of test cases, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "errorCount": 42, # Number of test cases in error, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "flakyCount": 42, # Number of flaky test cases, set by the service by rolling up flaky test
                    # attempts.
                    #
                    # Present only for rollup test suite overview at environment level. A step
                    # cannot have flaky test cases.
                "skippedCount": 42, # Number of test cases not run, typically set by the service by parsing the
                    # xml_source.
                    #
                    # - In create/response: always set
                    # - In update request: never
                "failureCount": 42, # Number of failed test cases, typically set by the service by parsing the
                    # xml_source. May also be set by the user.
                    #
                    # - In create/response: always set
                    # - In update request: never
              },
            ],
            "testTiming": { # Testing timing break down to know phases. # The timing break down of the test execution.
                #
                # - In response: present if set by create or update
                # - In create/update request: optional
              "testProcessDuration": { #  # How long it took to run the test process.
                  #
                  # - In response: present if previously set.
                  # - In create/update request: optional
                  # A Duration represents a signed, fixed-length span of time represented
                  # as a count of seconds and fractions of seconds at nanosecond
                  # resolution. It is independent of any calendar and concepts like "day"
                  # or "month". It is related to Timestamp in that the difference between
                  # two Timestamp values is a Duration and it can be added or subtracted
                  # from a Timestamp. Range is approximately +-10,000 years.
                "seconds": "A String", # Signed seconds of the span of time. Must be from -315,576,000,000
                    # to +315,576,000,000 inclusive. Note: these bounds are computed from:
                    # 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
                "nanos": 42, # Signed fractions of a second at nanosecond resolution of the span
                    # of time. Durations less than one second are represented with a 0
                    # `seconds` field and a positive or negative `nanos` field. For durations
                    # of one second or more, a non-zero value for the `nanos` field must be
                    # of the same sign as the `seconds` field. Must be from -999,999,999
                    # to +999,999,999 inclusive.
              },
            },
          },
          "outcome": { # Interprets a result so that humans and machines can act on it. # Classification of the result, for example into SUCCESS or FAILURE
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
            "inconclusiveDetail": { # Details for an outcome with an INCONCLUSIVE outcome summary. # More information about an INCONCLUSIVE outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not INCONCLUSIVE.
                #
                # Optional
              "hasErrorLogs": True or False, # If results are being provided to the user in certain cases of
                  # infrastructure failures
              "infrastructureFailure": True or False, # If the test runner could not determine success or failure because the test
                  # depends on a component other than the system under test which failed.
                  #
                  # For example, a mobile test requires provisioning a device where the test
                  # executes, and that provisioning can fail.
              "abortedByUser": True or False, # If the end user aborted the test execution before a pass or fail could be
                  # determined.
                  # For example, the user pressed ctrl-c which sent a kill signal to the test
                  # runner while the test was running.
            },
            "skippedDetail": { # Details for an outcome with a SKIPPED outcome summary. # More information about a SKIPPED outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not SKIPPED.
                #
                # Optional
              "incompatibleArchitecture": True or False, # If the App doesn't run on the specific architecture, for example, x86.
              "incompatibleDevice": True or False, # If the requested OS version doesn't run on the specific device model.
              "incompatibleAppVersion": True or False, # If the App doesn't support the specific API level.
            },
            "summary": "A String", # The simplest way to interpret a result.
                #
                # Required
            "failureDetail": { # Details for an outcome with a FAILURE outcome summary. # More information about a FAILURE outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not FAILURE.
                #
                # Optional
              "otherNativeCrash": True or False, # If a native process (including any other than the app) crashed.
              "notInstalled": True or False, # If an app is not installed and thus no test can be run with the app.
                  # This might be caused by trying to run a test on an unsupported platform.
              "timedOut": True or False, # If the test overran some time limit, and that is why it failed.
              "failedRoboscript": True or False, # If the Roboscript failed to complete successfully, e.g., because a
                  # Roboscript action or assertion failed or a Roboscript action could not be
                  # matched during the entire crawl.
              "crashed": True or False, # If the failure was severe because the system (app) under test crashed.
              "unableToCrawl": True or False, # If the robo was unable to crawl the app; perhaps because the app did not
                  # start.
            },
            "successDetail": { # Details for an outcome with a SUCCESS outcome summary. # More information about a SUCCESS outcome.
                #
                # Returns INVALID_ARGUMENT if this field is set
                # but the summary is not SUCCESS.
                #
                # Optional
                # LINT.IfChange
              "otherNativeCrash": True or False, # If a native process other than the app crashed.
            },
          },
          "dimensionValue": [ # If the execution containing this step has any dimension_definition set,
              # then this field allows the child to specify the values of the dimensions.
              #
              # The keys must exactly match the dimension_definition of the execution.
              #
              # For example, if the execution has
              # `dimension_definition = ['attempt', 'device']`
              # then a step must define values for those dimensions, eg.
              # `dimension_value = ['attempt': '1', 'device': 'Nexus 6']`
              #
              # If a step does not participate in one dimension of the matrix,
              # the value for that dimension should be empty string.
              # For example, if one of the tests is executed by a runner which
              # does not support retries, the step could have
              # `dimension_value = ['attempt': '', 'device': 'Nexus 6']`
              #
              # If the step does not participate in any dimensions of the matrix,
              # it may leave dimension_value unset.
              #
              # A PRECONDITION_FAILED will be returned if any of the keys do not exist
              # in the dimension_definition of the execution.
              #
              # A PRECONDITION_FAILED will be returned if another step in this execution
              # already has the same name and dimension_value, but differs on other data
              # fields, for example, step field is different.
              #
              # A PRECONDITION_FAILED will be returned if dimension_value is set, and
              # there is a dimension_definition in the execution which is not specified
              # as one of the keys.
              #
              # - In response: present if set by create
              # - In create request: optional
              # - In update request: never set
            {
              "key": "A String",
              "value": "A String",
            },
          ],
          "hasImages": True or False, # Whether any of the outputs of this step are images whose
              # thumbnails can be fetched with ListThumbnails.
              #
              # - In response: always set
              # - In create/update request: never set
          "description": "A String", # A description of this tool
              # For example: mvn clean package -D skipTests=true
              #
              # - In response: present if set by create/update request
              # - In create/update request: optional
          "state": "A String", # The initial state is IN_PROGRESS.
              # The only legal state transitions are
              # * IN_PROGRESS -> COMPLETE
              #
              # A PRECONDITION_FAILED will be returned if an invalid transition is
              # requested.
              #
              # It is valid to create Step with a state set to COMPLETE.
              # The state can only be set to COMPLETE once. A PRECONDITION_FAILED will be
              # returned if the state is set to COMPLETE multiple times.
              #
              # - In response: always set
              # - In create/update request: optional
        }