Skip to content

Commit 2392e7e

Browse files
committed
oval: add additional test types
Red Hat recently started using additional test types in their oval database. These changes allow the new database to be walked again.
1 parent c7c9481 commit 2392e7e

File tree

7 files changed

+35759
-9
lines changed

7 files changed

+35759
-9
lines changed

oval/rpminfo.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@ type RPMInfoTest struct {
1515
StateRefs []StateRef `xml:"state"`
1616
}
1717

18+
// RPMVerifyFileTest : >tests>rpmverifyfile_test
19+
type RPMVerifyFileTest struct {
20+
XMLName xml.Name `xml:"rpmverifyfile_test"`
21+
ID string `xml:"id,attr"`
22+
Comment string `xml:"comment,attr"`
23+
Check string `xml:"check,attr"`
24+
Version int `xml:"version,attr"`
25+
ObjectRefs []ObjectRef `xml:"object"`
26+
StateRefs []StateRef `xml:"state"`
27+
}
28+
1829
// RPMInfoObject : >objects>RPMInfo_object
1930
type RPMInfoObject struct {
2031
XMLName xml.Name `xml:"rpminfo_object"`

oval/rpminfo_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,49 @@ func TestLookupRPMIntoObject(t *testing.T) {
3636
}
3737
}
3838
}
39+
40+
func TestLookupRPMTest(t *testing.T) {
41+
var tt = []struct{ Kind, Ref, Name string }{
42+
{"rpmverifyfile_test", "oval:com.redhat.rhsa:tst:20190966006", "Red Hat Enterprise Linux must be installed"},
43+
{"uname_test", "oval:com.redhat.rhsa:tst:20191167051", "kernel earlier than 0:4.18.0-80.1.2.el8_0 is currently running"},
44+
{"textfilecontent54_test", "oval:com.redhat.rhsa:tst:20191167052", "kernel earlier than 0:4.18.0-80.1.2.el8_0 is set to boot up on next boot"},
45+
}
46+
f, err := os.Open("../testdata/com.redhat.rhsa-RHEL8.xml")
47+
if err != nil {
48+
t.Fatal(err)
49+
}
50+
defer f.Close()
51+
var root Root
52+
if err := xml.NewDecoder(f).Decode(&root); err != nil {
53+
t.Fatal(err)
54+
}
55+
for _, tc := range tt {
56+
kind, i, err := root.Tests.Lookup(tc.Ref)
57+
if err != nil {
58+
t.Error(err)
59+
}
60+
if got, want := kind, tc.Kind; got != want {
61+
t.Errorf("got: %q, want %q", got, want)
62+
}
63+
var name string
64+
switch kind {
65+
case "rpmverifyfile_test":
66+
obj := &root.Tests.RPMVerifyFileTests[i]
67+
name = obj.Comment
68+
t.Logf("%s: %s (%#+v)", tc.Ref, obj.Comment, obj)
69+
case "uname_test":
70+
obj := &root.Tests.UnameTests[i]
71+
name = obj.Comment
72+
t.Logf("%s: %s (%#+v)", tc.Ref, obj.Comment, obj)
73+
case "textfilecontent54_test":
74+
obj := &root.Tests.TextfileContent54Tests[i]
75+
name = obj.Comment
76+
t.Logf("%s: %s (%#+v)", tc.Ref, obj.Comment, obj)
77+
default:
78+
t.Fatalf("unknown test kind %q", kind)
79+
}
80+
if got, want := name, tc.Name; got != want {
81+
t.Fatalf("got: %q, want: %q", got, want)
82+
}
83+
}
84+
}

