| package mounts // import "github.com/docker/docker/volume/mounts" |
| |
| import ( |
| "os" |
| "testing" |
| |
| "github.com/docker/docker/api/types/mount" |
| "gotest.tools/v3/assert" |
| is "gotest.tools/v3/assert/cmp" |
| ) |
| |
| type mockFiProvider struct{} |
| |
| func (mockFiProvider) fileInfo(path string) (exists, isDir bool, err error) { |
| dirs := map[string]struct{}{ |
| `c:\`: {}, |
| `c:\windows\`: {}, |
| `c:\windows`: {}, |
| `c:\program files`: {}, |
| `c:\Windows`: {}, |
| `c:\Program Files (x86)`: {}, |
| `\\?\c:\windows\`: {}, |
| } |
| files := map[string]struct{}{ |
| `c:\windows\system32\ntdll.dll`: {}, |
| } |
| if _, ok := dirs[path]; ok { |
| return true, true, nil |
| } |
| if _, ok := files[path]; ok { |
| return true, false, nil |
| } |
| return false, false, nil |
| } |
| |
| // always returns the configured error |
| // this is used to test error handling |
| type mockFiProviderWithError struct{ err error } |
| |
| func (m mockFiProviderWithError) fileInfo(path string) (bool, bool, error) { |
| return false, false, m.err |
| } |
| |
| func TestParseMountSpec(t *testing.T) { |
| testDir, err := os.MkdirTemp("", "test-mount-config") |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer os.RemoveAll(testDir) |
| parser := NewParser() |
| cases := []struct { |
| input mount.Mount |
| expected MountPoint |
| }{ |
| { |
| input: mount.Mount{Type: mount.TypeBind, Source: testDir, Target: testDestinationPath, ReadOnly: true}, |
| expected: MountPoint{Type: mount.TypeBind, Source: testDir, Destination: testDestinationPath, Propagation: parser.DefaultPropagationMode()}, |
| }, |
| { |
| input: mount.Mount{Type: mount.TypeBind, Source: testDir, Target: testDestinationPath}, |
| expected: MountPoint{Type: mount.TypeBind, Source: testDir, Destination: testDestinationPath, RW: true, Propagation: parser.DefaultPropagationMode()}, |
| }, |
| { |
| input: mount.Mount{Type: mount.TypeBind, Source: testDir + string(os.PathSeparator), Target: testDestinationPath, ReadOnly: true}, |
| expected: MountPoint{Type: mount.TypeBind, Source: testDir, Destination: testDestinationPath, Propagation: parser.DefaultPropagationMode()}, |
| }, |
| { |
| input: mount.Mount{Type: mount.TypeBind, Source: testDir, Target: testDestinationPath + string(os.PathSeparator), ReadOnly: true}, |
| expected: MountPoint{Type: mount.TypeBind, Source: testDir, Destination: testDestinationPath, Propagation: parser.DefaultPropagationMode()}, |
| }, |
| { |
| input: mount.Mount{Type: mount.TypeVolume, Target: testDestinationPath}, |
| expected: MountPoint{Type: mount.TypeVolume, Destination: testDestinationPath, RW: true, CopyData: parser.DefaultCopyMode()}, |
| }, |
| { |
| input: mount.Mount{Type: mount.TypeVolume, Target: testDestinationPath + string(os.PathSeparator)}, |
| expected: MountPoint{Type: mount.TypeVolume, Destination: testDestinationPath, RW: true, CopyData: parser.DefaultCopyMode()}, |
| }, |
| } |
| |
| for _, tc := range cases { |
| tc := tc |
| t.Run("", func(t *testing.T) { |
| mp, err := parser.ParseMountSpec(tc.input) |
| assert.NilError(t, err) |
| |
| assert.Check(t, is.Equal(mp.Type, tc.expected.Type)) |
| assert.Check(t, is.Equal(mp.Destination, tc.expected.Destination)) |
| assert.Check(t, is.Equal(mp.Source, tc.expected.Source)) |
| assert.Check(t, is.Equal(mp.RW, tc.expected.RW)) |
| assert.Check(t, is.Equal(mp.Propagation, tc.expected.Propagation)) |
| assert.Check(t, is.Equal(mp.Driver, tc.expected.Driver)) |
| assert.Check(t, is.Equal(mp.CopyData, tc.expected.CopyData)) |
| }) |
| } |
| } |