435ecfe6e0
In these cases, continuing after a non nil error will result in a nil dereference in panic. Change the `assert.Check` to `assert.NilError` to avoid that. Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
96 lines
3.3 KiB
Go
96 lines
3.3 KiB
Go
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))
|
|
})
|
|
}
|
|
}
|