blob: 71f999d4fba9a6f8ca1360686daf15df31f801b5 [file] [edit]
package container_test
import (
"testing"
"github.com/moby/moby/v2/daemon/container"
"gotest.tools/v3/assert"
)
// TestSortMounts verifies that mounts are sorted by destination depth and
// deterministically by destination when they have the same depth.
func TestSortMounts(t *testing.T) {
tests := []struct {
name string
mounts []container.Mount
expected []container.Mount
}{
{
name: "nested",
mounts: []container.Mount{
{Destination: "/etc/resolv.conf"},
{Destination: "/etc"},
},
expected: []container.Mount{
{Destination: "/etc"},
{Destination: "/etc/resolv.conf"},
},
},
{
name: "same depth",
mounts: []container.Mount{
{Destination: "/var"},
{Destination: "/etc"},
{Destination: "/usr"},
},
expected: []container.Mount{
{Destination: "/etc"},
{Destination: "/usr"},
{Destination: "/var"},
},
},
{
name: "nested and same depth",
mounts: []container.Mount{
{Destination: "/var/lib/foo"},
{Destination: "/etc/resolv.conf"},
{Destination: "/var"},
{Destination: "/etc"},
{Destination: "/opt/data"},
},
expected: []container.Mount{
{Destination: "/etc"},
{Destination: "/var"},
{Destination: "/etc/resolv.conf"},
{Destination: "/opt/data"},
{Destination: "/var/lib/foo"},
},
},
{
name: "duplicate destinations preserve order",
mounts: []container.Mount{
{Source: "/source-1", Destination: "/var"},
{Source: "/source-c", Destination: "/etc"},
{Source: "/source-2", Destination: "/opt"},
{Source: "/source-a", Destination: "/etc"},
{Source: "/source-3", Destination: "/usr"},
{Source: "/source-b", Destination: "/etc"},
{Source: "/source-4", Destination: "/home"},
},
expected: []container.Mount{
{Source: "/source-c", Destination: "/etc"},
{Source: "/source-a", Destination: "/etc"},
{Source: "/source-b", Destination: "/etc"},
{Source: "/source-4", Destination: "/home"},
{Source: "/source-2", Destination: "/opt"},
{Source: "/source-3", Destination: "/usr"},
{Source: "/source-1", Destination: "/var"},
},
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
container.SortMounts(tc.mounts)
assert.DeepEqual(t, tc.expected, tc.mounts)
})
}
}