| 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)) | |
| }) | |
| } | |
| } |