summaryrefslogtreecommitdiff
path: root/cap/cap_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'cap/cap_test.go')
-rw-r--r--cap/cap_test.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/cap/cap_test.go b/cap/cap_test.go
new file mode 100644
index 0000000..a0151cc
--- /dev/null
+++ b/cap/cap_test.go
@@ -0,0 +1,97 @@
+package cap
+
+import (
+ "fmt"
+ "testing"
+)
+
+func TestString(t *testing.T) {
+ a := CHOWN
+ if got, want := a.String(), "cap_chown"; got != want {
+ t.Fatalf("pretty basic failure: got=%q, want=%q", got, want)
+ }
+}
+
+func TestText(t *testing.T) {
+ vs := []struct {
+ from, to string
+ err error
+ }{
+ {"", "", ErrBadText},
+ {"=", "=", nil},
+ {"= cap_chown+iep cap_chown-i", "= cap_chown+ep", nil},
+ {"= cap_setfcap,cap_chown+iep cap_chown-i", "= cap_setfcap+epi cap_chown+ep", nil},
+ }
+ for i, v := range vs {
+ c, err := FromText(v.from)
+ if err != v.err {
+ t.Errorf("[%d] parsing %q failed: got=%v, want=%v", i, v.from, err, v.err)
+ continue
+ }
+ if err != nil {
+ continue
+ }
+ to := c.String()
+ if to != v.to {
+ t.Errorf("[%d] failed to stringify cap: %q -> got=%q, want=%q", i, v.from, to, v.to)
+ }
+ if d, err := FromText(to); err != nil {
+ t.Errorf("[%d] failed to reparse %q: %v", i, to, err)
+ } else if got := d.String(); got != to {
+ t.Errorf("[%d] failed to stringify %q getting %q", i, to, got)
+ }
+ }
+}
+
+func same(a, b *Set) error {
+ if (a == nil) != (b == nil) {
+ return fmt.Errorf("nil-ness miscompare: %q vs %v", a, b)
+ }
+ if a == nil {
+ return nil
+ }
+ if a.nsRoot != b.nsRoot {
+ return fmt.Errorf("capabilities differ in nsRoot: a=%d b=%d", a.nsRoot, b.nsRoot)
+ }
+ for i, f := range a.flat {
+ g := b.flat[i]
+ for s := Effective; s <= Inheritable; s++ {
+ if got, want := f[s], g[s]; got != want {
+ return fmt.Errorf("capabilities differ: a[%d].flat[%v]=0x%08x b[%d].flat[%v]=0x%08x", i, s, got, i, s, want)
+ }
+ }
+ }
+ return nil
+}
+
+func TestImportExport(t *testing.T) {
+ // Sanity check empty import/export.
+ c := NewSet()
+ if ex, err := c.Export(); err != nil {
+ t.Fatalf("failed to export empty set: %v", err)
+ } else if len(ex) != 5 {
+ t.Fatalf("wrong length: got=%d want=%d", len(ex), 5)
+ } else if im, err := Import(ex); err != nil {
+ t.Fatalf("failed to import empty set: %v", err)
+ } else if got, want := im.String(), c.String(); got != want {
+ t.Fatalf("import != export: got=%q want=%q", got, want)
+ }
+ // Now keep flipping bits on and off and validate that all
+ // forms of import/export work.
+ for i := uint(0); i < 7000; i += 13 {
+ s := Flag(i % 3)
+ v := Value(i % (maxValues + 3))
+ c.SetFlag(s, i&17 < 8, v)
+ if ex, err := c.Export(); err != nil {
+ t.Fatalf("[%d] failed to export empty set: %v", i, err)
+ } else if im, err := Import(ex); err != nil {
+ t.Fatalf("[%d] failed to import empty set: %v", i, err)
+ } else if got, want := im.String(), c.String(); got != want {
+ t.Fatalf("[%d] import != export: got=%q want=%q [%02x]", i, got, want, ex)
+ } else if parsed, err := FromText(got); err != nil {
+ t.Fatalf("[%d] failed to parse %q: %v", i, got, err)
+ } else if err := same(c, parsed); err != nil {
+ t.Fatalf("[%d] miscompare: %v", i, err)
+ }
+ }
+}