Skip to content

Commit 612af46

Browse files
committed
Update LinuxApplicationLayerExperiment control group
1 parent 0071e78 commit 612af46

File tree

2 files changed

+77
-76
lines changed

2 files changed

+77
-76
lines changed

src/Microsoft.ComponentDetection.Orchestrator/Experiments/Configs/LinuxApplicationLayerExperiment.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ namespace Microsoft.ComponentDetection.Orchestrator.Experiments.Configs;
99
/// <summary>
1010
/// Experiment to validate the <see cref="LinuxApplicationLayerDetector"/> which captures application-level
1111
/// packages in addition to system packages from Linux containers.
12-
/// Control group includes the standard file-based npm and pip detectors plus the Linux system package detector.
13-
/// Experiment group uses container-based detection for all package types together.
12+
/// Control group uses file-based detectors plus LinuxContainerDetector (system packages only).
13+
/// Experiment group uses file-based detectors plus LinuxApplicationLayerDetector (system + application packages).
14+
/// The diff reveals net-new application packages found only inside containers (e.g., RUN npm add lodash),
15+
/// excluding both manifest-detected components (canceled by file-based detectors) and system packages
16+
/// (canceled by LinuxContainerDetector).
1417
/// </summary>
1518
public class LinuxApplicationLayerExperiment : IExperimentConfiguration
1619
{
@@ -30,20 +33,25 @@ or NuGetProjectModelProjectCentricComponentDetector
3033

3134
/// <inheritdoc />
3235
public bool IsInExperimentGroup(IComponentDetector componentDetector) =>
33-
componentDetector is LinuxApplicationLayerDetector;
36+
componentDetector
37+
is LinuxApplicationLayerDetector
38+
or NpmComponentDetector
39+
or NpmLockfileDetectorBase
40+
or PipReportComponentDetector
41+
or NuGetComponentDetector
42+
or NuGetProjectModelProjectCentricComponentDetector
43+
or NuGetPackagesConfigDetector;
3444

3545
/// <inheritdoc />
3646
public bool ShouldRecord(IComponentDetector componentDetector, int numComponents)
3747
{
38-
// Only record telemetry if the experiment group detector (LinuxApplicationLayerDetector)
39-
// actually found components.
40-
if (componentDetector is LinuxApplicationLayerDetector)
48+
// Only record telemetry if a Linux container detector found components,
49+
// indicating containers were detected and scanned.
50+
if (componentDetector is LinuxContainerDetector)
4151
{
4252
return numComponents > 0;
4353
}
4454

45-
// For control group detectors, record if the experiment group found anything
46-
// This will be determined by the orchestrator based on whether the experiment group had components
4755
return true;
4856
}
4957
}

test/Microsoft.ComponentDetection.Orchestrator.Tests/Experiments/LinuxApplicationLayerExperimentTests.cs

Lines changed: 61 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -22,50 +22,17 @@ public void IsInControlGroup_LinuxContainerDetector_ReturnsTrue()
2222
}
2323

2424
[TestMethod]
25-
public void IsInControlGroup_NpmComponentDetector_ReturnsTrue()
25+
public void IsInControlGroup_FileBasedDetectors_ReturnsTrue()
2626
{
2727
var npmDetector = new NpmComponentDetector(null, null, null);
2828
this.experiment.IsInControlGroup(npmDetector).Should().BeTrue();
29-
}
3029

31-
[TestMethod]
32-
public void IsInControlGroup_NpmLockfile3Detector_ReturnsTrue()
33-
{
3430
var npmLockfile3Detector = new NpmLockfile3Detector(null, null, null, null);
3531
this.experiment.IsInControlGroup(npmLockfile3Detector).Should().BeTrue();
36-
}
3732

38-
[TestMethod]
39-
public void IsInControlGroup_NpmComponentDetectorWithRoots_ReturnsTrue()
40-
{
4133
var npmDetectorWithRoots = new NpmComponentDetectorWithRoots(null, null, null, null);
4234
this.experiment.IsInControlGroup(npmDetectorWithRoots).Should().BeTrue();
43-
}
44-
45-
[TestMethod]
46-
public void IsInControlGroup_NuGetComponentDetector_ReturnsTrue()
47-
{
48-
var nuGetDetector = new NuGetComponentDetector(null, null, null);
49-
this.experiment.IsInControlGroup(nuGetDetector).Should().BeTrue();
50-
}
5135

