Skip to content

Commit 62262a5

Browse files
committed
Add xattr stream package test
Ensure that the selinux header has the right format. The included minimal tar test data contains a file with a selinux header captured via `tar` as a reference. Signed-off-by: Roman Mohr <[email protected]>
1 parent 728fde1 commit 62262a5

File tree

4 files changed

+75
-11
lines changed

4 files changed

+75
-11
lines changed

pkg/xattr/BUILD.bazel

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1-
load("@io_bazel_rules_go//go:def.bzl", "go_library")
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
22

33
go_library(
44
name = "xattr",
55
srcs = ["xattr.go"],
66
importpath = "github.com/rmohr/bazeldnf/pkg/xattr",
77
visibility = ["//visibility:public"],
88
)
9+
10+
go_test(
11+
name = "xattr_test",
12+
srcs = ["xattr_test.go"],
13+
data = glob(["testdata/**"]),
14+
embed = [":xattr"],
15+
deps = ["@com_github_onsi_gomega//:go_default_library"],
16+
)

pkg/xattr/testdata/xattr.tar

10 KB
Binary file not shown.

pkg/xattr/xattr.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func SetSELinuxLabel(pax map[string]string, label string) error {
3737
if label == "" {
3838
return fmt.Errorf("label must not be empty, but got '%s'", label)
3939
}
40-
pax[selinux_header] = fmt.Sprintf("%s\x00", label)
40+
pax[selinux_header] = fmt.Sprintf("%s\x00",label)
4141
return nil
4242
}
4343

@@ -50,15 +50,8 @@ func Apply(reader *tar.Reader, writer *tar.Writer, capabilties map[string][]stri
5050
return err
5151
}
5252

53-
if caps, exists := capabilties[entry.Name]; exists {
54-
if err := AddCapabilities(entry.PAXRecords, caps); err != nil {
55-
return err
56-
}
57-
}
58-
if l, exists := labels[entry.Name]; exists {
59-
if err := SetSELinuxLabel(entry.PAXRecords, l); err != nil {
60-
return err
61-
}
53+
if err := enrichEntry(entry, capabilties, labels); err != nil {
54+
return err
6255
}
6356

6457
entry.Format = tar.FormatPAX
@@ -71,3 +64,21 @@ func Apply(reader *tar.Reader, writer *tar.Writer, capabilties map[string][]stri
7164
}
7265
return nil
7366
}
67+
68+
func enrichEntry(entry *tar.Header, capabilties map[string][]string, labels map[string]string) error {
69+
if entry.PAXRecords == nil {
70+
entry.PAXRecords = map[string]string{}
71+
}
72+
73+
if caps, exists := capabilties[entry.Name]; exists {
74+
if err := AddCapabilities(entry.PAXRecords, caps); err != nil {
75+
return err
76+
}
77+
}
78+
if l, exists := labels[entry.Name]; exists {
79+
if err := SetSELinuxLabel(entry.PAXRecords, l); err != nil {
80+
return err
81+
}
82+
}
83+
return nil
84+
}

pkg/xattr/xattr_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package xattr
2+
3+
import (
4+
"archive/tar"
5+
"fmt"
6+
"io"
7+
"os"
8+
"testing"
9+
10+
. "github.com/onsi/gomega"
11+
)
12+
13+
var g *GomegaWithT
14+
15+
func TestSettingSELinuxLabel(t *testing.T) {
16+
g = NewGomegaWithT(t)
17+
referenceEntry, err := getHeader("blub")
18+
g.Expect(err).ToNot(HaveOccurred())
19+
20+
generatedEntry := &tar.Header{Name: "blub"}
21+
labels := map[string]string{"blub": "unconfined_u:object_r:user_home_t:s0", "somethingelse": "something"}
22+
23+
g.Expect(enrichEntry(generatedEntry, nil, labels)).To(Succeed())
24+
25+
g.Expect(generatedEntry.PAXRecords[selinux_header]).To(Equal(referenceEntry.PAXRecords[selinux_header]))
26+
}
27+
28+
func getHeader(name string) (*tar.Header, error) {
29+
f, err := os.Open("testdata/xattr.tar")
30+
g.Expect(err).ToNot(HaveOccurred())
31+
defer f.Close()
32+
r := tar.NewReader(f)
33+
for {
34+
entry, err := r.Next()
35+
if err == io.EOF {
36+
break
37+
} else if err != nil {
38+
g.Expect(err).ToNot(HaveOccurred())
39+
}
40+
if entry.Name == name {
41+
return entry, nil
42+
}
43+
}
44+
return nil, fmt.Errorf("entry %v does not exist", name)
45+
}

0 commit comments

Comments
 (0)