Skip to content

Commit da48008

Browse files
jackfranklinDevtools-frontend LUCI CQ
authored andcommitted
Move calculation of network conditions for RTT into SDK layer
Rather than living in a panel; it can sit with all the other conditions and throttling related code in SDK.NetworkManager. I also added some tests for it. Bug: 441265851 Change-Id: Ic20b2bc786665a48ed0f76a46d873a7d02847588 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6943175 Commit-Queue: Jack Franklin <jacktfranklin@chromium.org> Reviewed-by: Alex Rudenko <alexrudenko@chromium.org> Auto-Submit: Jack Franklin <jacktfranklin@chromium.org> Commit-Queue: Alex Rudenko <alexrudenko@chromium.org>
1 parent b2111e5 commit da48008

File tree

5 files changed

+114
-40
lines changed

5 files changed

+114
-40
lines changed

front_end/core/sdk/NetworkManager.test.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2193,4 +2193,68 @@ describeWithMockConnection('InterceptedRequest', () => {
21932193
];
21942194
assert.deepEqual(SDK.NetworkManager.InterceptedRequest.mergeSetCookieHeaders(original, overrides), expected);
21952195
});
2196+
2197+
describe('getRecommendedNetworkPreset', () => {
2198+
it('should recommend "Slow 3G" for high RTT', () => {
2199+
// RTT >= 276ms should be Slow 3G.
2200+
const rtt = 500;
2201+
const preset = SDK.NetworkManager.getRecommendedNetworkPreset(rtt);
2202+
assert.isNotNull(preset);
2203+
assert.strictEqual(preset?.key, SDK.NetworkManager.Slow3GConditions.key);
2204+
});
2205+
2206+
it('should recommend "Slow 4G" for medium RTT', () => {
2207+
// RTT between 106ms and 275ms should be Slow 4G.
2208+
const rtt = 200;
2209+
const preset = SDK.NetworkManager.getRecommendedNetworkPreset(rtt);
2210+
assert.isNotNull(preset);
2211+
assert.strictEqual(preset?.key, SDK.NetworkManager.Slow4GConditions.key);
2212+
});
2213+
2214+
it('should recommend "Fast 4G" for low RTT', () => {
2215+
// RTT between 60ms and 105ms should be Fast 4G.
2216+
const rtt = 100;
2217+
const preset = SDK.NetworkManager.getRecommendedNetworkPreset(rtt);
2218+
assert.isNotNull(preset);
2219+
assert.strictEqual(preset?.key, SDK.NetworkManager.Fast4GConditions.key);
2220+
});
2221+
2222+
it('should return null for very low RTT, suggesting no throttling', () => {
2223+
// RTT below 60ms should suggest no throttling by returning null.
2224+
const rtt = 20;
2225+
const preset = SDK.NetworkManager.getRecommendedNetworkPreset(rtt);
2226+
assert.isNull(preset);
2227+
});
2228+
2229+
it('should handle boundary conditions correctly', () => {
2230+
// Crossover between Slow 3G and Slow 4G
2231+
const slow3GPreset = SDK.NetworkManager.getRecommendedNetworkPreset(276);
2232+
assert.isNotNull(slow3GPreset);
2233+
assert.strictEqual(slow3GPreset.key, SDK.NetworkManager.Slow3GConditions.key, 'RTT 276 should be Slow 3G');
2234+
2235+
const slow4GAt3GBoundary = SDK.NetworkManager.getRecommendedNetworkPreset(275);
2236+
assert.isNotNull(slow4GAt3GBoundary);
2237+
assert.strictEqual(slow4GAt3GBoundary.key, SDK.NetworkManager.Slow4GConditions.key, 'RTT 275 should be Slow 4G');
2238+
2239+
// Crossover between Slow 4G and Fast 4G
2240+
const slow4GAtFast4GBoundary = SDK.NetworkManager.getRecommendedNetworkPreset(106);
2241+
assert.isNotNull(slow4GAtFast4GBoundary);
2242+
assert.strictEqual(
2243+
slow4GAtFast4GBoundary.key, SDK.NetworkManager.Slow4GConditions.key, 'RTT 106 should be Slow 4G');
2244+
2245+
const fast4GAtSlow4GBoundary = SDK.NetworkManager.getRecommendedNetworkPreset(105);
2246+
assert.isNotNull(fast4GAtSlow4GBoundary);
2247+
assert.strictEqual(
2248+
fast4GAtSlow4GBoundary.key, SDK.NetworkManager.Fast4GConditions.key, 'RTT 105 should be Fast 4G');
2249+
2250+
// Boundary for Fast 4G and No Throttling
2251+
const fast4GAtNoThrottlingBoundary = SDK.NetworkManager.getRecommendedNetworkPreset(60);
2252+
assert.isNotNull(fast4GAtNoThrottlingBoundary);
2253+
assert.strictEqual(
2254+
fast4GAtNoThrottlingBoundary.key, SDK.NetworkManager.Fast4GConditions.key, 'RTT 60 should be Fast 4G');
2255+
2256+
const noThrottlingPreset = SDK.NetworkManager.getRecommendedNetworkPreset(59);
2257+
assert.isNull(noThrottlingPreset, 'RTT 59 should be null');
2258+
});
2259+
});
21962260
});