52-
[TestMethod]
53-
public void IsInControlGroup_NuGetProjectModelProjectCentricComponentDetector_ReturnsTrue()
54-
{
55-
var nuGetDetector = new NuGetProjectModelProjectCentricComponentDetector(null, null, null, null);
56-
this.experiment.IsInControlGroup(nuGetDetector).Should().BeTrue();
57-
}
58-
59-
[TestMethod]
60-
public void IsInControlGroup_NuGetPackagesConfigDetector_ReturnsTrue()
61-
{
62-
var nuGetPackagesConfigDetector = new NuGetPackagesConfigDetector(null, null, null);
63-
this.experiment.IsInControlGroup(nuGetPackagesConfigDetector).Should().BeTrue();
64-
}
65-
66-
[TestMethod]
67-
public void IsInControlGroup_PipReportComponentDetector_ReturnsTrue()
68-
{
6936
var pipDetector = new PipReportComponentDetector(
7037
null,
7138
null,
@@ -77,8 +44,21 @@ public void IsInControlGroup_PipReportComponentDetector_ReturnsTrue()
7744
null,
7845
null
7946
);
80-
8147
this.experiment.IsInControlGroup(pipDetector).Should().BeTrue();
48+
49+
var nuGetDetector = new NuGetComponentDetector(null, null, null);
50+
this.experiment.IsInControlGroup(nuGetDetector).Should().BeTrue();
51+
52+
var nuGetProjectCentricDetector = new NuGetProjectModelProjectCentricComponentDetector(
53+
null,
54+
null,
55+
null,
56+
null
57+
);
58+
this.experiment.IsInControlGroup(nuGetProjectCentricDetector).Should().BeTrue();
59+
60+
var nuGetPackagesConfigDetector = new NuGetPackagesConfigDetector(null, null, null);
61+
this.experiment.IsInControlGroup(nuGetPackagesConfigDetector).Should().BeTrue();
8262
}
8363

8464
[TestMethod]
@@ -103,29 +83,17 @@ public void IsInExperimentGroup_LinuxContainerDetector_ReturnsFalse()
10383
}
10484

10585
[TestMethod]
106-
public void IsInExperimentGroup_NpmComponentDetector_ReturnsFalse()
86+
public void IsInExperimentGroup_FileBasedDetectors_ReturnsTrue()
10787
{
10888
var npmDetector = new NpmComponentDetector(null, null, null);
109-
this.experiment.IsInExperimentGroup(npmDetector).Should().BeFalse();
110-
}
89+
this.experiment.IsInExperimentGroup(npmDetector).Should().BeTrue();
11190

112-
[TestMethod]
113-
public void IsInExperimentGroup_NpmLockfile3Detector_ReturnsFalse()
114-
{
11591
var npmLockfile3Detector = new NpmLockfile3Detector(null, null, null, null);
116-
this.experiment.IsInExperimentGroup(npmLockfile3Detector).Should().BeFalse();
117-
}
92+
this.experiment.IsInExperimentGroup(npmLockfile3Detector).Should().BeTrue();
11893

119-
[TestMethod]
120-
public void IsInExperimentGroup_NpmComponentDetectorWithRoots_ReturnsFalse()
121-
{
12294
var npmDetectorWithRoots = new NpmComponentDetectorWithRoots(null, null, null, null);
123-
this.experiment.IsInExperimentGroup(npmDetectorWithRoots).Should().BeFalse();
124-
}
95+
this.experiment.IsInExperimentGroup(npmDetectorWithRoots).Should().BeTrue();
12596

