package oval
import (
"strings"
"testing"
"github.com/fleetdm/fleet/v4/server/fleet"
oval_input "github.com/fleetdm/fleet/v4/server/vulnerabilities/oval/input"
oval_parsed "github.com/fleetdm/fleet/v4/server/vulnerabilities/oval/parsed"
"github.com/stretchr/testify/require"
)
func TestOvalParser(t *testing.T) {
ubuntuOvalXml := `
5390-1 -- Linux kernel vulnerabilities
Ubuntu 22.04 LTS
Some long description
High
5429-1 -- Bind vulnerability
Ubuntu 22.04 LTS
Some desc
Medium
USN-5544-1 -- Linux kernel vulnerabilities
Ubuntu 22.04 LTS
Some long description
High
CVE-2022-1652
CVE-2022-1679
CVE-2022-28893
CVE-2022-34918
oval:com.ubuntu.jammy:var:554410000000
0:3.0.2-0ubuntu1.1
1:9.18.1-1ubuntu1.1
5.15.0-\d+(-generic|-generic-64k|-generic-lpae|-lowlatency|-lowlatency-64k)
0:5.15.0-43
libssl-dev
openssl
libssl-doc
libssl3
dnsutils
bind9-libs
bind9utils
bind9-dev
bind9-doc
bind9-utils
bind9
bind9-dnsutils
bind9-host
`
rhelOvalXML := `
Red Hat OVAL Patch Definition Merger
3
5.10
2022-06-04T02:29:15
1654309755
RHSA-2022:4584: zlib security update (Important)
Red Hat Enterprise Linux 9
Important
Copyright 2022 Red Hat, Inc.
CVE-2018-25032
CVE-2018-25032 zlib: A flaw found in zlib when compressing (not decompressing) certain inputs
cpe:/a:redhat:enterprise_linux:9
cpe:/a:redhat:enterprise_linux:9::appstream
cpe:/a:redhat:enterprise_linux:9::crb
cpe:/o:redhat:enterprise_linux:9
cpe:/o:redhat:enterprise_linux:9::baseos
/etc/redhat-release
zlib
zlib-devel
zlib-static
^redhat-release
^redhat-release
^7[^\d]
aarch64|i686|ppc64le|s390x|x86_64
0:1.2.11-31.el9_0.1
199e2f91fd431d51
`
t.Run("#parseUbuntuXML", func(t *testing.T) {
r := strings.NewReader(ubuntuOvalXml)
result, err := parseUbuntuXML(r)
require.NoError(t, err)
require.Equal(t, result.Definitions[0].Id, "oval:com.ubuntu.jammy:def:53901000000")
require.Equal(t, result.Definitions[1].Id, "oval:com.ubuntu.jammy:def:54291000000")
require.ElementsMatch(t, result.Definitions[0].Vulnerabilities, []oval_input.ReferenceXML{
{Id: "USN-5390-1"},
{Id: "CVE-2022-1015"},
{Id: "CVE-2022-1016"},
{Id: "CVE-2022-26490"},
})
require.ElementsMatch(t, result.Definitions[1].Vulnerabilities, []oval_input.ReferenceXML{
{Id: "USN-5429-1"},
{Id: "CVE-2022-1183"},
})
require.Equal(t, result.Definitions[0].Criteria.Operator, "OR")
require.Equal(t, result.Definitions[0].Criteria.Criteriums[0].TestId, "oval:com.ubuntu.jammy:tst:540210000000")
require.Equal(t, result.Definitions[1].Criteria.Operator, "OR")
require.Equal(t, result.Definitions[1].Criteria.Criteriums[0].TestId, "oval:com.ubuntu.jammy:tst:542910000000")
firstTest := result.DpkgInfoTests[0]
require.Equal(t, firstTest.Id, "oval:com.ubuntu.jammy:tst:540210000000")
require.Equal(t, firstTest.CheckExistence, "at_least_one_exists")
require.Equal(t, firstTest.Check, "at least one")
require.Empty(t, firstTest.StateOperator)
require.Equal(t, firstTest.Object.Id, "oval:com.ubuntu.jammy:obj:540210000000")
require.Len(t, firstTest.States, 1)
require.Equal(t, firstTest.States[0].Id, "oval:com.ubuntu.jammy:ste:540210000000")
secondTest := result.DpkgInfoTests[1]
require.Equal(t, secondTest.Id, "oval:com.ubuntu.jammy:tst:542910000000")
require.Equal(t, secondTest.CheckExistence, "at_least_one_exists")
require.Equal(t, secondTest.Check, "at least one")
require.Empty(t, secondTest.StateOperator)
require.Equal(t, secondTest.Object.Id, "oval:com.ubuntu.jammy:obj:542910000000")
require.Len(t, secondTest.States, 1)
require.Equal(t, secondTest.States[0].Id, "oval:com.ubuntu.jammy:ste:542910000000")
firstObject := result.DpkgInfoObjects[0]
require.Equal(t, firstObject.Id, "oval:com.ubuntu.jammy:obj:540210000000")
require.Equal(t, firstObject.Name.VarRef, "oval:com.ubuntu.jammy:var:540210000000")
require.Empty(t, firstObject.Name.Value)
require.Equal(t, firstObject.Name.VarCheck, "at least one")
secondObject := result.DpkgInfoObjects[1]
require.Equal(t, secondObject.Id, "oval:com.ubuntu.jammy:obj:542910000000")
require.Equal(t, secondObject.Name.VarRef, "oval:com.ubuntu.jammy:var:542910000000")
require.Empty(t, secondObject.Name.Value)
require.Equal(t, secondObject.Name.VarCheck, "at least one")
firstState := result.DpkgInfoStates[0]
require.Equal(t, firstState.Id, "oval:com.ubuntu.jammy:ste:540210000000")
require.Nil(t, firstState.Arch)
require.Nil(t, firstState.Epoch)
require.Nil(t, firstState.Name)
require.Nil(t, firstState.Release)
require.Nil(t, firstState.Version)
require.Equal(t, firstState.Evr.Value, "0:3.0.2-0ubuntu1.1")
require.Equal(t, firstState.Evr.Op, "less than")
secondState := result.DpkgInfoStates[1]
require.Equal(t, secondState.Id, "oval:com.ubuntu.jammy:ste:542910000000")
require.Nil(t, secondState.Arch)
require.Nil(t, secondState.Epoch)
require.Nil(t, secondState.Name)
require.Nil(t, secondState.Release)
require.Nil(t, secondState.Version)
require.Equal(t, secondState.Evr.Value, "1:9.18.1-1ubuntu1.1")
require.Equal(t, secondState.Evr.Op, "less than")
expectedVariables := map[string]oval_input.ConstantVariableXML{
"oval:com.ubuntu.jammy:var:540210000000": {
Id: "oval:com.ubuntu.jammy:var:540210000000",
DataType: "string",
Values: []string{
"libssl-dev",
"openssl",
"libssl-doc",
"libssl3",
},
},
"oval:com.ubuntu.jammy:var:542910000000": {
Id: "oval:com.ubuntu.jammy:var:542910000000",
DataType: "string",
Values: []string{
"dnsutils",
"bind9-libs",
"bind9utils",
"bind9-dev",
"bind9-doc",
"bind9-utils",
"bind9",
"bind9-dnsutils",
"bind9-host",
},
},
}
require.Equal(t, result.Variables, expectedVariables)
})
t.Run("#mapToUbuntuResult", func(t *testing.T) {
r := strings.NewReader(ubuntuOvalXml)
xmlResult, err := parseUbuntuXML(r)
require.NoError(t, err)
result, err := mapToUbuntuResult(xmlResult)
require.NoError(t, err)
var expectedVulns []string
for _, d := range xmlResult.Definitions {
for _, v := range d.Vulnerabilities {
expectedVulns = append(expectedVulns, v.Id)
}
}
var actualVulns []string
var actualTestIds []int
for _, d := range result.Definitions {
actualTestIds = append(actualTestIds, d.CollectTestIds()...)
actualVulns = append(actualVulns, d.Vulnerabilities...)
}
require.Equal(t, expectedVulns, actualVulns)
expectedTestIds := []int{540210000000, 542910000000, 554410000000, 554410000010}
require.ElementsMatch(t, expectedTestIds, actualTestIds)
require.Len(t, result.PackageTests, 2)
testOne, ok := result.PackageTests[540210000000]
require.True(t, ok)
require.ElementsMatch(t, testOne.Objects, []string{
"libssl-dev",
"openssl",
"libssl-doc",
"libssl3",
})
testTwo, ok := result.PackageTests[542910000000]
require.True(t, ok)
require.ElementsMatch(t, testTwo.Objects, []string{
"dnsutils",
"bind9-libs",
"bind9utils",
"bind9-dev",
"bind9-doc",
"bind9-utils",
"bind9",
"bind9-dnsutils",
"bind9-host",
})
require.Len(t, result.UnameTests, 2)
matchState := []oval_parsed.ObjectStateString{"pattern match|5.15.0-\\d+(-generic|-generic-64k|-generic-lpae|-lowlatency|-lowlatency-64k)"}
require.ElementsMatch(t, result.UnameTests[554410000000].States, matchState)
variableState := []oval_parsed.ObjectStateString{"less than|0:5.15.0-43"}
require.ElementsMatch(t, result.UnameTests[554410000010].States, variableState)
})
t.Run("#parseRhelXML", func(t *testing.T) {
r := strings.NewReader(rhelOvalXML)
result, err := parseRhelXML(r)
require.NoError(t, err)
require.Equal(t, result.Definitions[0].Id, "oval:com.redhat.rhsa:def:20224584")
require.ElementsMatch(t, result.Definitions[0].Vulnerabilities, []oval_input.ReferenceXML{
{Id: "RHSA-2022:4584"},
{Id: "CVE-2018-25032"},
})
require.Equal(t, result.Definitions[0].Criteria.Operator, "OR")
require.Equal(t, result.Definitions[0].Criteria.Criteriums[0].TestId, "oval:com.redhat.rhsa:tst:20221728048")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Operator, "AND")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criteriums[0].TestId, "oval:com.redhat.rhsa:tst:20221728047")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Operator, "OR")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[0].Operator, "AND")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[0].Criteriums[0].TestId, "oval:com.redhat.rhsa:tst:20224584001")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[0].Criteriums[1].TestId, "oval:com.redhat.rhsa:tst:20224584002")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[1].Operator, "AND")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[1].Criteriums[0].TestId, "oval:com.redhat.rhsa:tst:20224584003")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[1].Criteriums[1].TestId, "oval:com.redhat.rhsa:tst:20224584004")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[2].Operator, "AND")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[2].Criteriums[0].TestId, "oval:com.redhat.rhsa:tst:20224584005")
require.Equal(t, result.Definitions[0].Criteria.Criterias[0].Criterias[0].Criterias[2].Criteriums[1].TestId, "oval:com.redhat.rhsa:tst:20224584006")
require.Len(t, result.RpmVerifyFileTests, 2)
require.Equal(t, result.RpmVerifyFileTests[0].Id, "oval:com.redhat.rhsa:tst:20221728048")
require.Equal(t, result.RpmVerifyFileTests[0].Object.Id, "oval:com.redhat.rhsa:obj:20221728024")
require.Len(t, result.RpmVerifyFileTests[0].States, 1)
require.Equal(t, result.RpmVerifyFileTests[0].States[0].Id, "oval:com.redhat.rhsa:ste:20221728005")
require.Equal(t, result.RpmVerifyFileTests[1].Id, "oval:com.redhat.rhsa:tst:20221728047")
require.Equal(t, result.RpmVerifyFileTests[1].Object.Id, "oval:com.redhat.rhsa:obj:20221728024")
require.Len(t, result.RpmVerifyFileTests[1].States, 1)
require.Equal(t, result.RpmVerifyFileTests[1].States[0].Id, "oval:com.redhat.rhsa:ste:20221728004")
require.Len(t, result.RpmInfoTests, 6)
require.Equal(t, result.RpmInfoTests[0].Id, "oval:com.redhat.rhsa:tst:20224584001")
require.Empty(t, result.RpmInfoTests[0].CheckExistence)
require.Equal(t, result.RpmInfoTests[0].Check, "at least one")
require.Empty(t, result.RpmInfoTests[0].StateOperator)
require.Equal(t, result.RpmInfoTests[0].Object.Id, "oval:com.redhat.rhsa:obj:20224584001")
require.Len(t, result.RpmInfoTests[0].States, 1)
require.Equal(t, result.RpmInfoTests[0].States[0].Id, "oval:com.redhat.rhsa:ste:20224584001")
require.Equal(t, result.RpmInfoTests[1].Id, "oval:com.redhat.rhsa:tst:20224584002")
require.Empty(t, result.RpmInfoTests[1].CheckExistence)
require.Equal(t, result.RpmInfoTests[1].Check, "at least one")
require.Empty(t, result.RpmInfoTests[1].StateOperator)
require.Equal(t, result.RpmInfoTests[1].Object.Id, "oval:com.redhat.rhsa:obj:20224584001")
require.Len(t, result.RpmInfoTests[1].States, 1)
require.Equal(t, result.RpmInfoTests[1].States[0].Id, "oval:com.redhat.rhsa:ste:20221728002")
require.Equal(t, result.RpmInfoTests[2].Id, "oval:com.redhat.rhsa:tst:20224584003")
require.Empty(t, result.RpmInfoTests[2].CheckExistence)
require.Equal(t, result.RpmInfoTests[2].Check, "at least one")
require.Empty(t, result.RpmInfoTests[2].StateOperator)
require.Equal(t, result.RpmInfoTests[2].Object.Id, "oval:com.redhat.rhsa:obj:20224584002")
require.Len(t, result.RpmInfoTests[2].States, 1)
require.Equal(t, result.RpmInfoTests[2].States[0].Id, "oval:com.redhat.rhsa:ste:20224584001")
require.Equal(t, result.RpmInfoTests[3].Id, "oval:com.redhat.rhsa:tst:20224584004")
require.Empty(t, result.RpmInfoTests[3].CheckExistence)
require.Equal(t, result.RpmInfoTests[3].Check, "at least one")
require.Empty(t, result.RpmInfoTests[3].StateOperator)
require.Equal(t, result.RpmInfoTests[3].Object.Id, "oval:com.redhat.rhsa:obj:20224584002")
require.Len(t, result.RpmInfoTests[3].States, 1)
require.Equal(t, result.RpmInfoTests[3].States[0].Id, "oval:com.redhat.rhsa:ste:20221728002")
require.Equal(t, result.RpmInfoTests[4].Id, "oval:com.redhat.rhsa:tst:20224584005")
require.Empty(t, result.RpmInfoTests[4].CheckExistence)
require.Equal(t, result.RpmInfoTests[4].Check, "at least one")
require.Empty(t, result.RpmInfoTests[4].StateOperator)
require.Equal(t, result.RpmInfoTests[4].Object.Id, "oval:com.redhat.rhsa:obj:20224584003")
require.Len(t, result.RpmInfoTests[4].States, 1)
require.Equal(t, result.RpmInfoTests[4].States[0].Id, "oval:com.redhat.rhsa:ste:20224584001")
require.Equal(t, result.RpmInfoTests[5].Id, "oval:com.redhat.rhsa:tst:20224584006")
require.Empty(t, result.RpmInfoTests[5].CheckExistence)
require.Equal(t, result.RpmInfoTests[5].Check, "at least one")
require.Empty(t, result.RpmInfoTests[5].StateOperator)
require.Equal(t, result.RpmInfoTests[5].Object.Id, "oval:com.redhat.rhsa:obj:20224584003")
require.Len(t, result.RpmInfoTests[5].States, 1)
require.Equal(t, result.RpmInfoTests[5].States[0].Id, "oval:com.redhat.rhsa:ste:20221728002")
require.Len(t, result.RpmInfoTestObjects, 3)
require.Equal(t, result.RpmInfoTestObjects[0].Id, "oval:com.redhat.rhsa:obj:20224584001")
require.Equal(t, result.RpmInfoTestObjects[0].Name.Value, "zlib")
require.Empty(t, result.RpmInfoTestObjects[0].Name.VarRef)
require.Empty(t, result.RpmInfoTestObjects[0].Name.VarCheck)
require.Equal(t, result.RpmInfoTestObjects[1].Id, "oval:com.redhat.rhsa:obj:20224584002")
require.Equal(t, result.RpmInfoTestObjects[1].Name.Value, "zlib-devel")
require.Empty(t, result.RpmInfoTestObjects[1].Name.VarRef)
require.Empty(t, result.RpmInfoTestObjects[1].Name.VarCheck)
require.Equal(t, result.RpmInfoTestObjects[2].Id, "oval:com.redhat.rhsa:obj:20224584003")
require.Equal(t, result.RpmInfoTestObjects[2].Name.Value, "zlib-static")
require.Empty(t, result.RpmInfoTestObjects[2].Name.VarRef)
require.Empty(t, result.RpmInfoTestObjects[2].Name.VarCheck)
require.Len(t, result.RpmInfoTestStates, 2)
require.Equal(t, result.RpmInfoTestStates[0].Id, "oval:com.redhat.rhsa:ste:20224584001")
require.NotNil(t, result.RpmInfoTestStates[0].Arch)
require.Equal(t, result.RpmInfoTestStates[0].Arch.Datatype, "string")
require.Equal(t, result.RpmInfoTestStates[0].Arch.Op, "pattern match")
require.Equal(t, result.RpmInfoTestStates[0].Arch.Value, "aarch64|i686|ppc64le|s390x|x86_64")
require.Equal(t, result.RpmInfoTestStates[1].Id, "oval:com.redhat.rhsa:ste:20221728002")
require.NotNil(t, result.RpmInfoTestStates[1].SignatureKeyId)
require.Empty(t, result.RpmInfoTestStates[1].SignatureKeyId.Datatype)
require.Equal(t, result.RpmInfoTestStates[1].SignatureKeyId.Op, "equals")
require.Equal(t, result.RpmInfoTestStates[1].SignatureKeyId.Value, "199e2f91fd431d51")
require.Len(t, result.RpmVerifyFileStates, 2)
require.Equal(t, result.RpmVerifyFileStates[0].Id, "oval:com.redhat.rhsa:ste:20221728005")
require.NotNil(t, result.RpmVerifyFileStates[0].Name)
require.Equal(t, result.RpmVerifyFileStates[0].Name.Op, "pattern match")
require.Empty(t, result.RpmVerifyFileStates[0].Name.Datatype)
require.Equal(t, result.RpmVerifyFileStates[0].Name.Value, "^redhat-release")
require.Equal(t, result.RpmVerifyFileStates[1].Id, "oval:com.redhat.rhsa:ste:20221728004")
require.NotNil(t, result.RpmVerifyFileStates[1].Name)
require.Equal(t, result.RpmVerifyFileStates[1].Name.Op, "pattern match")
require.Equal(t, result.RpmVerifyFileStates[1].Name.Value, "^redhat-release")
require.NotNil(t, result.RpmVerifyFileStates[1].Version)
require.Equal(t, result.RpmVerifyFileStates[1].Version.Op, "pattern match")
require.Equal(t, result.RpmVerifyFileStates[1].Version.Value, `^7[^\d]`)
require.Len(t, result.RpmVerifyFileObjects, 1)
require.Equal(t, result.RpmVerifyFileObjects[0].Id, "oval:com.redhat.rhsa:obj:20221728024")
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoConfigFiles, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoGhostFiles, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoGroup, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoLinkTo, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoMd5, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoMode, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoMtime, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoRev, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoSize, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Behaviors.NoUser, true)
require.Equal(t, result.RpmVerifyFileObjects[0].Name.Op, "pattern match")
require.Empty(t, result.RpmVerifyFileObjects[0].Name.Value)
require.Equal(t, result.RpmVerifyFileObjects[0].Epoch.Op, "pattern match")
require.Empty(t, result.RpmVerifyFileObjects[0].Epoch.Value)
require.Equal(t, result.RpmVerifyFileObjects[0].Version.Op, "pattern match")
require.Empty(t, result.RpmVerifyFileObjects[0].Version.Value)
require.Equal(t, result.RpmVerifyFileObjects[0].Release.Op, "pattern match")
require.Empty(t, result.RpmVerifyFileObjects[0].Arch.Value)
require.Equal(t, result.RpmVerifyFileObjects[0].Arch.Op, "pattern match")
require.Equal(t, result.RpmVerifyFileObjects[0].FilePath.Value, "/etc/redhat-release")
require.Equal(t, result.RpmVerifyFileObjects[0].Arch.Op, "pattern match")
})
t.Run("#mapToRhelResult", func(t *testing.T) {
r := strings.NewReader(rhelOvalXML)
xmlResult, err := parseRhelXML(r)
require.NoError(t, err)
result, err := mapToRhelResult(xmlResult)
require.NoError(t, err)
var expectedVulns []string
for _, d := range xmlResult.Definitions {
for _, v := range d.Vulnerabilities {
expectedVulns = append(expectedVulns, v.Id)
}
}
var actualVulns []string
var actualTestIds []int
for _, d := range result.Definitions {
actualTestIds = append(actualTestIds, d.CollectTestIds()...)
actualVulns = append(actualVulns, d.Vulnerabilities...)
}
require.ElementsMatch(t, actualVulns, expectedVulns)
require.ElementsMatch(t, actualTestIds, []int{
20221728048,
20221728047,
20224584001,
20224584002,
20224584003,
20224584004,
20224584005,
20224584006,
})
require.Len(t, result.RpmInfoTests, 6)
testOne, ok := result.RpmInfoTests[20224584001]
require.True(t, ok)
require.ElementsMatch(t, testOne.Objects, []string{"zlib"})
require.Len(t, testOne.States, 1)
require.NotNil(t, testOne.States[0].Arch)
require.NotNil(t, testOne.States[0].Evr)
require.Equal(t, *testOne.States[0].Arch, oval_parsed.NewObjectStateString("pattern match", "aarch64|i686|ppc64le|s390x|x86_64"))
require.Equal(t, *testOne.States[0].Evr, oval_parsed.NewObjectStateEvrString("less than", "0:1.2.11-31.el9_0.1"))
testTwo, ok := result.RpmInfoTests[20224584002]
require.True(t, ok)
require.ElementsMatch(t, testTwo.Objects, []string{"zlib"})
require.Len(t, testTwo.States, 1)
require.NotNil(t, testTwo.States[0].SignatureKeyId)
require.Equal(t, *testTwo.States[0].SignatureKeyId, oval_parsed.NewObjectStateString("equals", "199e2f91fd431d51"))
testThree, ok := result.RpmInfoTests[20224584003]
require.True(t, ok)
require.ElementsMatch(t, testThree.Objects, []string{"zlib-devel"})
require.Len(t, testThree.States, 1)
require.NotNil(t, testThree.States[0].Arch)
require.NotNil(t, testThree.States[0].Evr)
require.Equal(t, *testThree.States[0].Arch, oval_parsed.NewObjectStateString("pattern match", "aarch64|i686|ppc64le|s390x|x86_64"))
require.Equal(t, *testThree.States[0].Evr, oval_parsed.NewObjectStateEvrString("less than", "0:1.2.11-31.el9_0.1"))
testFour, ok := result.RpmInfoTests[20224584004]
require.True(t, ok)
require.ElementsMatch(t, testFour.Objects, []string{"zlib-devel"})
require.Len(t, testFour.States, 1)
require.NotNil(t, testFour.States[0].SignatureKeyId)
require.Equal(t, *testFour.States[0].SignatureKeyId, oval_parsed.NewObjectStateString("equals", "199e2f91fd431d51"))
testFive, ok := result.RpmInfoTests[20224584005]
require.True(t, ok)
require.ElementsMatch(t, testFive.Objects, []string{"zlib-static"})
require.Len(t, testFive.States, 1)
require.NotNil(t, testFive.States[0].Arch)
require.NotNil(t, testFive.States[0].Evr)
require.Equal(t, *testFive.States[0].Arch, oval_parsed.NewObjectStateString("pattern match", "aarch64|i686|ppc64le|s390x|x86_64"))
require.Equal(t, *testFive.States[0].Evr, oval_parsed.NewObjectStateEvrString("less than", "0:1.2.11-31.el9_0.1"))
testSix, ok := result.RpmInfoTests[20224584006]
require.True(t, ok)
require.ElementsMatch(t, testSix.Objects, []string{"zlib-static"})
require.Len(t, testFour.States, 1)
require.NotNil(t, testFour.States[0].SignatureKeyId)
require.Equal(t, *testFour.States[0].SignatureKeyId, oval_parsed.NewObjectStateString("equals", "199e2f91fd431d51"))
})
t.Run("RHEL OVAL definitions work with RHEL based distros", func(t *testing.T) {
r := strings.NewReader(rhelOvalXML)
xmlResult, err := parseRhelXML(r)
require.NoError(t, err)
result, err := mapToRhelResult(xmlResult)
require.NoError(t, err)
testCases := []fleet.OSVersion{
{
Platform: "rhel",
Name: "CentOS Linux 7.9.2009",
},
{
Platform: "amzn",
Name: "Amazon Linux 2.0.0",
},
{
Platform: "rhel",
Name: "Fedora Linux 19.0.0",
},
{
Platform: "rhel",
Name: "Fedora Linux 20.0.0",
},
{
Platform: "rhel",
Name: "Fedora Linux 21.0.0",
},
}
for _, tCase := range testCases {
rEval, err := result.RpmVerifyFileTests[20221728047].Eval(tCase)
require.NoError(t, err)
require.True(t, rEval, tCase)
}
})
}