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) } }) }