Skip to content

Commit

Permalink
Add go mod support. Tests refactoring (#11)
Browse files Browse the repository at this point in the history
* Remove go 1.8 support
  • Loading branch information
o1egl committed Oct 28, 2018
1 parent 09f3dfb commit fd305fd
Show file tree
Hide file tree
Showing 17 changed files with 773 additions and 606 deletions.
50 changes: 33 additions & 17 deletions .travis.yml
@@ -1,25 +1,41 @@
language: go
go:
- 1.8.x
- 1.9.x
- 1.10.x
- tip

env:
- GOMAXPROCS=4 GORACE=halt_on_error=1 GO111MODULE=on

before_install:
- export PATH=$PATH:$GOPATH/bin
- go get github.com/modocache/gover
- go get github.com/mattn/goveralls
- go get golang.org/x/tools/cmd/cover
- go get github.com/golang/dep/cmd/dep
- go get github.com/golang/lint/golint
install:
- dep ensure
script:
- diff -u <(echo -n) <(gofmt -d -s $(find . -type f -name '*.go' -not -path "./vendor/*"))
- go vet $(go list ./... | grep -v /vendor/)
- golint -set_exit_status
- go test -coverprofile=parser.coverprofile
- gover
- goveralls -coverprofile=gover.coverprofile -service=travis-ci
- go get golang.org/x/lint/golint
- go get golang.org/x/tools/cmd/goimports

install: true

matrix:
include:
- go: "1.9.x"
install:
- go get -t -v ./...
script:
- go test -v -race
- go: "1.10.x"
install:
- go get -t -v ./...
script:
- go test -v -race
- go: "1.11.x"
script:
- diff -u <(echo -n) <(goimports -d -s $(find . -type f -name '*.go' -not -path "./vendor/*"))
- go vet $(go list ./... | grep -v /vendor/)
- golint -set_exit_status
- go test -v -race -coverprofile=paseto.coverprofile
- goveralls -coverprofile=paseto.coverprofile -service=travis-ci
- go: "tip"
script:
- diff -u <(echo -n) <(gofmt -d -s $(find . -type f -name '*.go' -not -path "./vendor/*"))
- go vet $(go list ./... | grep -v /vendor/)
- golint -set_exit_status
- go test -v -race
allow_failures:
- go: tip
11 changes: 0 additions & 11 deletions Gopkg.toml

This file was deleted.

2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -5,7 +5,7 @@
[![Coverage Status](http://img.shields.io/coveralls/o1egl/paseto.svg?style=flat-square)](https://coveralls.io/r/o1egl/paseto)
[![Go Report Card](https://goreportcard.com/badge/github.com/o1egl/paseto)](https://goreportcard.com/report/github.com/o1egl/paseto)

This is 100% compatible pure Go (Golang) implementation of [PASETO](https://github.com/paragonie/paseto) library.
This is 100% compatible pure Go (Golang) implementation of [PASETO](https://paseto.io) tokens.

Paseto is everything you love about JOSE (JWT, JWE, JWS) without any of the
[many design deficits that plague the JOSE standards](https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid).
Expand Down
3 changes: 2 additions & 1 deletion benchmarks_test.go
Expand Up @@ -2,9 +2,10 @@ package paseto

import (
"encoding/hex"
"golang.org/x/crypto/ed25519"
"testing"
"time"

"golang.org/x/crypto/ed25519"
)

// JSONToken
Expand Down
12 changes: 12 additions & 0 deletions go.mod
@@ -0,0 +1,12 @@
module github.com/o1egl/paseto

require (
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da
github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/testify v1.2.2
golang.org/x/crypto v0.0.0-20181025213731-e84da0312774
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5 // indirect
)
16 changes: 16 additions & 0 deletions go.sum
@@ -0,0 +1,16 @@
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb h1:6Z/wqhPFZ7y5ksCEV/V5MXOazLaeu/EW97CU5rz8NWk=
github.com/aead/chacha20poly1305 v0.0.0-20170617001512-233f39982aeb/go.mod h1:UzH9IX1MMqOcwhoNOIjmTQeAxrFgzs50j4golQtXXxU=
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw=
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
golang.org/x/crypto v0.0.0-20181025213731-e84da0312774 h1:a4tQYYYuK9QdeO/+kEvNYyuR21S+7ve5EANok6hABhI=
golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5 h1:x6r4Jo0KNzOOzYd8lbcRsqjuqEASK6ob3auvWYM4/8U=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
16 changes: 0 additions & 16 deletions helpers_go18_test.go

This file was deleted.

18 changes: 0 additions & 18 deletions helpers_go19_test.go

This file was deleted.

135 changes: 83 additions & 52 deletions helpers_test.go
@@ -1,15 +1,16 @@
package paseto

import (
"crypto"
"encoding/hex"
"reflect"
"testing"

"crypto"

"github.com/stretchr/testify/assert"
)

func _testEncryptDecrypt(t *testing.T, impl Protocol) {
func testEncryptDecrypt(t *testing.T, impl Protocol) {
t.Helper()
type Case struct {
payload interface{}
footer interface{}
Expand All @@ -19,83 +20,113 @@ func _testEncryptDecrypt(t *testing.T, impl Protocol) {

key, _ := hex.DecodeString("707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f")

cases := []Case{
{
cases := map[string]Case{
"struct payload, struct footer": {
payload: &TestPerson{Name: "John", Age: 30},
footer: &TestPerson{Name: "Antony", Age: 60},
obtainedPayload: &TestPerson{},
obtainedFooter: &TestPerson{},
},
{
"string payload, string footer": {
payload: sPtr("payload"),
footer: sPtr("footer"),
obtainedPayload: sPtr(""),
obtainedFooter: sPtr(""),
},
{
"[]byte payload, []byte footer": {
payload: baPtr([]byte("payload")),
footer: baPtr([]byte("footer")),
obtainedPayload: baPtr([]byte("")),
obtainedFooter: baPtr([]byte("")),
},
}

for _, c := range cases {
if token, err := impl.Encrypt(key, c.payload, WithFooter(c.footer)); assert.NoError(t, err) {
if err := impl.Decrypt(token, key, c.obtainedPayload, c.obtainedFooter); assert.NoError(t, err) {
assert.Equal(t, c.payload, c.obtainedPayload)
assert.EqualValues(t, c.footer, c.obtainedFooter)
for name, test := range cases {
t.Run(name, func(t *testing.T) {
if token, err := impl.Encrypt(key, test.payload, WithFooter(test.footer)); assert.NoError(t, err) {
if err := impl.Decrypt(token, key, test.obtainedPayload, test.obtainedFooter); assert.NoError(t, err) {
assert.Equal(t, test.payload, test.obtainedPayload)
assert.EqualValues(t, test.footer, test.obtainedFooter)
}
}
}
}

payload := "payload"
footer := "footer"
if token, err := impl.Encrypt(key, payload, WithFooter(footer)); assert.NoError(t, err) {
var obtainedPayload string
var obtainedFooter string
if err := impl.Decrypt(token, key, &obtainedPayload, &obtainedFooter); assert.NoError(t, err) {
assert.Equal(t, payload, obtainedPayload)
assert.EqualValues(t, footer, obtainedFooter)
}
})
}
}

func _testSign(t *testing.T, impl Protocol, privateKey crypto.PrivateKey, publicKey crypto.PublicKey) {
{
payload := []byte("Lorem Ipsum")
if token, err := impl.Sign(privateKey, payload); assert.NoError(t, err) {
var obtainedPayload []byte
if assert.NoError(t, impl.Verify(token, publicKey, &obtainedPayload, nil)) {
t.Run("non pointer string payload and footer", func(t *testing.T) {
payload := "payload"
footer := "footer"
if token, err := impl.Encrypt(key, payload, WithFooter(footer)); assert.NoError(t, err) {
var obtainedPayload string
var obtainedFooter string
if err := impl.Decrypt(token, key, &obtainedPayload, &obtainedFooter); assert.NoError(t, err) {
assert.Equal(t, payload, obtainedPayload)
assert.EqualValues(t, footer, obtainedFooter)
}
}
})
}

func testSign(t *testing.T, impl Protocol, privateKey crypto.PrivateKey, publicKey crypto.PublicKey) {
t.Helper()

cases := map[string]struct {
payload interface{}
footer interface{}
}{
"Non empty payload, empty footer": {
payload: []byte("Lorem Ipsum"),
},
"Non empty payload, non empty footer": {
payload: []byte("Lorem Ipsum"),
footer: []byte("footer"),
},
"Struct payload, struct footer": {
payload: TestPerson{Name: "John", Age: 30},
footer: TestPerson{Name: "Antony", Age: 60},
},
}

{
payload := []byte("Lorem Ipsum")
footer := []byte("footer")
if token, err := impl.Sign(privateKey, payload, WithFooter(footer)); assert.NoError(t, err) {
var obtainedPayload []byte
var obtainedFooter []byte
if assert.NoError(t, impl.Verify(token, publicKey, &obtainedPayload, &obtainedFooter)) {
assert.Equal(t, payload, obtainedPayload)
assert.Equal(t, footer, obtainedFooter)
for name, test := range cases {
t.Run(name, func(t *testing.T) {
var ops []opsFunc
if test.footer != nil {
ops = append(ops, WithFooter(test.footer))
}
}
if token, err := impl.Sign(privateKey, test.payload, ops...); assert.NoError(t, err) {
var obtainedPayload = ptrOf(test.payload)
var obtainedFooter = ptrOf(test.footer)
if assert.NoError(t, impl.Verify(token, publicKey, obtainedPayload, obtainedFooter)) {
assert.Equal(t, test.payload, valOf(obtainedPayload), "Payload does not match")
assert.Equal(t, test.footer, valOf(obtainedFooter), "Footer does not match")
}
}
})
}
}

{
payload := TestPerson{Name: "John", Age: 30}
footer := TestPerson{Name: "Antony", Age: 60}
if token, err := impl.Sign(privateKey, &payload, WithFooter(&footer)); assert.NoError(t, err) {
var obtainedPayload TestPerson
var obtainedFooter TestPerson
if assert.NoError(t, impl.Verify(token, publicKey, &obtainedPayload, &obtainedFooter)) {
assert.Equal(t, payload, obtainedPayload)
assert.Equal(t, footer, obtainedFooter)
}
}
func ptrOf(i interface{}) interface{} {
if i == nil {
return nil
}
val := reflect.ValueOf(i)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
val = reflect.New(val.Type())

return val.Interface()
}

func valOf(i interface{}) interface{} {
if i == nil {
return nil
}
val := reflect.ValueOf(i)
switch val.Kind() {
case reflect.Ptr:
return val.Elem().Interface()
default:
panic("Interface is not a pointer")
}
}

Expand Down
24 changes: 13 additions & 11 deletions json_token_test.go
Expand Up @@ -2,9 +2,10 @@ package paseto

import (
"encoding/json"
"github.com/stretchr/testify/assert"
"testing"
"time"

"github.com/stretchr/testify/assert"
)

func TestJsonToken(t *testing.T) {
Expand Down Expand Up @@ -74,31 +75,32 @@ func TestJsonToken_MarshalJSON(t *testing.T) {
}

func TestJsonToken_UnmarshalJSON_Err(t *testing.T) {
cases := []struct {
cases := map[string]struct {
srt string
err string
}{
{
"Invalid json": {
srt: `"test"`,
err: "cannot unmarshal",
},
{
"Invalid Expiration time format": {
srt: `{"exp":"11/03/2018"}`,
err: "incorrect time format for Expiration field",
},
{
"Invalid IssuedAt time format": {
srt: `{"iat":"11/03/2018"}`,
err: "incorrect time format for IssuedAt field",
},
{
"Invalid NotBefore time format": {
srt: `{"nbf":"11/03/2018"}`,
err: "incorrect time format for NotBefore field",
},
}
for _, c := range cases {
if err := json.Unmarshal([]byte(c.srt), &JSONToken{}); assert.Error(t, err) {
assert.Contains(t, err.Error(), c.err)
}

for name, test := range cases {
t.Run(name, func(t *testing.T) {
if err := json.Unmarshal([]byte(test.srt), &JSONToken{}); assert.Error(t, err) {
assert.Contains(t, err.Error(), test.err)
}
})
}
}

0 comments on commit fd305fd

Please sign in to comment.