Support PluginWatcher in Windows

Signed-off-by: Deep Debroy <ddebroy@docker.com>
This commit is contained in:
Deep Debroy
2019-08-13 01:44:16 -07:00
parent f2c82f49e8
commit 1321c9115b
7 changed files with 227 additions and 1 deletions

View File

@@ -19,8 +19,14 @@ limitations under the License.
package util
import (
"io/ioutil"
"math/rand"
"net"
"os"
"testing"
"time"
winio "github.com/Microsoft/go-winio"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@@ -90,3 +96,100 @@ func TestParseEndpoint(t *testing.T) {
}
}
func testPipe(t *testing.T, label string) {
generatePipeName := func(suffixlen int) string {
rand.Seed(time.Now().UnixNano())
letter := []rune("abcdef0123456789")
b := make([]rune, suffixlen)
for i := range b {
b[i] = letter[rand.Intn(len(letter))]
}
return "\\\\.\\pipe\\test-pipe" + string(b)
}
testFile := generatePipeName(4)
pipeln, err := winio.ListenPipe(testFile, &winio.PipeConfig{SecurityDescriptor: "D:P(A;;GA;;;BA)(A;;GA;;;SY)"})
defer pipeln.Close()
require.NoErrorf(t, err, "Failed to listen on named pipe for test purposes: %v while setting up: %s", err, label)
result, err := IsUnixDomainSocket(testFile)
assert.Nil(t, err, "Unexpected error: %v from IsUnixDomainSocket for %s", err, label)
assert.False(t, result, "Unexpected result: true from IsUnixDomainSocket: %v for %s", result, label)
}
func testRegularFile(t *testing.T, label string, exists bool) {
f, err := ioutil.TempFile("", "test-file")
require.NoErrorf(t, err, "Failed to create file for test purposes: %v while setting up: %s", err, label)
testFile := f.Name()
if !exists {
testFile = testFile + ".absent"
}
f.Close()
result, err := IsUnixDomainSocket(testFile)
os.Remove(f.Name())
assert.Nil(t, err, "Unexpected error: %v from IsUnixDomainSocket for %s", err, label)
assert.False(t, result, "Unexpected result: true from IsUnixDomainSocket: %v for %s", result, label)
}
func testUnixDomainSocket(t *testing.T, label string) {
f, err := ioutil.TempFile("", "test-domain-socket")
require.NoErrorf(t, err, "Failed to create file for test purposes: %v while setting up: %s", err, label)
testFile := f.Name()
f.Close()
os.Remove(testFile)
ta, err := net.ResolveUnixAddr("unix", testFile)
require.NoErrorf(t, err, "Failed to ResolveUnixAddr: %v while setting up: %s", err, label)
unixln, err := net.ListenUnix("unix", ta)
require.NoErrorf(t, err, "Failed to ListenUnix: %v while setting up: %s", err, label)
result, err := IsUnixDomainSocket(testFile)
unixln.Close()
assert.Nil(t, err, "Unexpected error: %v from IsUnixDomainSocket for %s", err, label)
assert.True(t, result, "Unexpected result: false from IsUnixDomainSocket: %v for %s", result, label)
}
func TestIsUnixDomainSocket(t *testing.T) {
testPipe(t, "Named Pipe")
testRegularFile(t, "Regular File that Exists", true)
testRegularFile(t, "Regular File that Does Not Exist", false)
testUnixDomainSocket(t, "Unix Domain Socket File")
}
func TestNormalizePath(t *testing.T) {
tests := []struct {
originalpath string
normalizedPath string
}{
{
originalpath: "\\path\\to\\file",
normalizedPath: "c:\\path\\to\\file",
},
{
originalpath: "/path/to/file",
normalizedPath: "c:\\path\\to\\file",
},
{
originalpath: "/path/to/dir/",
normalizedPath: "c:\\path\\to\\dir\\",
},
{
originalpath: "\\path\\to\\dir\\",
normalizedPath: "c:\\path\\to\\dir\\",
},
{
originalpath: "/file",
normalizedPath: "c:\\file",
},
{
originalpath: "\\file",
normalizedPath: "c:\\file",
},
{
originalpath: "fileonly",
normalizedPath: "fileonly",
},
}
for _, test := range tests {
assert.Equal(t, test.normalizedPath, NormalizePath(test.originalpath))
}
}