front_end/core/sdk/NetworkManager.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2413,3 +2413,50 @@ export interface RequestUpdateDroppedEventData {
24132413
mimeType: string;
24142414
lastModified: Date|null;
24152415
}
2416+
2417+
/**
2418+
* For the given Round Trip Time (in MilliSeconds), return the best throttling conditions.
2419+
*/
2420+
export function getRecommendedNetworkPreset(rtt: number): Conditions|null {
2421+
const RTT_COMPARISON_THRESHOLD = 200;
2422+
const RTT_MINIMUM = 60;
2423+
2424+
if (!Number.isFinite(rtt)) {
2425+
return null;
2426+
}
2427+
2428+
if (rtt < RTT_MINIMUM) {
2429+
return null;
2430+
}
2431+
2432+
// We pick from the set of presets in the panel but do not want to allow
2433+
// the "No Throttling" option to be picked.
2434+
const presets = THROTTLING_CONDITIONS_LOOKUP.values()
2435+
.filter(condition => {
2436+
return condition !== NoThrottlingConditions;
2437+
})
2438+
.toArray();
2439+
2440+
let closestPreset: Conditions|null = null;
2441+
let smallestDiff = Infinity;
2442+
for (const preset of presets) {
2443+
const {targetLatency} = preset;
2444+
if (!targetLatency) {
2445+
continue;
2446+
}
2447+
2448+
const diff = Math.abs(targetLatency - rtt);
2449+
if (diff > RTT_COMPARISON_THRESHOLD) {
2450+
continue;
2451+
}
2452+
2453+
if (smallestDiff < diff) {
2454+
continue;
2455+
}
2456+
2457+
closestPreset = preset;
2458+
smallestDiff = diff;
2459+
}
2460+
2461+
return closestPreset;
2462+
}

front_end/panels/mobile_throttling/ThrottlingPresets.ts

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -135,42 +135,6 @@ export class ThrottlingPresets {
135135
];
136136
}
137137

138-
static getRecommendedNetworkPreset(rtt: number): SDK.NetworkManager.Conditions|null {
139-
const RTT_COMPARISON_THRESHOLD = 200;
140-
const RTT_MINIMUM = 60;
141-
142-
if (!Number.isFinite(rtt)) {
143-
return null;
144-
}
145-
146-
if (rtt < RTT_MINIMUM) {
147-
return null;
148-
}
149-
150-
let closestPreset: SDK.NetworkManager.Conditions|null = null;
151-
let smallestDiff = Infinity;
152-
for (const preset of ThrottlingPresets.networkPresets) {
153-
const {targetLatency} = preset;
154-
if (!targetLatency) {
155-
continue;
156-
}
157-
158-
const diff = Math.abs(targetLatency - rtt);
159-
if (diff > RTT_COMPARISON_THRESHOLD) {
160-
continue;
161-
}
162-
163-
if (smallestDiff < diff) {
164-
continue;
165-
}
166-
167-
closestPreset = preset;
168-
smallestDiff = diff;
169-
}
170-
171-
return closestPreset;
172-
}
173-
174138
static networkPresets: SDK.NetworkManager.Conditions[] = [
175139
SDK.NetworkManager.Fast4GConditions,
176140
SDK.NetworkManager.Slow4GConditions,

front_end/panels/timeline/components/LiveMetricsView.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import './MetricCard.js';
1414
import * as Common from '../../../core/common/common.js';
1515
import * as i18n from '../../../core/i18n/i18n.js';
1616
import type * as Platform from '../../../core/platform/platform.js';
17+
import * as SDK from '../../../core/sdk/sdk.js';
1718
import * as CrUXManager from '../../../models/crux-manager/crux-manager.js';
1819
import * as EmulationModel from '../../../models/emulation/emulation.js';
1920
import * as LiveMetrics from '../../../models/live-metrics/live-metrics.js';
@@ -27,7 +28,6 @@ import type * as Settings from '../../../ui/components/settings/settings.js';
2728
import * as UI from '../../../ui/legacy/legacy.js';
2829
import * as Lit from '../../../ui/lit/lit.js';
2930
import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
30-
import * as MobileThrottling from '../../mobile_throttling/mobile_throttling.js';
3131
import {getThrottlingRecommendations} from '../utils/Helpers.js';
3232

3333
import {md} from './insights/Helpers.js';
@@ -589,7 +589,7 @@ export class LiveMetricsView extends LegacyWrapper.LegacyWrapper.WrappableCompon
589589
return i18nString(UIStrings.tryDisablingThrottling);
590590
}
591591

592-
const conditions = MobileThrottling.ThrottlingPresets.ThrottlingPresets.getRecommendedNetworkPreset(rtt);
592+
const conditions = SDK.NetworkManager.getRecommendedNetworkPreset(rtt);
593593
if (!conditions) {
594594
return null;
595595
}

front_end/panels/timeline/utils/Helpers.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import * as Platform from '../../../core/platform/platform.js';
66
import * as SDK from '../../../core/sdk/sdk.js';
77
import * as CrUXManager from '../../../models/crux-manager/crux-manager.js';
88
import type * as Trace from '../../../models/trace/trace.js';
9-
import * as MobileThrottling from '../../mobile_throttling/mobile_throttling.js';
109

1110
const MAX_ORIGIN_LENGTH = 60;
1211

@@ -24,7 +23,7 @@ export function getThrottlingRecommendations(): {
2423
const response = CrUXManager.CrUXManager.instance().getSelectedFieldMetricData('round_trip_time');
2524
if (response?.percentiles) {
2625
const rtt = Number(response.percentiles.p75);
27-
networkConditions = MobileThrottling.ThrottlingPresets.ThrottlingPresets.getRecommendedNetworkPreset(rtt);
26+
networkConditions = SDK.NetworkManager.getRecommendedNetworkPreset(rtt);
2827
}
2928

3029
return {

0 commit comments

Comments
 (0)