Skip to content

Instead of using the first cimClass and then having no superClass, use the first cimClass that has a non-null superClass #1200

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Rules/UseIdenticalMandatoryParametersDSC.cs
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ private IDictionary<string, string> GetKeys(string fileName)
// todo log the error
}

var cimClass = cimClasses?.FirstOrDefault();
var cimClass = cimClasses?.FirstOrDefault(_cimClass => _cimClass.CimSuperClass != null);
var cimSuperClassProperties = new HashSet<string>(
cimClass?.CimSuperClass?.CimClassProperties.Select(cimPropertyDeclaration => cimPropertyDeclaration.Name) ??
Enumerable.Empty<string>());
Expand Down
54 changes: 54 additions & 0 deletions Tests/Rules/UseIdenticalMandatoryParametersForDSC.tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,60 @@ class ClassWithNoParent
{
[Write] Boolean Anonymous;
};
"@

# Act - run scriptanalyzer
$violations = Invoke-ScriptAnalyzer -Path $noParentClassFilepath -IncludeRule $ruleName -ErrorAction Stop
$violations.Count | Should -Be 0
}
}

Context "When a CIM class has no parent, but does contain a subclass which should not be processed" {
# regression test for #1192 - just check no uncaught exception
It "Should find no violations, and throw no exceptions" -Skip:($IsLinux -or $IsMacOS) {

# Arrange test content in testdrive
$dscResources = Join-Path -Path "TestDrive:" -ChildPath "DSCResources"
$noparentClassDir = Join-Path -Path $dscResources "ClassWithNoParent"

# need a fake module
$fakeModulePath = Join-Path -Path "TestDrive:" -ChildPath "test.psd1"
Set-Content -Path $fakeModulePath -Value @"
@{
ModuleVersion = '1.0'
GUID = 'fe2acc06-d9e6-4ca6-b57d-068e8fc5ad57'
Author = 'DummyAuthor'
}
"@
# and under it a directory called dscresources\something
New-Item -ItemType Directory -Path $noParentClassDir
$noparentClassFilepath = Join-Path -Path $noParentClassDir -ChildPath 'MSFT_ClassWithNoParent.psm1'
$noparentClassMofFilepath = Join-Path -Path $noParentClassDir -ChildPath 'MSFT_ClassWithNoParent.schema.mof'

# containing a .psm1 file and a .schema.mof file with same base name
Set-Content -Path $noParentClassFilepath -Value @"
#requires -Version 4.0 -Modules CimCmdlets
function Get-TargetResource { }
function Set-TargetResource { }
function Test-TargetResource { }
Export-ModuleMember -Function *-TargetResource
"@

Set-Content -Path $noParentClassMofFilePath -Value @"
[ClassVersion("1.0.0.0")]
Class MSFT_SubClass
{
[Key, Description("Key of the subclass")] String Name;
[Required, Description("Required parameter of the subclass")] String Description;
[Write, Description("Additional non-required parameter")] Boolean Enabled;
};

[ClassVersion("1.0.0"), FriendlyName("ClassWithNoParent")]
class MSFT_ClassWithNoParent : OMI_BaseResource
{
[write, Description("dummy subclass variable"), EmbeddedInstance("MSFT_SubClass")]
string Subclass;
};
"@

# Act - run scriptanalyzer
Expand Down