126-
[TestMethod]
127-
public void IsInExperimentGroup_PipReportComponentDetector_ReturnsFalse()
128-
{
12997
var pipDetector = new PipReportComponentDetector(
13098
null,
13199
null,
@@ -137,22 +105,21 @@ public void IsInExperimentGroup_PipReportComponentDetector_ReturnsFalse()
137105
null,
138106
null
139107
);
108+
this.experiment.IsInExperimentGroup(pipDetector).Should().BeTrue();
140109

141-
this.experiment.IsInExperimentGroup(pipDetector).Should().BeFalse();
142-
}
143-
144-
[TestMethod]
145-
public void IsInExperimentGroup_NuGetComponentDetector_ReturnsFalse()
146-
{
147110
var nuGetDetector = new NuGetComponentDetector(null, null, null);
148-
this.experiment.IsInExperimentGroup(nuGetDetector).Should().BeFalse();
149-
}
111+
this.experiment.IsInExperimentGroup(nuGetDetector).Should().BeTrue();
150112

151-
[TestMethod]
152-
public void IsInExperimentGroup_NuGetProjectModelProjectCentricComponentDetector_ReturnsFalse()
153-
{
154-
var nuGetDetector = new NuGetProjectModelProjectCentricComponentDetector(null, null, null, null);
155-
this.experiment.IsInExperimentGroup(nuGetDetector).Should().BeFalse();
113+
var nuGetProjectCentricDetector = new NuGetProjectModelProjectCentricComponentDetector(
114+
null,
115+
null,
116+
null,
117+
null
118+
);
119+
this.experiment.IsInExperimentGroup(nuGetProjectCentricDetector).Should().BeTrue();
120+
121+
var nuGetPackagesConfigDetector = new NuGetPackagesConfigDetector(null, null, null);
122+
this.experiment.IsInExperimentGroup(nuGetPackagesConfigDetector).Should().BeTrue();
156123
}
157124

158125
[TestMethod]
@@ -170,21 +137,47 @@ public void ShouldRecord_ExperimentGroup_ReturnsFalse_WhenNumComponentsIsZero()
170137
}
171138

172139
[TestMethod]
173-
public void ShouldRecord_ControlGroup_AlwaysReturnsTrue()
140+
public void ShouldRecord_ControlGroup_ReturnsTrue_WhenNumComponentsGreaterThanZero()
174141
{
175142
var linuxDetector = new LinuxContainerDetector(null, null, null);
176-
this.experiment.ShouldRecord(linuxDetector, 0).Should().BeTrue();
143+
this.experiment.ShouldRecord(linuxDetector, 1).Should().BeTrue();
144+
}
177145

146+
[TestMethod]
147+
public void ShouldRecord_ControlGroup_ReturnsFalse_WhenNumComponentsIsZero()
148+
{
149+
var linuxDetector = new LinuxContainerDetector(null, null, null);
150+
this.experiment.ShouldRecord(linuxDetector, 0).Should().BeFalse();
151+
}
152+
153+
[TestMethod]
154+
public void ShouldRecord_FileBasedDetectors_AlwaysReturnsTrue()
155+
{
178156
var npmDetector = new NpmComponentDetector(null, null, null);
179157
this.experiment.ShouldRecord(npmDetector, 0).Should().BeTrue();
180158

181-
var pipDetector = new PipReportComponentDetector(null, null, null, null, null, null, null, null, null);
159+
var pipDetector = new PipReportComponentDetector(
160+
null,
161+
null,
162+
null,
163+
null,
164+
null,
165+
null,
166+
null,
167+
null,
168+
null
169+
);
182170
this.experiment.ShouldRecord(pipDetector, 0).Should().BeTrue();
183171

184172
var nuGetDetector = new NuGetComponentDetector(null, null, null);
185173
this.experiment.ShouldRecord(nuGetDetector, 0).Should().BeTrue();
186174

187-
var nuGetProjectCentricDetector = new NuGetProjectModelProjectCentricComponentDetector(null, null, null, null);
175+
var nuGetProjectCentricDetector = new NuGetProjectModelProjectCentricComponentDetector(
176+
null,
177+
null,
178+
null,
179+
null
180+
);
188181
this.experiment.ShouldRecord(nuGetProjectCentricDetector, 0).Should().BeTrue();
189182

190183
var nuGetPackagesConfigDetector = new NuGetPackagesConfigDetector(null, null, null);

0 commit comments

Comments
 (0)