Flank: The repeated field 'google.devtools.testing.v1.TestTargetsForShard.test_targets' should have at least 1 values (found 0)

Created on 7 Apr 2020  路  4Comments  路  Source: Flank/flank

The latest snapshot of Flank fails to run due to a 400 error with CTL. Git bisect blames the change #621. Currently, I've tried to remove any test filtering (test-targets in the config) which also produced the same issue. Reproducing with additional apks requires backporting #667 for most revisions. Let me know if I can provide more information.

Flank args output:

AndroidArgs
    gcloud:
      results-bucket: <bucket_name>
      results-dir: null
      record-video: false
      timeout: 30m
      async: false
      results-history-name: null
      # Android gcloud
      app: output/app-dev-debug.apk
      test: output/app1-dev-debug-androidTest.apk
      auto-google-login: false
      use-orchestrator: true
      directories-to-pull:

      performance-metrics: false
      test-runner-class: null
      test-targets:
        - notAnnotation androidx.test.filters#Suppress, org.junit#Ignore
      device:
        - model: Nexus7
          version: 22
          locale: en
          orientation: portrait
      num-flaky-test-attempts: 0

    flank:
      max-test-shards: 50
      shard-time: 45
      num-test-runs: 1
      smart-flank-gcs-path: gs://<bucket_name>/test_results.xml
      smart-flank-disable-upload: true
      files-to-download:

      test-targets-always-run:

      disable-sharding: false
      project: <project-id>
      local-result-dir: results
      # Android Flank Yml
      keep-file-path: false
      additional-app-test-apks:
        - app: null
          test: output/app2-dev-debug-androidTest.apk
        ...
        - app: null
          test: output/app22-dev-debug-androidTest.apk

Error output:

2556 tests / 413 shards

Request failed, retrying 1x com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "The repeated field 'google.devtools.testing.v1.TestTargetsForShard.test_targets' should have at least 1 values (found 0)",
    "reason" : "badRequest"
  } ],
  "message" : "The repeated field 'google.devtools.testing.v1.TestTargetsForShard.test_targets' should have at least 1 values (found 0)",
  "status" : "INVALID_ARGUMENT"
}
...
java.io.IOException: Request failed
    at ftl.http.ExecuteWithRetryKt.executeWithRetry(ExecuteWithRetry.kt:20)
    at ftl.run.AndroidTestRunner$runTests$2$invokeSuspend$$inlined$map$lambda$1.invokeSuspend(AndroidTestRunner.kt:52)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:740)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "The repeated field 'google.devtools.testing.v1.TestTargetsForShard.test_targets' should have at least 1 values (found 0)",
    "reason" : "badRequest"
  } ],
  "message" : "The repeated field 'google.devtools.testing.v1.TestTargetsForShard.test_targets' should have at least 1 values (found 0)",
  "status" : "INVALID_ARGUMENT"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:150)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:443)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1092)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:541)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:474)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:591)
    at ftl.http.ExecuteWithRetryKt.executeWithRetry(ExecuteWithRetry.kt:13)
    ... 6 more
Bug

All 4 comments

Thank you for reporting! We'll take a look tomorrow.

@Kurt-Bonatz @bootstraponline
I think we've found cause of this issue. I must admit, it wasn't that easy to reproduce it (at least from our perspective) :)
First I'd like to clarify what The latest snapshot of Flank means because logs you printed are from 'older snapshot' version (~month old), ex AndroidTestRunner that appears in stack trace was removed with #661 . Just wanted to make sure we are on the same page.

We reproduced bug by providing flank test apk with all tests annotated with @Ignore and, what is important, without filtering them. There was a request to attach @Ignored test to test matrix so they could be visible in results (#629).

Next all ignored tests have assigned run time 0 to neglect their influence while calculating shards by time. Under the hood Shard#createShardsByShardCount sorts shards by time and since kotlins sortedBy is stable therefor flank eventually references the same shard leaving other(s) without test methods.

This is 100% reproducible with all @Ignored tests in apk and is related with number of ignored methods and shards.

We still wouldn't be aware of this issue if it weren't for incorrect filter
- notAnnotation androidx.test.filters#Suppress, org.junit#Ignore
where should be
- notAnnotation androidx.test.filters.Suppress, org.junit.Ignore
and that would filter Ignored methods, error wouldn't occur but the issue would be still covered :)

That is what we came up with. Please @jan-gogo add something if missing or correct me.

I appreciate the effort and apologize for some of the confusion! By latest snapshot I was going by the latest release as of yesterday at time of writing. The old logs were just a case of me grabbing the last test run I had executed which was during a git bisect.

The reason for the filters were because we were seeing matrices come back with errors about no tests run. We have very strict suppression of flaky tests so this wasn't too unexpected so I tried to avoid it by removing the addition of the suppressed tests entirely. I realized the filtering mistake shortly after signing off for the day 馃う. Glad it actually helped you though!

Just ran a test run of #704 and everything works as expected with the corrected filters! Thanks again for the quick fix :). Let me know if you need anymore info or another test run.

@Kurt-Bonatz actually that was quite interesting digging and investigating this issue :)
Please, keep as informed if you will encounter any issue

Was this page helpful?
0 / 5 - 0 ratings

Related issues

rolyatwilson picture rolyatwilson  路  5Comments

bootstraponline picture bootstraponline  路  7Comments

jrodbx picture jrodbx  路  4Comments

jakob-grabner picture jakob-grabner  路  7Comments

shawnshaligram picture shawnshaligram  路  3Comments