| package daemon |
| |
| import ( |
| "path/filepath" |
| "testing" |
| |
| "github.com/docker/docker/api/types/mount" |
| ) |
| |
| func TestBindDaemonRoot(t *testing.T) { |
| t.Parallel() |
| d := &Daemon{root: "/a/b/c/daemon"} |
| for _, test := range []struct { |
| desc string |
| opts *mount.BindOptions |
| needsProp bool |
| err bool |
| }{ |
| {desc: "nil propagation settings", opts: nil, needsProp: true, err: false}, |
| {desc: "empty propagation settings", opts: &mount.BindOptions{}, needsProp: true, err: false}, |
| {desc: "private propagation", opts: &mount.BindOptions{Propagation: mount.PropagationPrivate}, err: true}, |
| {desc: "rprivate propagation", opts: &mount.BindOptions{Propagation: mount.PropagationRPrivate}, err: true}, |
| {desc: "slave propagation", opts: &mount.BindOptions{Propagation: mount.PropagationSlave}, err: true}, |
| {desc: "rslave propagation", opts: &mount.BindOptions{Propagation: mount.PropagationRSlave}, err: false, needsProp: false}, |
| {desc: "shared propagation", opts: &mount.BindOptions{Propagation: mount.PropagationShared}, err: true}, |
| {desc: "rshared propagation", opts: &mount.BindOptions{Propagation: mount.PropagationRSlave}, err: false, needsProp: false}, |
| } { |
| t.Run(test.desc, func(t *testing.T) { |
| test := test |
| for desc, source := range map[string]string{ |
| "source is root": d.root, |
| "source is subpath": filepath.Join(d.root, "a", "b"), |
| "source is parent": filepath.Dir(d.root), |
| "source is /": "/", |
| } { |
| t.Run(desc, func(t *testing.T) { |
| mount := mount.Mount{ |
| Type: mount.TypeBind, |
| Source: source, |
| BindOptions: test.opts, |
| } |
| needsProp, err := d.validateBindDaemonRoot(mount) |
| if (err != nil) != test.err { |
| t.Fatalf("expected err=%v, got: %v", test.err, err) |
| } |
| if test.err { |
| return |
| } |
| if test.needsProp != needsProp { |
| t.Fatalf("expected needsProp=%v, got: %v", test.needsProp, needsProp) |
| } |
| }) |
| } |
| }) |
| } |
| } |