-
+
B:
@@ -424,9 +417,7 @@ exports[`SubtestsRevisionRow Component renders the component with correct data 1
-
+
N:
diff --git a/src/__tests__/Search/__snapshots__/CompareOverTime.test.tsx.snap b/src/__tests__/Search/__snapshots__/CompareOverTime.test.tsx.snap
index 7ace2975b..9a80f1771 100644
--- a/src/__tests__/Search/__snapshots__/CompareOverTime.test.tsx.snap
+++ b/src/__tests__/Search/__snapshots__/CompareOverTime.test.tsx.snap
@@ -691,7 +691,7 @@ exports[`Compare Over Time renders correctly when there are no results: Initial
`;
@@ -700,7 +700,7 @@ exports[`Compare Over Time selects and displays new time range when clicked 1`]
{renderDifferingTestVersionColumns(testVersion ?? STUDENT_T, result)}
-
+
- B:
+ B:
{baseRunsCount}
- N:
+ N:
{newRunsCount}
diff --git a/src/components/CompareResults/SubtestsResults/SubtestsResultsMain.tsx b/src/components/CompareResults/SubtestsResults/SubtestsResultsMain.tsx
index 9ee166741..91eb96382 100644
--- a/src/components/CompareResults/SubtestsResults/SubtestsResultsMain.tsx
+++ b/src/components/CompareResults/SubtestsResults/SubtestsResultsMain.tsx
@@ -2,6 +2,7 @@ import { useState, Suspense } from 'react';
import { Grid, Skeleton, Stack } from '@mui/material';
import Alert from '@mui/material/Alert';
+import Link from '@mui/material/Link';
import { Container } from '@mui/system';
import { useLoaderData, Await } from 'react-router';
import { style } from 'typestyle';
@@ -146,7 +147,14 @@ function SubtestsResultsMain({ view }: SubtestsResultsMainProps) {
{displayMannWhitneyUWarning && (
- {Strings.components.mannWhitneyUWarning.text}
+ {Strings.components.mannWhitneyUWarning.text}{' '}
+
+ {Strings.components.mannWhitneyUWarning.linkText}
+
+ {'. '}
)}
+
- B:
+ B:
{baseRunsCount}
- N:
+ N:
{newRunsCount}
diff --git a/src/components/CompareResults/hashToCommitLoader.ts b/src/components/CompareResults/hashToCommitLoader.ts
index c6733409b..a6f9a575c 100644
--- a/src/components/CompareResults/hashToCommitLoader.ts
+++ b/src/components/CompareResults/hashToCommitLoader.ts
@@ -66,7 +66,7 @@ export async function loader({ request }: { request: Request }) {
}
const baseRevsFromHash = commits_from_hashes.baseRevision;
const newRevsFromHash = [commits_from_hashes.newRevision];
- const replicates = url.searchParams.has('replicates');
+ const replicatesFromUrl = url.searchParams.has('replicates');
const {
baseRev,
baseRepo,
@@ -74,6 +74,7 @@ export async function loader({ request }: { request: Request }) {
newRepos,
frameworkId,
frameworkName,
+ replicates,
testVersion,
} = checkValues({
baseRev: baseRevsFromHash,
@@ -81,6 +82,7 @@ export async function loader({ request }: { request: Request }) {
newRevs: newRevsFromHash,
newRepos: newReposFromUrl,
framework: frameworkFromUrl,
+ replicates: replicatesFromUrl,
testVersion: testVersionFromUrl,
});
return await getComparisonInformation(
diff --git a/src/components/CompareResults/landoToCommitLoader.ts b/src/components/CompareResults/landoToCommitLoader.ts
index 3fdaf5c01..cb23abecd 100644
--- a/src/components/CompareResults/landoToCommitLoader.ts
+++ b/src/components/CompareResults/landoToCommitLoader.ts
@@ -29,7 +29,7 @@ export async function loader({ request }: { request: Request }) {
'Not all values were supplied please check you provided both baseLando and newLando',
);
}
- const replicates = url.searchParams.has('replicates');
+ const replicatesFromUrl = url.searchParams.has('replicates');
const baseRevisionsFromLando =
await fetchRevisionFromLandoId(baseLandoIDFromUrl);
@@ -45,6 +45,7 @@ export async function loader({ request }: { request: Request }) {
newRepos,
frameworkId,
frameworkName,
+ replicates,
testVersion,
} = checkValues({
baseRev: baseRevisionsFromLando.commit_id,
@@ -52,6 +53,7 @@ export async function loader({ request }: { request: Request }) {
newRevs: [newRevisionsFromLando.commit_id],
newRepos: newReposFromUrl,
framework: frameworkFromUrl,
+ replicates: replicatesFromUrl,
testVersion: testVersionFromUrl,
});
return await getComparisonInformation(
diff --git a/src/components/CompareResults/loader.ts b/src/components/CompareResults/loader.ts
index c7b585842..353db7eec 100644
--- a/src/components/CompareResults/loader.ts
+++ b/src/components/CompareResults/loader.ts
@@ -2,7 +2,7 @@ import {
repoMap,
frameworks,
compareView,
- STUDENT_T,
+ MANN_WHITNEY_U,
} from '../../common/constants';
import {
fetchCompareResults,
@@ -24,6 +24,7 @@ export function checkValues({
newRevs,
newRepos,
framework,
+ replicates,
testVersion,
}: {
baseRev: string | null;
@@ -31,6 +32,7 @@ export function checkValues({
newRevs: string[];
newRepos: Repository['name'][];
framework: string | number | null;
+ replicates: boolean;
testVersion: TestVersion | null;
}): {
baseRev: string;
@@ -39,6 +41,7 @@ export function checkValues({
newRepos: Repository['name'][];
frameworkId: Framework['id'];
frameworkName: Framework['name'];
+ replicates: boolean;
testVersion: TestVersion;
} {
if (baseRev === null) {
@@ -77,9 +80,15 @@ export function checkValues({
`The parameter framework isn't a valid value: "${framework}".`,
);
}
+
+ if (testVersion === MANN_WHITNEY_U || testVersion === null) {
+ replicates = true;
+ }
+
if (testVersion === null) {
- testVersion = STUDENT_T;
+ testVersion = MANN_WHITNEY_U;
}
+
if (!newRevs.length) {
return {
baseRev,
@@ -88,6 +97,7 @@ export function checkValues({
newRepos: [baseRepo],
frameworkId,
frameworkName,
+ replicates,
testVersion,
};
}
@@ -112,6 +122,7 @@ export function checkValues({
newRepos,
frameworkId,
frameworkName,
+ replicates,
testVersion,
};
}
@@ -211,7 +222,7 @@ export async function loader({ request }: { request: Request }) {
'newRepo',
) as Repository['name'][];
const frameworkFromUrl = url.searchParams.get('framework');
- const replicates = url.searchParams.has('replicates');
+ const replicatesFromUrl = url.searchParams.has('replicates');
const testVersionFromUrl = url.searchParams.get(
'test_version',
) as TestVersion;
@@ -223,6 +234,7 @@ export async function loader({ request }: { request: Request }) {
newRepos,
frameworkId,
frameworkName,
+ replicates,
testVersion,
} = checkValues({
baseRev: baseRevFromUrl,
@@ -230,6 +242,7 @@ export async function loader({ request }: { request: Request }) {
newRevs: newRevsFromUrl,
newRepos: newReposFromUrl,
framework: frameworkFromUrl,
+ replicates: replicatesFromUrl,
testVersion: testVersionFromUrl,
});
diff --git a/src/components/CompareResults/overTimeLoader.ts b/src/components/CompareResults/overTimeLoader.ts
index aa11b8f21..b47be0ea5 100644
--- a/src/components/CompareResults/overTimeLoader.ts
+++ b/src/components/CompareResults/overTimeLoader.ts
@@ -3,7 +3,7 @@ import {
frameworks,
timeRanges,
compareOverTimeView,
- STUDENT_T,
+ MANN_WHITNEY_U,
} from '../../common/constants';
import {
fetchCompareOverTimeResults,
@@ -24,6 +24,7 @@ function checkValues({
newRepos,
framework,
interval,
+ replicates,
testVersion,
}: {
baseRepo: Repository['name'] | null;
@@ -31,6 +32,7 @@ function checkValues({
newRepos: Repository['name'][];
framework: string | number | null;
interval: string | number | null;
+ replicates: boolean;
testVersion?: TestVersion | null;
}): {
baseRepo: Repository['name'];
@@ -40,6 +42,7 @@ function checkValues({
frameworkName: Framework['name'];
intervalValue: TimeRange['value'];
intervalText: TimeRange['text'];
+ replicates: boolean;
testVersion: TestVersion;
} {
if (baseRepo === null) {
@@ -102,8 +105,13 @@ function checkValues({
`The parameter interval isn't a valid value: "${interval}".`,
);
}
+
+ if (testVersion === MANN_WHITNEY_U || testVersion === null) {
+ replicates = true;
+ }
+
if (!testVersion) {
- testVersion = STUDENT_T;
+ testVersion = MANN_WHITNEY_U;
}
return {
@@ -114,6 +122,7 @@ function checkValues({
frameworkName,
intervalText,
intervalValue,
+ replicates,
testVersion,
};
}
@@ -173,7 +182,7 @@ export async function loader({ request }: { request: Request }) {
) as Repository['name'][];
const frameworkFromUrl = url.searchParams.get('framework');
const intervalFromUrl = url.searchParams.get('selectedTimeRange');
- const replicates = url.searchParams.has('replicates');
+ const replicatesFromUrl = url.searchParams.has('replicates');
const testVersionFromUrl = url.searchParams.get(
'test_version',
) as TestVersion;
@@ -186,6 +195,7 @@ export async function loader({ request }: { request: Request }) {
frameworkName,
intervalValue,
intervalText,
+ replicates,
testVersion,
} = checkValues({
baseRepo: baseRepoFromUrl,
@@ -193,6 +203,7 @@ export async function loader({ request }: { request: Request }) {
newRepos: newReposFromUrl,
framework: frameworkFromUrl,
interval: intervalFromUrl,
+ replicates: replicatesFromUrl,
testVersion: testVersionFromUrl,
});
diff --git a/src/components/CompareResults/subtestsLoader.ts b/src/components/CompareResults/subtestsLoader.ts
index f9f165aee..fcf3800ef 100644
--- a/src/components/CompareResults/subtestsLoader.ts
+++ b/src/components/CompareResults/subtestsLoader.ts
@@ -1,4 +1,4 @@
-import { repoMap, frameworks, STUDENT_T } from '../../common/constants';
+import { repoMap, frameworks, MANN_WHITNEY_U } from '../../common/constants';
import { fetchSubtestsCompareResults } from '../../logic/treeherder';
import { Repository } from '../../types/state';
import { Framework, TestVersion } from '../../types/types';
@@ -13,6 +13,7 @@ function checkValues({
framework,
baseParentSignature,
newParentSignature,
+ replicates,
testVersion,
}: {
baseRev: string | null;
@@ -22,6 +23,7 @@ function checkValues({
framework: string | number | null;
baseParentSignature: string | null;
newParentSignature: string | null;
+ replicates: boolean;
testVersion?: TestVersion;
}): {
baseRev: string;
@@ -32,6 +34,7 @@ function checkValues({
frameworkName: Framework['name'];
baseParentSignature: string;
newParentSignature: string;
+ replicates: boolean;
testVersion?: TestVersion;
} {
if (baseRev === null) {
@@ -93,8 +96,13 @@ function checkValues({
`The parameter framework isn't a valid value: "${framework}".`,
);
}
+
+ if (testVersion === MANN_WHITNEY_U || testVersion === null) {
+ replicates = true;
+ }
+
if (!testVersion) {
- testVersion = STUDENT_T;
+ testVersion = MANN_WHITNEY_U;
}
return {
@@ -106,6 +114,7 @@ function checkValues({
frameworkName,
baseParentSignature,
newParentSignature,
+ replicates,
testVersion,
};
}
@@ -130,9 +139,9 @@ export function loader({ request }: { request: Request }) {
'baseParentSignature',
);
const newParentSignatureFromUrl = url.searchParams.get('newParentSignature');
- const replicates = url.searchParams.has('replicates');
+ const replicatesFromUrl = url.searchParams.has('replicates');
const testVersionFromUrl = (url.searchParams.get('test_version') ??
- STUDENT_T) as TestVersion;
+ MANN_WHITNEY_U) as TestVersion;
const {
baseRev,
@@ -143,6 +152,7 @@ export function loader({ request }: { request: Request }) {
frameworkName,
newParentSignature,
baseParentSignature,
+ replicates,
testVersion,
} = checkValues({
baseRev: baseRevFromUrl,
@@ -152,6 +162,7 @@ export function loader({ request }: { request: Request }) {
framework: frameworkFromUrl,
baseParentSignature: baseParentSignatureFromUrl,
newParentSignature: newParentSignatureFromUrl,
+ replicates: replicatesFromUrl,
testVersion: testVersionFromUrl,
});
diff --git a/src/components/CompareResults/subtestsOverTimeLoader.tsx b/src/components/CompareResults/subtestsOverTimeLoader.tsx
index 40956ead9..e45568305 100644
--- a/src/components/CompareResults/subtestsOverTimeLoader.tsx
+++ b/src/components/CompareResults/subtestsOverTimeLoader.tsx
@@ -2,7 +2,7 @@ import {
repoMap,
frameworks,
timeRanges,
- STUDENT_T,
+ MANN_WHITNEY_U,
} from '../../common/constants';
import { fetchSubtestsCompareOverTimeResults } from '../../logic/treeherder';
import { Repository } from '../../types/state';
@@ -18,6 +18,7 @@ function checkValues({
interval,
baseParentSignature,
newParentSignature,
+ replicates,
testVersion,
}: {
baseRepo: Repository['name'] | null;
@@ -27,6 +28,7 @@ function checkValues({
interval: string | number | null;
baseParentSignature: string | null;
newParentSignature: string | null;
+ replicates: boolean;
testVersion?: TestVersion | null;
}): {
baseRepo: Repository['name'];
@@ -38,6 +40,7 @@ function checkValues({
intervalText: TimeRange['text'];
baseParentSignature: string;
newParentSignature: string;
+ replicates: boolean;
testVersion: TestVersion;
} {
if (baseRepo === null) {
@@ -117,8 +120,13 @@ function checkValues({
`The parameter interval isn't a valid value: "${interval}".`,
);
}
+
+ if (testVersion === MANN_WHITNEY_U || testVersion === null) {
+ replicates = true;
+ }
+
if (!testVersion) {
- testVersion = STUDENT_T;
+ testVersion = MANN_WHITNEY_U;
}
return {
@@ -131,6 +139,7 @@ function checkValues({
intervalValue,
baseParentSignature,
newParentSignature,
+ replicates,
testVersion,
};
}
@@ -155,7 +164,7 @@ export function loader({ request }: { request: Request }) {
'baseParentSignature',
);
const newParentSignatureFromUrl = url.searchParams.get('newParentSignature');
- const replicates = url.searchParams.has('replicates');
+ const replicatesFromUrl = url.searchParams.has('replicates');
const testVersionFromUrl = url.searchParams.get(
'test_version',
) as TestVersion;
@@ -169,6 +178,7 @@ export function loader({ request }: { request: Request }) {
intervalText,
baseParentSignature,
newParentSignature,
+ replicates,
testVersion,
} = checkValues({
baseRepo: baseRepoFromUrl,
@@ -178,6 +188,7 @@ export function loader({ request }: { request: Request }) {
interval: intervalFromUrl,
baseParentSignature: baseParentSignatureFromUrl,
newParentSignature: newParentSignatureFromUrl,
+ replicates: replicatesFromUrl,
testVersion: testVersionFromUrl,
});
diff --git a/src/components/Shared/LinkToHome.tsx b/src/components/Shared/LinkToHome.tsx
index 184b32945..af0d8af14 100644
--- a/src/components/Shared/LinkToHome.tsx
+++ b/src/components/Shared/LinkToHome.tsx
@@ -2,28 +2,21 @@ import ChevronLeftIcon from '@mui/icons-material/ChevronLeft';
import Link from '@mui/material/Link';
import Stack from '@mui/material/Stack';
import { Box } from '@mui/system';
-import { style } from 'typestyle';
-
-import { Spacing } from '../../styles';
export function LinkToHome() {
- const styles = {
- box: style({
- marginBottom: `${Spacing.Small + 1}px`,
- }),
- };
-
return (
-
-
+
+
- Home
+ Home
diff --git a/src/components/Shared/ToggleReplicatesButton.tsx b/src/components/Shared/ToggleReplicatesButton.tsx
index 41b4cdda5..e3bc88a45 100644
--- a/src/components/Shared/ToggleReplicatesButton.tsx
+++ b/src/components/Shared/ToggleReplicatesButton.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import { useEffect, useState } from 'react';
import { FormControlLabel, FormGroup } from '@mui/material';
import Box from '@mui/material/Box';
@@ -24,6 +24,10 @@ function ToggleReplicatesButton() {
);
const [searchParams, setSearchParams] = useSearchParams();
+ useEffect(() => {
+ setToggleReplicates(loaderData.replicates);
+ }, [loaderData.replicates]);
+
const onToggleReplicates = () => {
setToggleReplicates(!toggleReplicates);
if (!toggleReplicates) {
diff --git a/src/resources/Strings.tsx b/src/resources/Strings.tsx
index 092525468..2ea3c7db5 100644
--- a/src/resources/Strings.tsx
+++ b/src/resources/Strings.tsx
@@ -95,7 +95,14 @@ export const Strings = {
},
},
mannWhitneyUWarning: {
- text: 'The Mann-Whitney comparison technique is still in the experimental stage. If you encounter any issues, have suggestions for improvements, or wish to provide feedback, please report it on the Testing :: Perfcompare Bugzilla component.',
+ text: 'The Mann-Whitney comparison technique is still in the experimental stage. If you encounter any issues, have suggestions for improvements, or wish to provide feedback, please',
+ linkText: 'report it on Bugzilla',
+ href: 'https://bugzilla.mozilla.org/enter_bug.cgi?product=Testing&component=PerfCompare&status_whiteboard=[pcf]',
+ text2:
+ 'The performance comparison shown here may not reflect what performance alerts are generated in CI. Conversely, a performance comparison from a generated alert in CI may not reflect the changes shown here. For a comparison that currently reflects our CI detection system, select the Student-T Test option.',
+ },
+ studentTTestWarning: {
+ text: 'This performance comparison technique will be removed in the coming year. Mann-Whitney-U test option will still be available.',
},
revisionRow: {
title: {
diff --git a/src/types/types.ts b/src/types/types.ts
index 9b6e8f9bb..2042386eb 100644
--- a/src/types/types.ts
+++ b/src/types/types.ts
@@ -123,7 +123,8 @@ export type Framework =
| { id: 12; name: 'devtools' }
| { id: 13; name: 'browsertime' }
| { id: 15; name: 'mozperftest' }
- | { id: 16; name: 'fxrecord' };
+ | { id: 16; name: 'fxrecord' }
+ | { id: 18; name: 'mozharness' };
export type SupportedPerfdocsFramework = 'talos' | 'awsy' | 'devtools';