From e60919067870c8c709091cce7dea7adff122cae3 Mon Sep 17 00:00:00 2001 From: na4ma4 Date: Fri, 9 Jul 2021 13:44:09 +1000 Subject: [PATCH] Initial commit --- .github/workflows/ci.yml | 60 +++++++++++++++++++++++++++++ .gitignore | 2 + .golangci.yml | 10 +++++ .goreleaser.yml | 16 ++++++++ Makefile | 23 +++++++++++ README.md | 52 ++++++++++++++++++++++++- go.mod | 8 ++++ go.sum | 82 ++++++++++++++++++++++++++++++++++++++++ permbits.go | 42 ++++++++++++++++++++ permbits_suite_test.go | 13 +++++++ permbits_test.go | 57 ++++++++++++++++++++++++++++ 11 files changed, 364 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .golangci.yml create mode 100644 .goreleaser.yml create mode 100644 Makefile create mode 100644 go.mod create mode 100644 go.sum create mode 100644 permbits.go create mode 100644 permbits_suite_test.go create mode 100644 permbits_test.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..ffce454 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,60 @@ +name: ci + +on: + pull_request: + push: + branches: + - '*' + tags: + - 'v*' + +jobs: + test: + name: test + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 + id: go + - name: Set up go env + run: export PATH=${PATH}:`go env GOPATH`/bin + - name: golangci-lint + uses: golangci/golangci-lint-action@v2.5.2 + with: + version: v1.41 + - name: unit-test + run: make test + - name: ci + run: make ci + + goreleaser: + if: startsWith(github.ref, 'refs/tags/v') + needs: + - test + name: goreleaser + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 + id: go + - name: Set up go env + run: export PATH=${PATH}:`go env GOPATH`/bin + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v2 + with: + version: latest + args: release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.GO_RELEASER_GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e652d5f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.makefiles +/artifacts diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..aa5f208 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,10 @@ +linters: + enable-all: true + disable: + - exhaustivestruct + - forbidigo + - golint + - maligned + - interfacer + - paralleltest + - scopelint diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..bdb47ac --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,16 @@ +project_name: permbits +build: + skip: true +release: + github: + prerelease: auto +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ .Tag }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6d7337a --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +-include .makefiles/Makefile +-include .makefiles/pkg/go/v1/Makefile +-include .makefiles/ext/na4ma4/pkg/lib-golangci-lint/v1/Makefile +-include .makefiles/ext/na4ma4/pkg/lib-goreleaser/v1/Makefile + +.makefiles/ext/na4ma4/%: .makefiles/Makefile + @curl -sfL https://raw.githubusercontent.com/na4ma4/makefiles-ext/main/v1/install | bash /dev/stdin "$@" + +.makefiles/%: + @curl -sfL https://makefiles.dev/v1 | bash /dev/stdin "$@" + +###################### +# Testing +###################### + +GINKGO := artifacts/ginkgo/bin/ginkgo +$(GINKGO): + @mkdir -p "$(MF_PROJECT_ROOT)/$(@D)" + GOBIN="$(MF_PROJECT_ROOT)/$(@D)" go get github.com/onsi/ginkgo/ginkgo + +test:: $(GINKGO) + -@mkdir -p "artifacts/test" + $(GINKGO) -outputdir "artifacts/test/" -r --randomizeAllSpecs --randomizeSuites --failOnPending --cover --trace --race --compilers=2 --nodes=2 diff --git a/README.md b/README.md index e082c9d..8477334 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,52 @@ # permbits -Golang File Permission Bit Operators + +Golang File Permission Bit Operators. + +[![CI](https://github.com/na4ma4/permbits/workflows/CI/badge.svg)](https://github.com/na4ma4/permbits/actions?query=workflow%3ACI) +[![GoDoc](https://godoc.org/github.com/na4ma4/permbits/src/jwt?status.svg)](https://godoc.org/github.com/na4ma4/permbits) + +## Usage + +Anywhere you can specify a file mode, you can use the permbits to add together the permissions you want. + +(This test works because it's likely the umask is `022` which will mean the first MkdirAll will actually create a directory with 0750 permissions). + +```golang +testPath := "./test" +mode := permbits.UserAll+permbits.GroupAll + +if err := os.MkdirAll(testPath, mode); err != nil { + log.Fatal(err) +} + +if st, err := os.Stat(testPath); err == nil { + if !permbits.Is(st.Mode(), mode) { + log.Printf("Updating mode for %s (was %o)", testPath, st.Mode()) + os.Chmod(testPath, mode) + } else { + log.Printf("Test path mode is correct: %s (%o)", testPath, st.Mode()) + } +} +``` + +```shell +$ go run main.go +2021/07/09 13:12:53 Updating mode for ./test (was 20000000750) +``` + +## Constants + +| Mode | Constant | +| ---- | -------- | +| u+a | permbits.UserAll | +| u+r | permbits.UserRead | +| u+w | permbits.UserWrite | +| u+x | permbits.UserExecute | +| g+a | permbits.GroupAll | +| g+r | permbits.GroupRead | +| g+w | permbits.GroupWrite | +| g+x | permbits.GroupExecute | +| o+a | permbits.OtherAll | +| o+r | permbits.OtherRead | +| o+w | permbits.OtherWrite | +| o+x | permbits.OtherExecute | diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..9e30034 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/na4ma4/permbits + +go 1.16 + +require ( + github.com/onsi/ginkgo v1.16.4 + github.com/onsi/gomega v1.10.1 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..a1bd675 --- /dev/null +++ b/go.sum @@ -0,0 +1,82 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091 h1:DMyOG0U+gKfu8JZzg2UQe9MeaC1X+xQWlAKcRnjxjCw= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/permbits.go b/permbits.go new file mode 100644 index 0000000..8851dd5 --- /dev/null +++ b/permbits.go @@ -0,0 +1,42 @@ +package permbits + +import ( + "os" +) + +const ( + // UserRead is read permissions for the user. + UserRead os.FileMode = 0400 + // UserWrite is write permissions for the user. + UserWrite os.FileMode = 0200 + // UserExecute is execute permissions for the user. + UserExecute os.FileMode = 0100 + // UserAll is all permissions for the user. + UserAll os.FileMode = UserRead + UserWrite + UserExecute +) + +const ( + // GroupRead is read permissions for the group. + GroupRead os.FileMode = 0040 + // GroupWrite is write permissions for the group. + GroupWrite os.FileMode = 0020 + // GroupExecute is execute permissions for the group. + GroupExecute os.FileMode = 0010 + // GroupAll is all permissions for the group. + GroupAll os.FileMode = GroupRead + GroupWrite + GroupExecute +) + +const ( + // OtherRead is read permissions for others. + OtherRead os.FileMode = 0004 + // OtherWrite is write permissions for others. + OtherWrite os.FileMode = 0002 + // OtherExecute is execute permissions for others. + OtherExecute os.FileMode = 0001 + // OtherAll is all permissions for others. + OtherAll os.FileMode = OtherRead + OtherWrite + OtherExecute +) + +func Is(mode os.FileMode, is os.FileMode) bool { + return (mode & is) == is +} diff --git a/permbits_suite_test.go b/permbits_suite_test.go new file mode 100644 index 0000000..30d1f48 --- /dev/null +++ b/permbits_suite_test.go @@ -0,0 +1,13 @@ +package permbits_test + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +func TestPermbits(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Permbits Suite") +} diff --git a/permbits_test.go b/permbits_test.go new file mode 100644 index 0000000..c557564 --- /dev/null +++ b/permbits_test.go @@ -0,0 +1,57 @@ +package permbits_test + +import ( + "os" + + "github.com/na4ma4/permbits" + . "github.com/onsi/ginkgo" + . "github.com/onsi/ginkgo/extensions/table" + . "github.com/onsi/gomega" +) + +var _ = Describe("Permbits Test", func() { + modeAll := os.FileMode(0777) + modeNone := os.FileMode(0000) + + Describe("Is()", func() { + DescribeTable( + "Compares Single Modes True", + func(mode, is os.FileMode) { + Expect(permbits.Is(mode, permbits.UserRead)).To(BeTrue()) + }, + Entry("will compare UserRead", modeAll, permbits.UserRead), + Entry("will compare UserWrite", modeAll, permbits.UserWrite), + Entry("will compare UserExecute", modeAll, permbits.UserExecute), + Entry("will compare GroupRead", modeAll, permbits.GroupRead), + Entry("will compare GroupWrite", modeAll, permbits.GroupWrite), + Entry("will compare GroupExecute", modeAll, permbits.GroupExecute), + Entry("will compare OtherRead", modeAll, permbits.OtherRead), + Entry("will compare OtherWrite", modeAll, permbits.OtherWrite), + Entry("will compare OtherExecute", modeAll, permbits.OtherExecute), + ) + + DescribeTable( + "Compares Single Modes False", + func(mode, is os.FileMode) { + Expect(permbits.Is(mode, permbits.UserRead)).To(BeFalse()) + }, + Entry("will compare UserRead", modeNone, permbits.UserRead), + Entry("will compare UserWrite", modeNone, permbits.UserWrite), + Entry("will compare UserExecute", modeNone, permbits.UserExecute), + Entry("will compare GroupRead", modeNone, permbits.GroupRead), + Entry("will compare GroupWrite", modeNone, permbits.GroupWrite), + Entry("will compare GroupExecute", modeNone, permbits.GroupExecute), + Entry("will compare OtherRead", modeNone, permbits.OtherRead), + Entry("will compare OtherWrite", modeNone, permbits.OtherWrite), + Entry("will compare OtherExecute", modeNone, permbits.OtherExecute), + ) + + It("Compare Multiple Modes", func() { + mode := os.FileMode(0777) + Expect(permbits.Is(mode, permbits.UserAll+permbits.GroupAll+permbits.OtherAll)).To(BeTrue()) + + mode = os.FileMode(0775) + Expect(permbits.Is(mode, permbits.UserAll+permbits.GroupAll+permbits.OtherAll)).To(BeFalse()) + }) + }) +})