Skip to content

Commit

Permalink
Merge pull request #176 from authzed/must-tuple
Browse files Browse the repository at this point in the history
Add Must* methods for any methods that can panic in tuple pkg
  • Loading branch information
josephschorr committed Oct 7, 2021
2 parents ddeee97 + 061db12 commit 424037a
Show file tree
Hide file tree
Showing 12 changed files with 68 additions and 46 deletions.
2 changes: 1 addition & 1 deletion internal/datastore/test/revisions.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func RevisionFuzzingTest(t *testing.T, tester DatastoreTester) {
for i := 0; i < 10; i++ {
_, err = ds.WriteTuples(ctx, nil, []*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_TOUCH,
Relationship: tuple.ToRelationship(tpl),
Relationship: tuple.MustToRelationship(tpl),
}})
require.NoError(err)
}
Expand Down
32 changes: 16 additions & 16 deletions internal/datastore/test/tuples.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func SimpleTest(t *testing.T, tester DatastoreTester) {
nil,
[]*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(newTuple),
Relationship: tuple.MustToRelationship(newTuple),
}},
)
require.NoError(err)
Expand Down Expand Up @@ -192,7 +192,7 @@ func SimpleTest(t *testing.T, tester DatastoreTester) {
nil,
[]*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_DELETE,
Relationship: tuple.ToRelationship(testTuples[0]),
Relationship: tuple.MustToRelationship(testTuples[0]),
}},
)
require.NoError(err)
Expand All @@ -203,7 +203,7 @@ func SimpleTest(t *testing.T, tester DatastoreTester) {
nil,
[]*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_DELETE,
Relationship: tuple.ToRelationship(testTuples[0]),
Relationship: tuple.MustToRelationship(testTuples[0]),
}},
)
require.NoError(err)
Expand All @@ -225,7 +225,7 @@ func SimpleTest(t *testing.T, tester DatastoreTester) {
nil,
[]*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(testTuples[0]),
Relationship: tuple.MustToRelationship(testTuples[0]),
}},
)
require.NoError(err)
Expand Down Expand Up @@ -261,30 +261,30 @@ func WritePreconditionsTest(t *testing.T, tester DatastoreTester) {
ctx,
[]*v1.Precondition{{
Operation: v1.Precondition_OPERATION_MUST_MATCH,
Filter: tuple.ToFilter(first),
Filter: tuple.MustToFilter(first),
}},
[]*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(second),
Relationship: tuple.MustToRelationship(second),
}},
)
require.True(errors.As(err, &datastore.ErrPreconditionFailed{}))

_, err = ds.WriteTuples(ctx, nil, []*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(first),
Relationship: tuple.MustToRelationship(first),
}})
require.NoError(err)

_, err = ds.WriteTuples(
ctx,
[]*v1.Precondition{{
Operation: v1.Precondition_OPERATION_MUST_MATCH,
Filter: tuple.ToFilter(first),
Filter: tuple.MustToFilter(first),
}},
[]*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(second),
Relationship: tuple.MustToRelationship(second),
}},
)
require.NoError(err)
Expand Down Expand Up @@ -313,7 +313,7 @@ func DeletePreconditionsTest(t *testing.T, tester DatastoreTester) {
ctx,
[]*v1.Precondition{{
Operation: v1.Precondition_OPERATION_MUST_MATCH,
Filter: tuple.ToFilter(relTpl),
Filter: tuple.MustToFilter(relTpl),
}},
filter,
)
Expand All @@ -324,15 +324,15 @@ func DeletePreconditionsTest(t *testing.T, tester DatastoreTester) {

_, err = ds.WriteTuples(ctx, nil, []*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(relTpl),
Relationship: tuple.MustToRelationship(relTpl),
}})
require.NoError(err)

