Skip to content

Commit

Permalink
[Ownership] Add code owner to ftr failure report (#203076)
Browse files Browse the repository at this point in the history
## Summary

Resolves: #202687

### For Reviewers 
#### To test locally, make a test fail, something like 
```
diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts
index 0e29b29e96e..78976e6d54b 100644
--- a/test/functional/apps/console/_autocomplete.ts
+++ b/test/functional/apps/console/_autocomplete.ts
@@ -50,14 +50,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
       await PageObjects.console.setAutocompleteTrace(false);
     });
 
-    it('should provide basic auto-complete functionality', async () => {
+    it.only('should provide basic auto-complete functionality', async () => {
       await PageObjects.console.enterText(`GET _search\n`);
       await PageObjects.console.pressEnter();
       await PageObjects.console.enterText(`{\n\t"query": {`);
       await PageObjects.console.pressEnter();
       await PageObjects.console.sleepForDebouncePeriod();
       await PageObjects.console.promptAutocomplete();
-      expect(PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
+      expect(false).to.be.eql(true);
     });
 
     it('should not show duplicate suggestions', async () => {
```

#### Then run the tests:
`TEST_BROWSER_HEADLESS=1 CI=1 node scripts/functional_tests
--config=test/functional/apps/console/config.ts --bail`

#### Then run the reporter to see the html file
`JOB_NAME=elastic+kibana+7.x node scripts/report_failed_tests
--build-url="${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}"
'target/junit/**/*.xml' --no-github-update --no-index-errors`

#### Lastly, inspect the HTML File
`grep elastic target/test_failures/*.html -B 2`
```
            <div>
                <strong>Owners</strong>:
                <pre>elastic/kibana-management</pre>
--
            </div>
            <div>
                     <a href="https://github.com/elastic/kibana/issues/156926">https://github.com/elastic/kibana/issues/156926</a>
--
              <h5>Stdout</h5>
              <pre>Failed Tests Reporter:
  - Test has failed 1 times on tracked branches: #156926

Failed Tests Reporter:
  - Test has failed 1 times on tracked branches: #156926

Failed Tests Reporter:
  - Test has failed 1 times on tracked branches: #156926
```

Notice the `<pre>elastic/kibana-management</pre>` in the output of grep

Also, you can continue verification of the ownership value, via: `node
scripts/get_owners_for_file.js --file
test/functional/apps/console/_autocomplete.ts`
```
 succ Found matching entry in .github/CODEOWNERS:
      test/functional/apps/console/*.ts elastic/kibana-management
```

---------

Co-authored-by: kibanamachine <[email protected]>
Co-authored-by: Elastic Machine <[email protected]>
  • Loading branch information
3 people authored Dec 16, 2024
1 parent e7dabbf commit 82f0e2c
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<testsuites name="ftr" timestamp="2019-06-05T23:37:10" time="903.670" tests="129" failures="5" skipped="71" command-line="node scripts/functional_tests --config=x-pack/test/api_integration/apis/status/config.ts">
<testsuite timestamp="2019-06-05T23:37:10" time="903.670" tests="129" failures="5" skipped="71" command-line="node scripts/functional_tests --config=x-pack/test/api_integration/apis/status/config.ts">
<testcase name="maps app maps loaded from sample data ecommerce &quot;before all&quot; hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps/sample_data·js" time="154.378">
<testcase name="maps app maps loaded from sample data ecommerce &quot;before all&quot; hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps/sample_data·js" time="154.378" owners="elastic/kibana-presentation">
<system-out>
<![CDATA[[00:00:00] │
[00:07:04] └-: maps app
Expand All @@ -18,7 +18,7 @@ Wait timed out after 10055ms
at onFailure (/var/lib/jenkins/workspace/elastic+kibana+master/JOB/x-pack-ciGroup7/node/immutable/kibana/test/common/services/retry/retry_for_success.ts:68:13)]]>
</failure>
</testcase>
<testcase name="maps app &quot;after all&quot; hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps" time="0.179" metadata-json="{&quot;messages&quot;:[&quot;foo&quot;],&quot;screenshots&quot;:[{&quot;name&quot;:&quot;failure[dashboard app using current data dashboard snapshots compare TSVB snapshot]&quot;,&quot;url&quot;:&quot;https://storage.googleapis.com/kibana-ci-artifacts/jobs/elastic+kibana+7.x/1632/kibana-oss-tests/test/functional/screenshots/failure/dashboard%20app%20using%20current%20data%20dashboard%20snapshots%20compare%20TSVB%20snapshot.png&quot;}]}">
<testcase name="maps app &quot;after all&quot; hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps" time="0.179" metadata-json="{&quot;messages&quot;:[&quot;foo&quot;],&quot;screenshots&quot;:[{&quot;name&quot;:&quot;failure[dashboard app using current data dashboard snapshots compare TSVB snapshot]&quot;,&quot;url&quot;:&quot;https://storage.googleapis.com/kibana-ci-artifacts/jobs/elastic+kibana+7.x/1632/kibana-oss-tests/test/functional/screenshots/failure/dashboard%20app%20using%20current%20data%20dashboard%20snapshots%20compare%20TSVB%20snapshot.png&quot;}]}" owners="elastic/kibana-presentation">
<system-out>
<![CDATA[[00:00:00] │
[00:07:04] └-: maps app
Expand All @@ -32,7 +32,7 @@ Wait timed out after 10055ms
at process._tickCallback (internal/process/next_tick.js:68:7) name: 'NoSuchSessionError', remoteStacktrace: '' }]]>
</failure>
</testcase>
<testcase name="InfraOps app feature controls infrastructure security global infrastructure all privileges shows infrastructure navlink" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/infra/feature_controls/infrastructure_security·ts">
<testcase name="InfraOps app feature controls infrastructure security global infrastructure all privileges shows infrastructure navlink" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/infra/feature_controls/infrastructure_security·ts" owners="elastic/kibana-presentation">
<system-out>
<![CDATA[[00:00:00] │
[00:05:13] └-: InfraOps app
Expand All @@ -41,7 +41,7 @@ Wait timed out after 10055ms
</system-out>
<skipped/>
</testcase>
<testcase name="machine learning anomaly detection saved search with lucene query job creation opens the advanced section" classname="Firefox XPack UI Functional Tests.x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job·ts" time="6.040">
<testcase name="machine learning anomaly detection saved search with lucene query job creation opens the advanced section" classname="Firefox XPack UI Functional Tests.x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job·ts" time="6.040" owners="elastic/ml-ui">
<system-out><![CDATA[[00:21:57] └-: machine learning...]]></system-out>
<failure><![CDATA[{ NoSuchSessionError: Tried to run command without establishing a connection
at Object.throwDecodedError (/dev/shm/workspace/kibana/node_modules/selenium-webdriver/lib/error.js:550:15)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ it('rewrites ftr reports with minimal changes', async () => {
‹?xml version="1.0" encoding="utf-8"?›
‹testsuites name="ftr" timestamp="2019-06-05T23:37:10" time="903.670" tests="129" failures="5" skipped="71" command-line="node scripts/functional_tests --config=x-pack/test/api_integration/apis/status/config.ts"›
‹testsuite timestamp="2019-06-05T23:37:10" time="903.670" tests="129" failures="5" skipped="71" command-line="node scripts/functional_tests --config=x-pack/test/api_integration/apis/status/config.ts"›
‹testcase name="maps app maps loaded from sample data ecommerce &quot;before all&quot; hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps/sample_data·js" time="154.378"›
‹testcase name="maps app maps loaded from sample data ecommerce &quot;before all&quot; hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps/sample_data·js" time="154.378" owners="elastic/kibana-presentation"
- ‹system-out›
- ‹![CDATA[[00:00:00] │
+ ‹system-out›Failed Tests Reporter:
Expand All @@ -88,7 +88,7 @@ it('rewrites ftr reports with minimal changes', async () => {
+ at onFailure (/var/lib/jenkins/workspace/elastic+kibana+master/JOB/x-pack-ciGroup7/node/immutable/kibana/test/common/services/retry/retry_for_success.ts:68:13)
‹/failure›
‹/testcase›
‹testcase name="maps app &quot;after all&quot; hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps" time="0.179" metadata-json="{&quot;messages&quot;:[&quot;foo&quot;],&quot;screenshots&quot;:[{&quot;name&quot;:&quot;failure[dashboard app using current data dashboard snapshots compare TSVB snapshot]&quot;,&quot;url&quot;:&quot;https://storage.googleapis.com/kibana-ci-artifacts/jobs/elastic+kibana+7.x/1632/kibana-oss-tests/test/functional/screenshots/failure/dashboard%20app%20using%20current%20data%20dashboard%20snapshots%20compare%20TSVB%20snapshot.png&quot;}]}"›
‹testcase name="maps app &quot;after all&quot; hook" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/maps" time="0.179" metadata-json="{&quot;messages&quot;:[&quot;foo&quot;],&quot;screenshots&quot;:[{&quot;name&quot;:&quot;failure[dashboard app using current data dashboard snapshots compare TSVB snapshot]&quot;,&quot;url&quot;:&quot;https://storage.googleapis.com/kibana-ci-artifacts/jobs/elastic+kibana+7.x/1632/kibana-oss-tests/test/functional/screenshots/failure/dashboard%20app%20using%20current%20data%20dashboard%20snapshots%20compare%20TSVB%20snapshot.png&quot;}]}" owners="elastic/kibana-presentation"
‹system-out›
- ‹![CDATA[[00:00:00] │
+ [00:00:00] │
Expand All @@ -106,7 +106,7 @@ it('rewrites ftr reports with minimal changes', async () => {
+ at process._tickCallback (internal/process/next_tick.js:68:7) name: 'NoSuchSessionError', remoteStacktrace: '' }
‹/failure›
‹/testcase›
‹testcase name="InfraOps app feature controls infrastructure security global infrastructure all privileges shows infrastructure navlink" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/infra/feature_controls/infrastructure_security·ts"›
‹testcase name="InfraOps app feature controls infrastructure security global infrastructure all privileges shows infrastructure navlink" classname="Chrome X-Pack UI Functional Tests.x-pack/test/functional/apps/infra/feature_controls/infrastructure_security·ts" owners="elastic/kibana-presentation"
‹system-out›
- ‹![CDATA[[00:00:00] │
+ [00:00:00] │
Expand All @@ -117,7 +117,7 @@ it('rewrites ftr reports with minimal changes', async () => {
‹/system-out›
‹skipped/›
‹/testcase›
‹testcase name="machine learning anomaly detection saved search with lucene query job creation opens the advanced section" classname="Firefox XPack UI Functional Tests.x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job·ts" time="6.040"›
‹testcase name="machine learning anomaly detection saved search with lucene query job creation opens the advanced section" classname="Firefox XPack UI Functional Tests.x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job·ts" time="6.040" owners="elastic/ml-ui"
- ‹system-out›‹![CDATA[[00:21:57] └-: machine learning...]]›‹/system-out›
- ‹failure›‹![CDATA[{ NoSuchSessionError: Tried to run command without establishing a connection
+ ‹system-out›[00:21:57] └-: machine learning...‹/system-out›
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ it('discovers failures in ftr report', async () => {
",
"likelyIrrelevant": false,
"name": "maps app maps loaded from sample data ecommerce \\"before all\\" hook",
"owners": "elastic/kibana-presentation",
"system-out": "
[00:00:00] │
[00:07:04] └-: maps app
Expand All @@ -49,6 +50,7 @@ it('discovers failures in ftr report', async () => {
"likelyIrrelevant": true,
"metadata-json": "{\\"messages\\":[\\"foo\\"],\\"screenshots\\":[{\\"name\\":\\"failure[dashboard app using current data dashboard snapshots compare TSVB snapshot]\\",\\"url\\":\\"https://storage.googleapis.com/kibana-ci-artifacts/jobs/elastic+kibana+7.x/1632/kibana-oss-tests/test/functional/screenshots/failure/dashboard%20app%20using%20current%20data%20dashboard%20snapshots%20compare%20TSVB%20snapshot.png\\"}]}",
"name": "maps app \\"after all\\" hook",
"owners": "elastic/kibana-presentation",
"system-out": "
[00:00:00] │
[00:07:04] └-: maps app
Expand All @@ -67,6 +69,7 @@ it('discovers failures in ftr report', async () => {
at process._tickCallback (internal/process/next_tick.js:68:7) name: 'NoSuchSessionError', remoteStacktrace: '' }",
"likelyIrrelevant": true,
"name": "machine learning anomaly detection saved search with lucene query job creation opens the advanced section",
"owners": "elastic/ml-ui",
"system-out": "[00:21:57] └-: machine learning...",
"time": "6.040",
},
Expand All @@ -87,6 +90,7 @@ it('discovers failures in jest report', async () => {
",
"likelyIrrelevant": false,
"name": "launcher can reconnect if process died",
"owners": undefined,
"system-out": "",
"time": "7.060",
},
Expand Down Expand Up @@ -116,6 +120,7 @@ it('discovers failures in mocha report', async () => {
",
"likelyIrrelevant": true,
"name": "code in multiple nodes \\"before all\\" hook",
"owners": undefined,
"system-out": "
",
Expand All @@ -131,6 +136,7 @@ it('discovers failures in mocha report', async () => {
",
"likelyIrrelevant": true,
"name": "code in multiple nodes \\"after all\\" hook",
"owners": undefined,
"system-out": "
",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export type TestFailure = FailedTestCase['$'] & {
githubIssue?: string;
failureCount?: number;
commandLine?: string;
owners?: any;
};

const getText = (node?: Array<string | { _: string }>) => {
Expand Down Expand Up @@ -78,6 +79,7 @@ export function getFailures(report: TestReport) {
for (const testCase of makeFailedTestCaseIter(report)) {
const failure = getText(testCase.failure);
const likelyIrrelevant = isLikelyIrrelevant(testCase.$.name, failure);
const owners = testCase.$.owners;

const failureObj = {
// unwrap xml weirdness
Expand All @@ -87,6 +89,7 @@ export function getFailures(report: TestReport) {
likelyIrrelevant,
'system-out': getText(testCase['system-out']),
commandLine,
owners,
};

// cleaning up duplicates
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,12 @@ export async function reportFailuresToFile(
</div>`
: ''
}
<div>
<strong>Owners</strong>:
<pre>${escape(
failure?.owners ? (failure?.owners as string) : 'Unable to determine code owners'
)}</pre>
</div>
<div>
<strong>Failures in tracked branches</strong>:
<span class="badge rounded-pill bg-danger">${failure.failureCount || 0}</span>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import Fs from 'fs';
import { promisify } from 'util';

import xml2js from 'xml2js';

const readAsync = promisify(Fs.readFile);

export type TestReport =
Expand Down Expand Up @@ -40,6 +39,8 @@ export interface TestSuite {
'metadata-json'?: string;
/* the command that ran this suite */
'command-line'?: string;
/* the codeowners of the file */
owners?: string;
};
testcase?: TestCase[];
}
Expand All @@ -56,6 +57,8 @@ export interface TestCase {
'metadata-json'?: string;
/* the command that ran this suite */
'command-line'?: string;
/* the codeowners of the file */
owners?: string;
};
/* contents of system-out elements */
'system-out'?: Array<string | { _: string }>;
Expand Down

0 comments on commit 82f0e2c

Please sign in to comment.