Skip to content

Commit 330d5fc

Browse files
jpinzCopilot
andcommitted
Address copilot PR comments. And add new tests for DockerReferenceUtility
Co-authored-by: Copilot <copilot@github.com>
1 parent e1a765a commit 330d5fc

3 files changed

Lines changed: 103 additions & 19 deletions

File tree

docs/detectors/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020

2121
- [Docker Compose](dockercompose.md)
2222

23-
| Detector | Status |
24-
| ------------------------------- | ---------- |
25-
| DockerComposeComponentDetector | DefaultOff |
23+
| Detector | Status |
24+
| ------------------------------ | ---------- |
25+
| DockerComposeComponentDetector | DefaultOff |
2626

2727
- [Dockerfile](dockerfile.md)
2828

src/Microsoft.ComponentDetection.Detectors/dockerfile/DockerfileComponentDetector.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,23 +86,12 @@ private Task ParseDockerFileAsync(string fileContents, string fileLocation, ISin
8686
{
8787
try
8888
{
89-
var instructionKeyword = construct.Type;
90-
DockerReference? baseImage = null;
91-
if (instructionKeyword == ConstructType.Instruction)
89+
var baseImage = construct switch
9290
{
93-
var constructType = construct.GetType().Name;
94-
switch (constructType)
95-
{
96-
case "FromInstruction":
97-
baseImage = this.ParseFromInstruction(construct, escapeChar, stageNameMap);
98-
break;
99-
case "CopyInstruction":
100-
baseImage = this.ParseCopyInstruction(construct, escapeChar, stageNameMap);
101-
break;
102-
default:
103-
break;
104-
}
105-
}
91+
FromInstruction => this.ParseFromInstruction(construct, escapeChar, stageNameMap),
92+
CopyInstruction => this.ParseCopyInstruction(construct, escapeChar, stageNameMap),
93+
_ => null,
94+
};
10695

10796
return baseImage;
10897
}

test/Microsoft.ComponentDetection.Common.Tests/DockerReferenceUtilityTests.cs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ namespace Microsoft.ComponentDetection.Common.Tests;
44
using System;
55
using AwesomeAssertions;
66
using Microsoft.ComponentDetection.Contracts;
7+
using Microsoft.ComponentDetection.Contracts.BcdeModels;
78
using Microsoft.VisualStudio.TestTools.UnitTesting;
9+
using Moq;
810

911
[TestClass]
1012
[TestCategory("Governance/All")]
@@ -268,4 +270,97 @@ public void ParseAll_ParsesFamiliarNames()
268270
result.Should().NotBeNull();
269271
result.Should().BeAssignableTo<RepositoryReference>();
270272
}
273+
274+
[TestMethod]
275+
public void HasUnresolvedVariables_ReturnsTrueForDollarSign()
276+
{
277+
DockerReferenceUtility.HasUnresolvedVariables("${MY_IMAGE}:latest").Should().BeTrue();
278+
}
279+
280+
[TestMethod]
281+
public void HasUnresolvedVariables_ReturnsTrueForBraces()
282+
{
283+
DockerReferenceUtility.HasUnresolvedVariables("{{ .Values.image }}").Should().BeTrue();
284+
}
285+
286+
[TestMethod]
287+
public void HasUnresolvedVariables_ReturnsFalseForPlainReference()
288+
{
289+
DockerReferenceUtility.HasUnresolvedVariables("docker.io/library/nginx:latest").Should().BeFalse();
290+
}
291+
292+
[TestMethod]
293+
public void TryParseImageReference_ReturnsNullForUnresolvedVariables()
294+
{
295+
DockerReferenceUtility.TryParseImageReference("${IMAGE}:latest").Should().BeNull();
296+
}
297+
298+
[TestMethod]
299+
public void TryParseImageReference_ReturnsNullForInvalidReference()
300+
{
301+
DockerReferenceUtility.TryParseImageReference("docker.io/library/Nginx").Should().BeNull();
302+
}
303+
304+
[TestMethod]
305+
public void TryParseImageReference_ReturnsParsedReferenceForValidInput()
306+
{
307+
var result = DockerReferenceUtility.TryParseImageReference("nginx:latest");
308+
309+
result.Should().NotBeNull();
310+
result.Should().BeAssignableTo<TaggedReference>();
311+
}
312+
313+
[TestMethod]
314+
public void TryParseImageReference_ReturnsParsedReferenceForDigest()
315+
{
316+
var digest = $"sha256:{new string('a', 64)}";
317+
var result = DockerReferenceUtility.TryParseImageReference($"nginx@{digest}");
318+
319+
result.Should().NotBeNull();
320+
result.Should().BeAssignableTo<CanonicalReference>();
321+
((CanonicalReference)result).Digest.Should().Be(digest);
322+
}
323+
324+
[TestMethod]
325+
public void TryParseImageReference_ReturnsParsedReferenceForTagAndDigest()
326+
{
327+
var digest = $"sha256:{new string('a', 64)}";
328+
var result = DockerReferenceUtility.TryParseImageReference($"nginx:latest@{digest}");
329+
330+
result.Should().NotBeNull();
331+
result.Should().BeAssignableTo<DualReference>();
332+
var dualRef = (DualReference)result;
333+
dualRef.Tag.Should().Be("latest");
334+
dualRef.Digest.Should().Be(digest);
335+
}
336+
337+
[TestMethod]
338+
public void TryRegisterImageReference_RegistersValidReference()
339+
{
340+
var recorder = new Mock<ISingleFileComponentRecorder>();
341+
342+
DockerReferenceUtility.TryRegisterImageReference("nginx:latest", recorder.Object);
343+
344+
recorder.Verify(r => r.RegisterUsage(It.IsAny<DetectedComponent>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<bool?>(), It.IsAny<DependencyScope?>(), It.IsAny<string>()), Times.Once);
345+
}
346+
347+
[TestMethod]
348+
public void TryRegisterImageReference_SkipsUnresolvedVariables()
349+
{
350+
var recorder = new Mock<ISingleFileComponentRecorder>();
351+
352+
DockerReferenceUtility.TryRegisterImageReference("${IMAGE}", recorder.Object);
353+
354+
recorder.Verify(r => r.RegisterUsage(It.IsAny<DetectedComponent>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<bool?>(), It.IsAny<DependencyScope?>(), It.IsAny<string>()), Times.Never);
355+
}
356+
357+
[TestMethod]
358+
public void TryRegisterImageReference_SkipsInvalidReference()
359+
{
360+
var recorder = new Mock<ISingleFileComponentRecorder>();
361+
362+
DockerReferenceUtility.TryRegisterImageReference("docker.io/library/Nginx", recorder.Object);
363+
364+
recorder.Verify(r => r.RegisterUsage(It.IsAny<DetectedComponent>(), It.IsAny<bool>(), It.IsAny<string>(), It.IsAny<bool?>(), It.IsAny<DependencyScope?>(), It.IsAny<string>()), Times.Never);
365+
}
271366
}

0 commit comments

Comments
 (0)