oval/tests.go

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
// Init sets up the memoization maps.
99
func (t *Tests) init() {
1010
var wg sync.WaitGroup
11-
wg.Add(3)
11+
wg.Add(6)
1212

1313
go func() {
1414
defer wg.Done()
@@ -34,6 +34,30 @@ func (t *Tests) init() {
3434
}
3535
}()
3636

37+
go func() {
38+
defer wg.Done()
39+
t.rpmverifyfileMemo = make(map[string]int, len(t.RPMVerifyFileTests))
40+
for i, v := range t.RPMVerifyFileTests {
41+
t.rpmverifyfileMemo[v.ID] = i
42+
}
43+
}()
44+
45+
go func() {
46+
defer wg.Done()
47+
t.unameMemo = make(map[string]int, len(t.UnameTests))
48+
for i, v := range t.UnameTests {
49+
t.unameMemo[v.ID] = i
50+
}
51+
}()
52+
53+
go func() {
54+
defer wg.Done()
55+
t.textfilecontent54Memo = make(map[string]int, len(t.TextfileContent54Tests))
56+
for i, v := range t.TextfileContent54Tests {
57+
t.textfilecontent54Memo[v.ID] = i
58+
}
59+
}()
60+
3761
wg.Wait()
3862
}
3963

@@ -52,6 +76,15 @@ func (t *Tests) Lookup(ref string) (kind string, index int, err error) {
5276
if i, ok := t.rpminfoMemo[ref]; ok {
5377
return t.RPMInfoTests[i].XMLName.Local, i, nil
5478
}
79+
if i, ok := t.rpmverifyfileMemo[ref]; ok {
80+
return t.RPMVerifyFileTests[i].XMLName.Local, i, nil
81+
}
82+
if i, ok := t.unameMemo[ref]; ok {
83+
return t.UnameTests[i].XMLName.Local, i, nil
84+
}
85+
if i, ok := t.textfilecontent54Memo[ref]; ok {
86+
return t.TextfileContent54Tests[i].XMLName.Local, i, nil
87+
}
5588

5689
// We didn't find it, maybe we can say why.
5790
id, err := ParseID(ref)

oval/textfilecontent54.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package oval
2+
3+
import "encoding/xml"
4+
5+
// TextfileContent54Test : >tests>textfilecontent54_test
6+
type TextfileContent54Test struct {
7+
XMLName xml.Name `xml:"textfilecontent54_test"`
8+
ID string `xml:"id,attr"`
9+
StateOperator string `xml:"state_operator,attr"`
10+
ObjectRefs []ObjectRef `xml:"object"`
11+
StateRefs []StateRef `xml:"state"`
12+
Comment string `xml:"comment,attr"`
13+
}

oval/types.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,20 @@ type Debian struct {
147147

148148
// Tests : >tests
149149
type Tests struct {
150-
once sync.Once
151-
XMLName xml.Name `xml:"tests"`
152-
LineTests []LineTest `xml:"line_test"`
153-
Version55Tests []Version55Test `xml:"version55_test"`
154-
RPMInfoTests []RPMInfoTest `xml:"rpminfo_test"`
155-
lineMemo map[string]int
156-
version55Memo map[string]int
157-
rpminfoMemo map[string]int
150+
once sync.Once
151+
XMLName xml.Name `xml:"tests"`
152+
LineTests []LineTest `xml:"line_test"`
153+
Version55Tests []Version55Test `xml:"version55_test"`
154+
RPMInfoTests []RPMInfoTest `xml:"rpminfo_test"`
155+
RPMVerifyFileTests []RPMVerifyFileTest `xml:"rpmverifyfile_test"`
156+
UnameTests []UnameTest `xml:"uname_test"`
157+
TextfileContent54Tests []TextfileContent54Test `xml:"textfilecontent54_test"`
158+
lineMemo map[string]int
159+
version55Memo map[string]int
160+
rpminfoMemo map[string]int
161+
rpmverifyfileMemo map[string]int
162+
unameMemo map[string]int
163+
textfilecontent54Memo map[string]int
158164
}
159165

160166
// ObjectRef : >tests>line_test>object-object_ref

oval/uname.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package oval
2+
3+
import "encoding/xml"
4+
5+
// UnameTest : >tests>uname_test
6+
type UnameTest struct {
7+
XMLName xml.Name `xml:"uname_test"`
8+
ID string `xml:"id,attr"`
9+
Comment string `xml:"comment,attr"`
10+
Check string `xml:"check,attr"`
11+
Version int `xml:"version,attr"`
12+
ObjectRefs []ObjectRef `xml:"object"`
13+
StateRefs []StateRef `xml:"state"`
14+
}

0 commit comments

Comments
 (0)