lnd.xprv/macaroons/constraints_test.go

110 lines
2.3 KiB
Go
Raw Normal View History

2017-09-22 08:51:15 +03:00
package macaroons
import (
"errors"
"fmt"
2017-09-22 08:51:15 +03:00
"testing"
"time"
"gopkg.in/macaroon-bakery.v1/bakery"
"gopkg.in/macaroon-bakery.v1/bakery/checkers"
macaroon "gopkg.in/macaroon.v1"
)
type macError struct {
message string
}
2017-09-22 08:51:15 +03:00
func (err macError) Error() string {
return err.message
2017-09-22 08:51:15 +03:00
}
func testConstraint(constraint Constraint, ok checkers.Checker,
failFn func() checkers.Checker) error {
2017-09-22 08:51:15 +03:00
macParams := bakery.NewServiceParams{}
svc, err := bakery.NewService(macParams)
if err != nil {
return errors.New("Failed to create a new service")
2017-09-22 08:51:15 +03:00
}
mac, err := svc.NewMacaroon("", nil, nil)
if err != nil {
return errors.New("Failed to create a new macaroon")
2017-09-22 08:51:15 +03:00
}
mac, err = AddConstraints(mac, constraint)
if err != nil {
return errors.New("Failed to add macaroon constraint")
2017-09-22 08:51:15 +03:00
}
okChecker := checkers.New(ok)
if err := svc.Check(macaroon.Slice{mac}, okChecker); err != nil {
msg := "Correct checker failed: %v"
return macError{fmt.Sprintf(msg, ok)}
2017-09-22 08:51:15 +03:00
}
fail := failFn()
failChecker := checkers.New(fail)
if err := svc.Check(macaroon.Slice{mac}, failChecker); err == nil {
msg := "Incorrect checker succeeded: %v"
return macError{fmt.Sprintf(msg, fail)}
2017-09-22 08:51:15 +03:00
}
return nil
2017-09-22 08:51:15 +03:00
}
func TestAllowConstraint(t *testing.T) {
if err := testConstraint(
AllowConstraint("op1", "op2", "op4"),
AllowChecker("op1"),
func() checkers.Checker {
return AllowChecker("op3")
},
); err != nil {
t.Fatalf(err.Error())
2017-09-22 08:51:15 +03:00
}
}
func TestTimeoutConstraint(t *testing.T) {
if err := testConstraint(
TimeoutConstraint(1),
TimeoutChecker(),
func() checkers.Checker {
time.Sleep(time.Second)
return TimeoutChecker()
},
); err != nil {
t.Fatalf(err.Error())
2017-09-22 08:51:15 +03:00
}
}
2017-09-22 08:51:15 +03:00
func TestIPLockConstraint(t *testing.T) {
if err := testConstraint(
IPLockConstraint("127.0.0.1"),
IPLockChecker("127.0.0.1"),
func() checkers.Checker {
return IPLockChecker("0.0.0.0")
},
); err != nil {
t.Fatalf(err.Error())
2017-09-22 08:51:15 +03:00
}
}
2017-09-22 08:51:15 +03:00
func TestIPLockEmptyIP(t *testing.T) {
if err := testConstraint(
IPLockConstraint(""),
IPLockChecker("127.0.0.1"),
func() checkers.Checker {
return IPLockChecker("0.0.0.0")
},
); err != nil {
if _, ok := err.(macError); !ok {
t.Fatalf("IPLock with an empty IP should always pass")
}
2017-09-22 08:51:15 +03:00
}
}
2017-09-22 08:51:15 +03:00
func TestIPLockBadIP(t *testing.T) {
if err := IPLockConstraint("127.0.0/800"); err == nil {
t.Fatalf("IPLockConstraint with bad IP should fail")
2017-09-22 08:51:15 +03:00
}
}