// +build linux

package volume

import (
	"strings"
	"testing"
)

func TestParseMountSpecPropagation(t *testing.T) {
	var (
		valid   []string
		invalid map[string]string
	)

	valid = []string{
		"/hostPath:/containerPath:shared",
		"/hostPath:/containerPath:rshared",
		"/hostPath:/containerPath:slave",
		"/hostPath:/containerPath:rslave",
		"/hostPath:/containerPath:private",
		"/hostPath:/containerPath:rprivate",
		"/hostPath:/containerPath:ro,shared",
		"/hostPath:/containerPath:ro,slave",
		"/hostPath:/containerPath:ro,private",
		"/hostPath:/containerPath:ro,z,shared",
		"/hostPath:/containerPath:ro,Z,slave",
		"/hostPath:/containerPath:Z,ro,slave",
		"/hostPath:/containerPath:slave,Z,ro",
		"/hostPath:/containerPath:Z,slave,ro",
		"/hostPath:/containerPath:slave,ro,Z",
		"/hostPath:/containerPath:rslave,ro,Z",
		"/hostPath:/containerPath:ro,rshared,Z",
		"/hostPath:/containerPath:ro,Z,rprivate",
	}
	invalid = map[string]string{
		"/path:/path:ro,rshared,rslave":   `invalid mode: ro,rshared,rslave`,
		"/path:/path:ro,z,rshared,rslave": `invalid mode: ro,z,rshared,rslave`,
		"/path:shared":                    "Invalid volume specification",
		"/path:slave":                     "Invalid volume specification",
		"/path:private":                   "Invalid volume specification",
		"name:/absolute-path:shared":      "Invalid volume specification",
		"name:/absolute-path:rshared":     "Invalid volume specification",
		"name:/absolute-path:slave":       "Invalid volume specification",
		"name:/absolute-path:rslave":      "Invalid volume specification",
		"name:/absolute-path:private":     "Invalid volume specification",
		"name:/absolute-path:rprivate":    "Invalid volume specification",
	}

	for _, path := range valid {
		if _, err := ParseMountSpec(path, "local"); err != nil {
			t.Fatalf("ParseMountSpec(`%q`) should succeed: error %q", path, err)
		}
	}

	for path, expectedError := range invalid {
		if _, err := ParseMountSpec(path, "local"); err == nil {
			t.Fatalf("ParseMountSpec(`%q`) should have failed validation. Err %v", path, err)
		} else {
			if !strings.Contains(err.Error(), expectedError) {
				t.Fatalf("ParseMountSpec(`%q`) error should contain %q, got %v", path, expectedError, err.Error())
			}
		}
	}
}