_, err = ds.DeleteRelationships(
ctx,
[]*v1.Precondition{{
Operation: v1.Precondition_OPERATION_MUST_MATCH,
Filter: tuple.ToFilter(relTpl),
Filter: tuple.MustToFilter(relTpl),
}},
filter,
)
Expand Down Expand Up @@ -415,7 +415,7 @@ func DeleteRelationshipsTest(t *testing.T, tester DatastoreTester) {
for _, tpl := range tt.inputTuples {
updates = append(updates, &v1.RelationshipUpdate{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(tpl),
Relationship: tuple.MustToRelationship(tpl),
})
}

Expand Down Expand Up @@ -464,7 +464,7 @@ func InvalidReadsTest(t *testing.T, tester DatastoreTester) {
nil,
[]*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(newTuple),
Relationship: tuple.MustToRelationship(newTuple),
}},
)
require.NoError(err)
Expand All @@ -482,7 +482,7 @@ func InvalidReadsTest(t *testing.T, tester DatastoreTester) {
nil,
[]*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_TOUCH,
Relationship: tuple.ToRelationship(newTuple),
Relationship: tuple.MustToRelationship(newTuple),
}},
)
require.NoError(err)
Expand Down Expand Up @@ -539,7 +539,7 @@ func UsersetsTest(t *testing.T, tester DatastoreTester) {

writtenAt, err := ds.WriteTuples(ctx, nil, []*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(newTuple),
Relationship: tuple.MustToRelationship(newTuple),
}})
require.NoError(err)
require.True(writtenAt.GreaterThan(lastRevision))
Expand Down
2 changes: 1 addition & 1 deletion internal/datastore/test/watch.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ func verifyUpdates(
func setOfChangesRel(changes []*v1.RelationshipUpdate) *strset.Set {
changeSet := strset.NewWithSize(len(changes))
for _, change := range changes {
changeSet.Add(fmt.Sprintf("%s(%s)", change.Operation, tuple.RelString(change.Relationship)))
changeSet.Add(fmt.Sprintf("%s(%s)", change.Operation, tuple.MustRelString(change.Relationship)))
}
return changeSet
}
Expand Down
2 changes: 1 addition & 1 deletion internal/services/servicetester.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func (v1st v1ServiceTester) Write(ctx context.Context, relationship *v0.Relation
OptionalPreconditions: []*v1.Precondition{
{
Operation: v1.Precondition_OPERATION_MUST_MATCH,
Filter: tuple.ToFilter(relationship),
Filter: tuple.MustToFilter(relationship),
},
},
Updates: []*v1.RelationshipUpdate{tuple.UpdateToRelationshipUpdate(tuple.Touch(relationship))},
Expand Down
2 changes: 1 addition & 1 deletion internal/services/v0/acl.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func (as *aclServer) Write(ctx context.Context, req *v0.WriteRequest) (*v0.Write
for _, cond := range req.WriteConditions {
preconditions = append(preconditions, &v1_api.Precondition{
Operation: v1_api.Precondition_OPERATION_MUST_MATCH,
Filter: tuple.ToFilter(cond),
Filter: tuple.MustToFilter(cond),
})
}

Expand Down
2 changes: 1 addition & 1 deletion internal/services/v0/devcontext.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ func loadTuples(ctx context.Context, tuples []*v0.RelationTuple, nsm namespace.M

updates = append(updates, &v1.RelationshipUpdate{
Operation: v1.RelationshipUpdate_OPERATION_TOUCH,
Relationship: tuple.ToRelationship(tpl),
Relationship: tuple.MustToRelationship(tpl),
})
}

Expand Down
2 changes: 1 addition & 1 deletion internal/services/v0/namespace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ func TestNamespaceChanged(t *testing.T) {
for _, tpl := range tc.tuples {
updates = append(updates, &v1.RelationshipUpdate{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(tpl),
Relationship: tuple.MustToRelationship(tpl),
})
}

Expand Down
16 changes: 8 additions & 8 deletions internal/services/v1/relationships_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ func TestReadRelationships(t *testing.T) {

require.NoError(err)

relString := tuple.RelString(rel.Relationship)
relString := tuple.MustRelString(rel.Relationship)
_, found := tc.expected[relString]
require.True(found, "relationship was not expected: %s", relString)

Expand Down Expand Up @@ -260,11 +260,11 @@ func TestWriteRelationships(t *testing.T) {
resp, err := client.WriteRelationships(context.Background(), &v1.WriteRelationshipsRequest{
Updates: []*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(toWrite),
Relationship: tuple.MustToRelationship(toWrite),
}},
OptionalPreconditions: []*v1.Precondition{{
Operation: v1.Precondition_OPERATION_MUST_MATCH,
Filter: tuple.ToFilter(toWrite),
Filter: tuple.MustToFilter(toWrite),
}},
})
require.Nil(resp)
Expand All @@ -277,11 +277,11 @@ func TestWriteRelationships(t *testing.T) {
resp, err = client.WriteRelationships(context.Background(), &v1.WriteRelationshipsRequest{
Updates: []*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(toWrite),
Relationship: tuple.MustToRelationship(toWrite),
}},
OptionalPreconditions: []*v1.Precondition{{
Operation: v1.Precondition_OPERATION_MUST_MATCH,
Filter: tuple.ToFilter(existing),
Filter: tuple.MustToFilter(existing),
}},
})
require.NoError(err)
Expand All @@ -301,7 +301,7 @@ func TestWriteRelationships(t *testing.T) {

rel, err := stream.Recv()
require.NoError(err)
require.Equal(tuple.String(toWrite), tuple.RelString(rel.Relationship))
require.Equal(tuple.String(toWrite), tuple.MustRelString(rel.Relationship))

_, err = stream.Recv()
require.ErrorIs(err, io.EOF)
Expand All @@ -310,7 +310,7 @@ func TestWriteRelationships(t *testing.T) {
deleted, err := client.WriteRelationships(context.Background(), &v1.WriteRelationshipsRequest{
Updates: []*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_DELETE,
Relationship: tuple.ToRelationship(toWrite),
Relationship: tuple.MustToRelationship(toWrite),
}},
})
require.NoError(err)
Expand Down Expand Up @@ -808,7 +808,7 @@ func readAll(require *require.Assertions, client v1.PermissionsServiceClient, to
}
require.NoError(err)

got[tuple.RelString(rel.Relationship)] = struct{}{}
got[tuple.MustRelString(rel.Relationship)] = struct{}{}
}
}
return got
Expand Down
4 changes: 2 additions & 2 deletions internal/testfixtures/datastore.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func StandardDatastoreWithData(ds datastore.Datastore, require *require.Assertio
var err error
revision, err = ds.WriteTuples(ctx, nil, []*v1.RelationshipUpdate{{
Operation: v1.RelationshipUpdate_OPERATION_CREATE,
Relationship: tuple.ToRelationship(tpl),
Relationship: tuple.MustToRelationship(tpl),
}})
require.NoError(err)
}
Expand All @@ -138,7 +138,7 @@ type TupleChecker struct {
}

func (tc TupleChecker) ExactTupleIterator(ctx context.Context, tpl *v0.RelationTuple, rev datastore.Revision) datastore.TupleIterator {
filter := tuple.ToFilter(tpl)
filter := tuple.MustToFilter(tpl)
iter, err := tc.DS.QueryTuples(datastore.TupleQueryResourceFilter{
ResourceType: filter.ResourceType,
OptionalResourceID: filter.OptionalResourceId,
Expand Down
42 changes: 32 additions & 10 deletions pkg/tuple/tuple.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ var parserRegex = regexp.MustCompile(
),
)

// String converts a tuple to a string.
// String converts a tuple to a string. If the tuple is nil or empty, returns empty string.
func String(tpl *v0.RelationTuple) string {
if tpl == nil || tpl.ObjectAndRelation == nil || tpl.User == nil || tpl.User.GetUserset() == nil {
return ""
Expand All @@ -55,9 +55,10 @@ func String(tpl *v0.RelationTuple) string {
return fmt.Sprintf("%s@%s", StringONR(tpl.ObjectAndRelation), StringONR(tpl.User.GetUserset()))
}

// RelString converts a relationship into a string.
func RelString(tpl *v1.Relationship) string {
return String(FromRelationship(tpl))
// MustRelString converts a relationship into a string. Will panic if
// the Relationship does not validate.
func MustRelString(tpl *v1.Relationship) string {
return String(MustFromRelationship(tpl))
}

// MustParse wraps Parse such that any failures panic rather than returning
Expand All @@ -69,6 +70,11 @@ func MustParse(tpl string) *v0.RelationTuple {
panic("failed to parse tuple")
}

// RelString converts a relationship into a string.
func RelString(tpl *v1.Relationship) string {
return String(FromRelationship(tpl))
}

// Parse unmarshals the string form of a Tuple and returns nil if there is a
// failure.
//
Expand Down Expand Up @@ -128,12 +134,18 @@ func Delete(tpl *v0.RelationTuple) *v0.RelationTupleUpdate {
}
}

// ToRelationship converts a RelationTuple into a Relationship.
func ToRelationship(tpl *v0.RelationTuple) *v1.Relationship {
// MustToRelationship converts a RelationTuple into a Relationship. Will panic if
// the RelationTuple does not validate.
func MustToRelationship(tpl *v0.RelationTuple) *v1.Relationship {
if err := tpl.Validate(); err != nil {
panic(fmt.Sprintf("invalid tuple: %#v %s", tpl, err))
}

return ToRelationship(tpl)
}

// ToRelationship converts a RelationTuple into a Relationship.
func ToRelationship(tpl *v0.RelationTuple) *v1.Relationship {
return &v1.Relationship{
Resource: &v1.ObjectReference{
ObjectType: tpl.ObjectAndRelation.Namespace,
Expand All @@ -150,12 +162,18 @@ func ToRelationship(tpl *v0.RelationTuple) *v1.Relationship {
}
}

// ToFilter converts a RelationTuple into a RelationshipFilter.
func ToFilter(tpl *v0.RelationTuple) *v1.RelationshipFilter {
// MustToFilter converts a RelationTuple into a RelationshipFilter. Will panic if
// the RelationTuple does not validate.
func MustToFilter(tpl *v0.RelationTuple) *v1.RelationshipFilter {
if err := tpl.Validate(); err != nil {
panic(fmt.Sprintf("invalid tuple: %#v %s", tpl, err))
}

return ToFilter(tpl)
}

// ToFilter converts a RelationTuple into a RelationshipFilter.
func ToFilter(tpl *v0.RelationTuple) *v1.RelationshipFilter {
return &v1.RelationshipFilter{
ResourceType: tpl.ObjectAndRelation.Namespace,
OptionalResourceId: tpl.ObjectAndRelation.ObjectId,
Expand Down Expand Up @@ -191,12 +209,16 @@ func UpdateToRelationshipUpdate(update *v0.RelationTupleUpdate) *v1.Relationship
}
}

// FromRelationship converts a Relationship into a RelationTuple.
func FromRelationship(r *v1.Relationship) *v0.RelationTuple {
// MustFromRelationship converts a Relationship into a RelationTuple.
func MustFromRelationship(r *v1.Relationship) *v0.RelationTuple {
if err := r.Validate(); err != nil {
panic(fmt.Sprintf("invalid relationship: %#v %s", r, err))
}
return FromRelationship(r)
}

// FromRelationship converts a Relationship into a RelationTuple.
func FromRelationship(r *v1.Relationship) *v0.RelationTuple {
return &v0.RelationTuple{
ObjectAndRelation: &v0.ObjectAndRelation{
Namespace: r.Resource.ObjectType,
Expand Down
4 changes: 2 additions & 2 deletions pkg/tuple/tuple_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ func TestSerialize(t *testing.T) {
return
}

serialized := RelString(tc.relFormat)
serialized := MustRelString(tc.relFormat)
require.Equal(t, tc.expectedOutput, serialized)
})
}
Expand Down Expand Up @@ -168,7 +168,7 @@ func TestConvert(t *testing.T) {
}

relationship := ToRelationship(parsed)
relString := RelString(relationship)
relString := MustRelString(relationship)
require.Equal(tc.expectedOutput, relString)

backToTpl := FromRelationship(relationship)
Expand Down

0 comments on commit 424037a

Please sign in to comment.