From 8d7f06cf4bb9fdbd307935d44e1965d6d7b71cae Mon Sep 17 00:00:00 2001 From: Leonardo Di Donato Date: Fri, 20 Jul 2018 12:24:07 +0200 Subject: [PATCH] feat(platform/id): using uint64 for platform.IDs Signed-off-by: Leonardo Di Donato Co-Authored-by: Lorenzo Fontana --- bolt/authorization.go | 38 ++- bolt/bucket.go | 84 +++-- bolt/dashboard.go | 20 +- bolt/organization.go | 33 +- bolt/organization_test.go | 4 +- bolt/user.go | 34 +- cmd/influx/authorization.go | 26 +- cmd/influx/bucket.go | 14 +- cmd/influx/organization.go | 5 +- cmd/influx/user.go | 5 +- dashboard.go | 6 +- dbrp_mapping.go | 14 +- dbrp_mapping_internal_test.go | 41 +++ dbrp_mapping_test.go | 55 +-- http/auth_service.go | 10 +- http/bucket_service.go | 10 +- http/org_service.go | 5 +- http/task_service.go | 35 +- http/user_service.go | 5 +- id.go | 75 ++++- id_test.go | 178 +++++++++- organization.go | 2 +- prometheus/auth_service_test.go | 7 +- query/execute/aggregate_test.go | 450 +++++++++++++++++++++++++ query/functions/compspecs/compspecs.go | 8 +- query/functions/query_test.go | 6 +- query/influxql/spectests/testing.go | 11 +- query/influxql/transpiler_test.go | 5 +- snowflake/id.go | 13 +- snowflake/id_test.go | 11 +- task/backend/executor/executor_test.go | 25 +- task/backend/inmem_store.go | 24 +- task/backend/scheduler_test.go | 12 +- task/backend/store.go | 6 +- task/mock/scheduler.go | 9 +- task/platform_adapter.go | 6 +- testing/auth.go | 185 +++++----- testing/bucket_service.go | 310 ++++++++--------- testing/dbrp_mapping.go | 166 ++++----- testing/organization_service.go | 84 ++--- testing/user_service.go | 86 ++--- testing/util.go | 7 +- user.go | 2 +- view_test.go | 5 +- 44 files changed, 1477 insertions(+), 660 deletions(-) create mode 100644 dbrp_mapping_internal_test.go create mode 100644 query/execute/aggregate_test.go diff --git a/bolt/authorization.go b/bolt/authorization.go index fed93031d6..3980f3bfb7 100644 --- a/bolt/authorization.go +++ b/bolt/authorization.go @@ -1,7 +1,6 @@ package bolt import ( - "bytes" "context" "encoding/json" "fmt" @@ -57,9 +56,13 @@ func (c *Client) FindAuthorizationByID(ctx context.Context, id platform.ID) (*pl } func (c *Client) findAuthorizationByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Authorization, error) { - var a platform.Authorization + encodedID, err := id.Encode() + if err != nil { + return nil, err + } - v := tx.Bucket(authorizationBucket).Get(id) + var a platform.Authorization + v := tx.Bucket(authorizationBucket).Get(encodedID) if len(v) == 0 { // TODO: Make standard error @@ -94,14 +97,17 @@ func (c *Client) FindAuthorizationByToken(ctx context.Context, n string) (*platf } func (c *Client) findAuthorizationByToken(ctx context.Context, tx *bolt.Tx, n string) (*platform.Authorization, error) { - id := tx.Bucket(authorizationIndex).Get(authorizationIndexKey(n)) - return c.findAuthorizationByID(ctx, tx, platform.ID(id)) + var id platform.ID + if err := id.Decode(tx.Bucket(authorizationIndex).Get(authorizationIndexKey(n))); err != nil { + return nil, err + } + return c.findAuthorizationByID(ctx, tx, id) } func filterAuthorizationsFn(filter platform.AuthorizationFilter) func(a *platform.Authorization) bool { if filter.ID != nil { return func(a *platform.Authorization) bool { - return bytes.Equal(a.ID, *filter.ID) + return a.ID.Valid() && a.ID == *filter.ID } } @@ -113,7 +119,7 @@ func filterAuthorizationsFn(filter platform.AuthorizationFilter) func(a *platfor if filter.UserID != nil { return func(a *platform.Authorization) bool { - return bytes.Equal(a.UserID, *filter.UserID) + return a.UserID.Valid() && a.UserID == *filter.UserID } } @@ -187,7 +193,7 @@ func (c *Client) findAuthorizations(ctx context.Context, tx *bolt.Tx, f platform // CreateAuthorization creates a platform authorization and sets b.ID, and b.UserID if not provided. func (c *Client) CreateAuthorization(ctx context.Context, a *platform.Authorization) error { return c.db.Update(func(tx *bolt.Tx) error { - if len(a.UserID) == 0 { + if !a.UserID.Valid() { u, err := c.findUserByName(ctx, tx, a.User) if err != nil { return err @@ -239,10 +245,15 @@ func (c *Client) putAuthorization(ctx context.Context, tx *bolt.Tx, a *platform. return err } - if err := tx.Bucket(authorizationIndex).Put(authorizationIndexKey(a.Token), a.ID); err != nil { + encodedID, err := a.ID.Encode() + if err != nil { return err } - if err := tx.Bucket(authorizationBucket).Put(a.ID, v); err != nil { + + if err := tx.Bucket(authorizationIndex).Put(authorizationIndexKey(a.Token), encodedID); err != nil { + return err + } + if err := tx.Bucket(authorizationBucket).Put(encodedID, v); err != nil { return err } return c.setUserOnAuthorization(ctx, tx, a) @@ -302,7 +313,12 @@ func (c *Client) deleteAuthorization(ctx context.Context, tx *bolt.Tx, id platfo if err := tx.Bucket(authorizationIndex).Delete(authorizationIndexKey(a.Token)); err != nil { return err } - return tx.Bucket(authorizationBucket).Delete(id) + encodedID, err := id.Encode() + if err != nil { + return err + } + + return tx.Bucket(authorizationBucket).Delete(encodedID) } // SetAuthorizationStatus updates the status of the authorization. Useful diff --git a/bolt/bucket.go b/bolt/bucket.go index f3327cf284..5556c89c5c 100644 --- a/bolt/bucket.go +++ b/bolt/bucket.go @@ -1,7 +1,6 @@ package bolt import ( - "bytes" "context" "encoding/json" "fmt" @@ -57,7 +56,12 @@ func (c *Client) FindBucketByID(ctx context.Context, id platform.ID) (*platform. func (c *Client) findBucketByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Bucket, error) { var b platform.Bucket - v := tx.Bucket(bucketBucket).Get(id) + encodedID, err := id.Encode() + if err != nil { + return nil, err + } + + v := tx.Bucket(bucketBucket).Get(encodedID) if len(v) == 0 { // TODO: Make standard error @@ -97,8 +101,16 @@ func (c *Client) findBucketByName(ctx context.Context, tx *bolt.Tx, orgID platfo OrganizationID: orgID, Name: n, } - id := tx.Bucket(bucketIndex).Get(bucketIndexKey(b)) - return c.findBucketByID(ctx, tx, platform.ID(id)) + key, err := bucketIndexKey(b) + if err != nil { + return nil, err + } + + var id platform.ID + if err := id.Decode(tx.Bucket(bucketIndex).Get(key)); err != nil { + return nil, err + } + return c.findBucketByID(ctx, tx, id) } // FindBucket retrives a bucket using an arbitrary bucket filter. @@ -147,13 +159,13 @@ func (c *Client) FindBucket(ctx context.Context, filter platform.BucketFilter) ( func filterBucketsFn(filter platform.BucketFilter) func(b *platform.Bucket) bool { if filter.ID != nil { return func(b *platform.Bucket) bool { - return bytes.Equal(b.ID, *filter.ID) + return b.ID == *filter.ID } } if filter.Name != nil && filter.OrganizationID != nil { return func(b *platform.Bucket) bool { - return bytes.Equal(b.OrganizationID, *filter.OrganizationID) && b.Name == *filter.Name + return b.Name == *filter.Name && b.OrganizationID == *filter.OrganizationID } } @@ -165,7 +177,7 @@ func filterBucketsFn(filter platform.BucketFilter) func(b *platform.Bucket) bool if filter.OrganizationID != nil { return func(b *platform.Bucket) bool { - return bytes.Equal(b.OrganizationID, *filter.OrganizationID) + return b.OrganizationID == *filter.OrganizationID } } @@ -239,7 +251,7 @@ func (c *Client) findBuckets(ctx context.Context, tx *bolt.Tx, filter platform.B // CreateBucket creates a platform bucket and sets b.ID. func (c *Client) CreateBucket(ctx context.Context, b *platform.Bucket) error { return c.db.Update(func(tx *bolt.Tx) error { - if len(b.OrganizationID) == 0 { + if !b.OrganizationID.Valid() { o, err := c.findOrganizationByName(ctx, tx, b.Organization) if err != nil { return err @@ -273,20 +285,33 @@ func (c *Client) putBucket(ctx context.Context, tx *bolt.Tx, b *platform.Bucket) return err } - if err := tx.Bucket(bucketIndex).Put(bucketIndexKey(b), b.ID); err != nil { + encodedID, err := b.ID.Encode() + if err != nil { return err } - if err := tx.Bucket(bucketBucket).Put(b.ID, v); err != nil { + key, err := bucketIndexKey(b) + if err != nil { + return err + } + + if err := tx.Bucket(bucketIndex).Put(key, encodedID); err != nil { + return err + } + if err := tx.Bucket(bucketBucket).Put(encodedID, v); err != nil { return err } return c.setOrganizationOnBucket(ctx, tx, b) } -func bucketIndexKey(b *platform.Bucket) []byte { - k := make([]byte, len(b.OrganizationID)+len(b.Name)) - copy(k, b.OrganizationID) - copy(k[len(b.OrganizationID):], []byte(b.Name)) - return k +func bucketIndexKey(b *platform.Bucket) ([]byte, error) { + orgID, err := b.OrganizationID.Encode() + if err != nil { + return nil, err + } + k := make([]byte, platform.IDStringLength+len(b.Name)) + copy(k, orgID) + copy(k[platform.IDStringLength:], []byte(b.Name)) + return k, nil } // forEachBucket will iterate through all buckets while fn returns true. @@ -309,7 +334,11 @@ func (c *Client) forEachBucket(ctx context.Context, tx *bolt.Tx, fn func(*platfo } func (c *Client) uniqueBucketName(ctx context.Context, tx *bolt.Tx, b *platform.Bucket) bool { - v := tx.Bucket(bucketIndex).Get(bucketIndexKey(b)) + key, err := bucketIndexKey(b) + if err != nil { + return false + } + v := tx.Bucket(bucketIndex).Get(key) return len(v) == 0 } @@ -339,9 +368,12 @@ func (c *Client) updateBucket(ctx context.Context, tx *bolt.Tx, id platform.ID, } if upd.Name != nil { - // Buckets are indexed by name and so the bucket index must be pruned when name - // is modified. - if err := tx.Bucket(bucketIndex).Delete(bucketIndexKey(b)); err != nil { + key, err := bucketIndexKey(b) + if err != nil { + return nil, err + } + // Buckets are indexed by name and so the bucket index must be pruned when name is modified. + if err := tx.Bucket(bucketIndex).Delete(key); err != nil { return nil, err } b.Name = *upd.Name @@ -370,9 +402,17 @@ func (c *Client) deleteBucket(ctx context.Context, tx *bolt.Tx, id platform.ID) if err != nil { return err } - // make lowercase deleteBucket with tx - if err := tx.Bucket(bucketIndex).Delete(bucketIndexKey(b)); err != nil { + key, err := bucketIndexKey(b) + if err != nil { return err } - return tx.Bucket(bucketBucket).Delete(id) + // make lowercase deleteBucket with tx + if err := tx.Bucket(bucketIndex).Delete(key); err != nil { + return err + } + encodedID, err := id.Encode() + if err != nil { + return err + } + return tx.Bucket(bucketBucket).Delete(encodedID) } diff --git a/bolt/dashboard.go b/bolt/dashboard.go index 6a0d2dd423..24f33c6e33 100644 --- a/bolt/dashboard.go +++ b/bolt/dashboard.go @@ -45,9 +45,13 @@ func (c *Client) FindDashboardByID(ctx context.Context, id platform.ID) (*platfo } func (c *Client) findDashboardByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Dashboard, error) { - var d platform.Dashboard + encodedID, err := id.Encode() + if err != nil { + return nil, err + } - v := tx.Bucket(dashboardBucket).Get([]byte(id)) + var d platform.Dashboard + v := tx.Bucket(dashboardBucket).Get(encodedID) if len(v) == 0 { return nil, platform.ErrDashboardNotFound @@ -326,7 +330,11 @@ func (c *Client) putDashboard(ctx context.Context, tx *bolt.Tx, d *platform.Dash if err != nil { return err } - if err := tx.Bucket(dashboardBucket).Put([]byte(d.ID), v); err != nil { + encodedID, err := d.ID.Encode() + if err != nil { + return err + } + if err := tx.Bucket(dashboardBucket).Put(encodedID, v); err != nil { return err } return nil @@ -397,5 +405,9 @@ func (c *Client) deleteDashboard(ctx context.Context, tx *bolt.Tx, id platform.I return err } } - return tx.Bucket(dashboardBucket).Delete([]byte(id)) + encodedID, err := id.Encode() + if err != nil { + return err + } + return tx.Bucket(dashboardBucket).Delete(encodedID) } diff --git a/bolt/organization.go b/bolt/organization.go index 20087975a2..5235ecf6ef 100644 --- a/bolt/organization.go +++ b/bolt/organization.go @@ -1,7 +1,6 @@ package bolt import ( - "bytes" "context" "encoding/json" "fmt" @@ -48,9 +47,13 @@ func (c *Client) FindOrganizationByID(ctx context.Context, id platform.ID) (*pla } func (c *Client) findOrganizationByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Organization, error) { - var o platform.Organization + encodedID, err := id.Encode() + if err != nil { + return nil, err + } - v := tx.Bucket(organizationBucket).Get(id) + var o platform.Organization + v := tx.Bucket(organizationBucket).Get(encodedID) if len(v) == 0 { // TODO: Make standard error @@ -81,8 +84,11 @@ func (c *Client) FindOrganizationByName(ctx context.Context, n string) (*platfor } func (c *Client) findOrganizationByName(ctx context.Context, tx *bolt.Tx, n string) (*platform.Organization, error) { - id := tx.Bucket(organizationIndex).Get(organizationIndexKey(n)) - return c.findOrganizationByID(ctx, tx, platform.ID(id)) + var id platform.ID + if err := id.Decode(tx.Bucket(organizationIndex).Get(organizationIndexKey(n))); err != nil { + return nil, err + } + return c.findOrganizationByID(ctx, tx, id) } // FindOrganization retrives a organization using an arbitrary organization filter. @@ -124,7 +130,7 @@ func (c *Client) FindOrganization(ctx context.Context, filter platform.Organizat func filterOrganizationsFn(filter platform.OrganizationFilter) func(o *platform.Organization) bool { if filter.ID != nil { return func(o *platform.Organization) bool { - return bytes.Equal(o.ID, *filter.ID) + return o.ID.Valid() && o.ID == *filter.ID } } @@ -205,11 +211,14 @@ func (c *Client) putOrganization(ctx context.Context, tx *bolt.Tx, o *platform.O if err != nil { return err } - - if err := tx.Bucket(organizationIndex).Put(organizationIndexKey(o.Name), o.ID); err != nil { + encodedID, err := o.ID.Encode() + if err != nil { return err } - return tx.Bucket(organizationBucket).Put(o.ID, v) + if err := tx.Bucket(organizationIndex).Put(organizationIndexKey(o.Name), encodedID); err != nil { + return err + } + return tx.Bucket(organizationBucket).Put(encodedID, v) } func organizationIndexKey(n string) []byte { @@ -292,7 +301,11 @@ func (c *Client) deleteOrganization(ctx context.Context, tx *bolt.Tx, id platfor if err := tx.Bucket(organizationIndex).Delete(organizationIndexKey(o.Name)); err != nil { return err } - return tx.Bucket(organizationBucket).Delete(id) + encodedID, err := id.Encode() + if err != nil { + return err + } + return tx.Bucket(organizationBucket).Delete(encodedID) } func (c *Client) deleteOrganizationsBuckets(ctx context.Context, tx *bolt.Tx, id platform.ID) error { diff --git a/bolt/organization_test.go b/bolt/organization_test.go index c572d56a52..2082af4077 100644 --- a/bolt/organization_test.go +++ b/bolt/organization_test.go @@ -22,8 +22,8 @@ func initOrganizationService(f platformtesting.OrganizationFields, t *testing.T) } return c, func() { defer closeFn() - for _, u := range f.Organizations { - if err := c.DeleteOrganization(ctx, u.ID); err != nil { + for _, o := range f.Organizations { + if err := c.DeleteOrganization(ctx, o.ID); err != nil { t.Logf("failed to remove organizations: %v", err) } } diff --git a/bolt/user.go b/bolt/user.go index bccadcd0f9..d00e137835 100644 --- a/bolt/user.go +++ b/bolt/user.go @@ -1,7 +1,6 @@ package bolt import ( - "bytes" "context" "encoding/json" "fmt" @@ -55,9 +54,13 @@ func (c *Client) FindUserByID(ctx context.Context, id platform.ID) (*platform.Us } func (c *Client) findUserByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.User, error) { - var u platform.User + encodedID, err := id.Encode() + if err != nil { + return nil, err + } - v := tx.Bucket(userBucket).Get(id) + var u platform.User + v := tx.Bucket(userBucket).Get(encodedID) if len(v) == 0 { // TODO: Make standard error @@ -88,8 +91,11 @@ func (c *Client) FindUserByName(ctx context.Context, n string) (*platform.User, } func (c *Client) findUserByName(ctx context.Context, tx *bolt.Tx, n string) (*platform.User, error) { - id := tx.Bucket(userIndex).Get(userIndexKey(n)) - return c.findUserByID(ctx, tx, platform.ID(id)) + var id platform.ID + if err := id.Decode(tx.Bucket(userIndex).Get(userIndexKey(n))); err != nil { + return nil, err + } + return c.findUserByID(ctx, tx, id) } // FindUser retrives a user using an arbitrary user filter. @@ -131,7 +137,7 @@ func (c *Client) FindUser(ctx context.Context, filter platform.UserFilter) (*pla func filterUsersFn(filter platform.UserFilter) func(u *platform.User) bool { if filter.ID != nil { return func(u *platform.User) bool { - return bytes.Equal(u.ID, *filter.ID) + return u.ID.Valid() && u.ID == *filter.ID } } @@ -212,11 +218,14 @@ func (c *Client) putUser(ctx context.Context, tx *bolt.Tx, u *platform.User) err if err != nil { return err } - - if err := tx.Bucket(userIndex).Put(userIndexKey(u.Name), u.ID); err != nil { + encodedID, err := u.ID.Encode() + if err != nil { return err } - return tx.Bucket(userBucket).Put(u.ID, v) + if err := tx.Bucket(userIndex).Put(userIndexKey(u.Name), encodedID); err != nil { + return err + } + return tx.Bucket(userBucket).Put(encodedID, v) } func userIndexKey(n string) []byte { @@ -296,11 +305,14 @@ func (c *Client) deleteUser(ctx context.Context, tx *bolt.Tx, id platform.ID) er if err != nil { return err } - + encodedID, err := id.Encode() + if err != nil { + return err + } if err := tx.Bucket(userIndex).Delete(userIndexKey(u.Name)); err != nil { return err } - return tx.Bucket(userBucket).Delete(id) + return tx.Bucket(userBucket).Delete(encodedID) } func (c *Client) deleteUsersAuthorizations(ctx context.Context, tx *bolt.Tx, id platform.ID) error { diff --git a/cmd/influx/authorization.go b/cmd/influx/authorization.go index 376c4e1364..f74e21bc47 100644 --- a/cmd/influx/authorization.go +++ b/cmd/influx/authorization.go @@ -151,23 +151,23 @@ func authorizationFindF(cmd *cobra.Command, args []string) { filter := platform.AuthorizationFilter{} if authorizationFindFlags.id != "" { - filter.ID = &platform.ID{} - err := filter.ID.DecodeFromString(authorizationFindFlags.id) + fID, err := platform.IDFromString(authorizationFindFlags.id) if err != nil { fmt.Println(err) os.Exit(1) } + filter.ID = fID } if authorizationFindFlags.user != "" { filter.User = &authorizationFindFlags.user } if authorizationFindFlags.userID != "" { - filter.UserID = &platform.ID{} - err := filter.UserID.DecodeFromString(authorizationFindFlags.userID) + uID, err := platform.IDFromString(authorizationFindFlags.userID) if err != nil { fmt.Println(err) os.Exit(1) } + filter.UserID = uID } authorizations, _, err := s.FindAuthorizations(context.Background(), filter) @@ -230,20 +230,20 @@ func authorizationDeleteF(cmd *cobra.Command, args []string) { Token: flags.token, } - id := platform.ID{} - if err := id.DecodeFromString(authorizationDeleteFlags.id); err != nil { - fmt.Println(err) - os.Exit(1) - } - - ctx := context.TODO() - a, err := s.FindAuthorizationByID(ctx, id) + id, err := platform.IDFromString(authorizationDeleteFlags.id) if err != nil { fmt.Println(err) os.Exit(1) } - if err := s.DeleteAuthorization(context.Background(), id); err != nil { + ctx := context.TODO() + a, err := s.FindAuthorizationByID(ctx, *id) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := s.DeleteAuthorization(context.Background(), *id); err != nil { fmt.Println(err) os.Exit(1) } diff --git a/cmd/influx/bucket.go b/cmd/influx/bucket.go index 167f991d3e..18d60fe546 100644 --- a/cmd/influx/bucket.go +++ b/cmd/influx/bucket.go @@ -71,12 +71,12 @@ func bucketCreateF(cmd *cobra.Command, args []string) { } if bucketCreateFlags.orgID != "" { - var id platform.ID - if err := id.DecodeFromString(bucketCreateFlags.orgID); err != nil { + id, err := platform.IDFromString(bucketCreateFlags.orgID) + if err != nil { fmt.Printf("error parsing organization id: %v\n", err) os.Exit(1) } - b.OrganizationID = id + b.OrganizationID = *id } if err := s.CreateBucket(context.Background(), b); err != nil { @@ -139,12 +139,12 @@ func bucketFindF(cmd *cobra.Command, args []string) { } if bucketFindFlags.id != "" { - filter.ID = &platform.ID{} - err := filter.ID.DecodeFromString(bucketFindFlags.id) + id, err := platform.IDFromString(bucketFindFlags.id) if err != nil { fmt.Println(err) os.Exit(1) } + filter.ID = id } if bucketFindFlags.orgID != "" && bucketFindFlags.org != "" { @@ -154,12 +154,12 @@ func bucketFindF(cmd *cobra.Command, args []string) { } if bucketFindFlags.orgID != "" { - filter.OrganizationID = &platform.ID{} - err := filter.OrganizationID.DecodeFromString(bucketFindFlags.orgID) + orgID, err := platform.IDFromString(bucketFindFlags.orgID) if err != nil { fmt.Println(err) os.Exit(1) } + filter.OrganizationID = orgID } if bucketFindFlags.org != "" { diff --git a/cmd/influx/organization.go b/cmd/influx/organization.go index 48dcaa31d5..e64b011ce8 100644 --- a/cmd/influx/organization.go +++ b/cmd/influx/organization.go @@ -103,11 +103,12 @@ func organizationFindF(cmd *cobra.Command, args []string) { } if organizationFindFlags.id != "" { - filter.ID = &platform.ID{} - if err := filter.ID.DecodeFromString(organizationFindFlags.id); err != nil { + id, err := platform.IDFromString(organizationFindFlags.id) + if err != nil { fmt.Println(err) os.Exit(1) } + filter.ID = id } orgs, _, err := s.FindOrganizations(context.Background(), filter) diff --git a/cmd/influx/user.go b/cmd/influx/user.go index 8daef8e7cd..e6d754ad73 100644 --- a/cmd/influx/user.go +++ b/cmd/influx/user.go @@ -155,11 +155,12 @@ func userFindF(cmd *cobra.Command, args []string) { filter.Name = &userFindFlags.name } if userFindFlags.id != "" { - filter.ID = &platform.ID{} - if err := filter.ID.DecodeFromString(userFindFlags.id); err != nil { + id, err := platform.IDFromString(userFindFlags.id) + if err != nil { fmt.Println(err) os.Exit(1) } + filter.ID = id } users, _, err := s.FindUsers(context.Background(), filter) diff --git a/dashboard.go b/dashboard.go index 611e565850..24022052d5 100644 --- a/dashboard.go +++ b/dashboard.go @@ -92,7 +92,7 @@ type CellUpdate struct { Y *int32 `json:"y"` W *int32 `json:"w"` H *int32 `json:"h"` - ViewID *ID `json:"viewID"` + ViewID ID `json:"viewID"` } // Apply applies an update to a Cell. @@ -113,8 +113,8 @@ func (u CellUpdate) Apply(c *Cell) error { c.H = *u.H } - if u.ViewID != nil { - c.ViewID = *u.ViewID + if u.ViewID.Valid() { + c.ViewID = u.ViewID } return nil diff --git a/dbrp_mapping.go b/dbrp_mapping.go index 0d5789ab73..7f8fd40b8c 100644 --- a/dbrp_mapping.go +++ b/dbrp_mapping.go @@ -1,7 +1,6 @@ package platform import ( - "bytes" "context" "errors" "strconv" @@ -48,10 +47,10 @@ func (m DBRPMapping) Validate() error { if !validName(m.RetentionPolicy) { return errors.New("RetentionPolicy must contain at least one character and only be letters, numbers, '_', '-', and '.'") } - if len(m.OrganizationID) == 0 { + if !m.OrganizationID.Valid() { return errors.New("OrganizationID is required") } - if len(m.BucketID) == 0 { + if !m.BucketID.Valid() { return errors.New("BucketID is required") } return nil @@ -64,7 +63,6 @@ func validName(name string) bool { return false } } - return name != "" && name != "." && name != ".." && @@ -83,8 +81,12 @@ func (m *DBRPMapping) Equal(o *DBRPMapping) bool { m.Database == o.Database && m.RetentionPolicy == o.RetentionPolicy && m.Default == o.Default && - bytes.Equal(m.OrganizationID, o.OrganizationID) && - bytes.Equal(m.BucketID, o.BucketID) + m.OrganizationID.Valid() && + o.OrganizationID.Valid() && + m.BucketID.Valid() && + o.BucketID.Valid() && + m.OrganizationID == o.OrganizationID && + m.BucketID == o.BucketID } // DBRPMappingFilter represents a set of filters that restrict the returned results by cluster, database and retention policy. diff --git a/dbrp_mapping_internal_test.go b/dbrp_mapping_internal_test.go new file mode 100644 index 0000000000..1f75afabfd --- /dev/null +++ b/dbrp_mapping_internal_test.go @@ -0,0 +1,41 @@ +package platform + +import ( + "testing" +) + +func Test_validName(t *testing.T) { + tests := []struct { + arg string + name string + want bool + }{ + { + name: "names cannot have unprintable characters", + arg: string([]byte{0x0D}), + want: false, + }, + { + name: "names cannot have .", + arg: ".", + want: false, + }, + { + name: "names cannot have ..", + arg: "..", + want: false, + }, + { + name: "names cannot have /", + arg: "/", + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := validName(tt.arg); got != tt.want { + t.Errorf("validName() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/dbrp_mapping_test.go b/dbrp_mapping_test.go index 996afa66f6..90e3c8675b 100644 --- a/dbrp_mapping_test.go +++ b/dbrp_mapping_test.go @@ -1,7 +1,10 @@ -package platform +package platform_test import ( "testing" + + "github.com/influxdata/platform" + platformtesting "github.com/influxdata/platform/testing" ) func TestDBRPMapping_Validate(t *testing.T) { @@ -10,8 +13,8 @@ func TestDBRPMapping_Validate(t *testing.T) { Database string RetentionPolicy string Default bool - OrganizationID ID - BucketID ID + OrganizationID platform.ID + BucketID platform.ID } tests := []struct { name string @@ -57,7 +60,7 @@ func TestDBRPMapping_Validate(t *testing.T) { Cluster: "abc", Database: "telegraf", RetentionPolicy: "autogen", - OrganizationID: []byte{0xde, 0xba, 0xc1, 0xe0, 0xde, 0xad, 0xbe, 0xef}, + OrganizationID: platformtesting.MustIDFromString("debac1e0deadbeef"), }, wantErr: true, }, @@ -85,21 +88,20 @@ func TestDBRPMapping_Validate(t *testing.T) { }, wantErr: true, }, - { name: "dash accepted as valid database", fields: fields{ Cluster: "12345_.", Database: "howdy-doody", RetentionPolicy: "autogen", - OrganizationID: []byte{0xde, 0xba, 0xc1, 0xe0, 0xde, 0xad, 0xbe, 0xef}, - BucketID: []byte{0x5c, 0xa1, 0xab, 0x1e, 0xde, 0xad, 0xbe, 0xa7}, + OrganizationID: platformtesting.MustIDFromString("debac1e0deadbeef"), + BucketID: platformtesting.MustIDFromString("5ca1ab1edeadbea7"), }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - m := DBRPMapping{ + m := platform.DBRPMapping{ Cluster: tt.fields.Cluster, Database: tt.fields.Database, RetentionPolicy: tt.fields.RetentionPolicy, @@ -107,45 +109,10 @@ func TestDBRPMapping_Validate(t *testing.T) { OrganizationID: tt.fields.OrganizationID, BucketID: tt.fields.BucketID, } + if err := m.Validate(); (err != nil) != tt.wantErr { t.Errorf("DBRPMapping.Validate() error = %v, wantErr %v", err, tt.wantErr) } }) } } - -func Test_validName(t *testing.T) { - tests := []struct { - arg string - name string - want bool - }{ - { - name: "names cannot have unprintable characters", - arg: string([]byte{0x0D}), - want: false, - }, - { - name: "names cannot have .", - arg: ".", - want: false, - }, - { - name: "names cannot have ..", - arg: "..", - want: false, - }, - { - name: "names cannot have /", - arg: "/", - want: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := validName(tt.arg); got != tt.want { - t.Errorf("validName() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/http/auth_service.go b/http/auth_service.go index 2f71253ca4..359056c4f5 100644 --- a/http/auth_service.go +++ b/http/auth_service.go @@ -155,10 +155,11 @@ func decodeGetAuthorizationsRequest(ctx context.Context, r *http.Request) (*getA userID := qp.Get("userID") if userID != "" { - req.filter.UserID = &platform.ID{} - if err := req.filter.UserID.DecodeFromString(userID); err != nil { + id, err := platform.IDFromString(userID) + if err != nil { return nil, err } + req.filter.UserID = id } user := qp.Get("user") @@ -168,10 +169,11 @@ func decodeGetAuthorizationsRequest(ctx context.Context, r *http.Request) (*getA authID := qp.Get("id") if authID != "" { - req.filter.ID = &platform.ID{} - if err := req.filter.ID.DecodeFromString(authID); err != nil { + id, err := platform.IDFromString(authID) + if err != nil { return nil, err } + req.filter.ID = id } return req, nil diff --git a/http/bucket_service.go b/http/bucket_service.go index 71dcb307ee..649e7de25a 100644 --- a/http/bucket_service.go +++ b/http/bucket_service.go @@ -348,10 +348,11 @@ func decodeGetBucketsRequest(ctx context.Context, r *http.Request) (*getBucketsR req := &getBucketsRequest{} if id := qp.Get("orgID"); id != "" { - req.filter.OrganizationID = &platform.ID{} - if err := req.filter.OrganizationID.DecodeFromString(id); err != nil { + temp, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.OrganizationID = temp } if org := qp.Get("org"); org != "" { @@ -359,10 +360,11 @@ func decodeGetBucketsRequest(ctx context.Context, r *http.Request) (*getBucketsR } if id := qp.Get("id"); id != "" { - req.filter.ID = &platform.ID{} - if err := req.filter.ID.DecodeFromString(id); err != nil { + temp, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.ID = temp } if name := qp.Get("name"); name != "" { diff --git a/http/org_service.go b/http/org_service.go index d8eb3796c5..08a3edc3ca 100644 --- a/http/org_service.go +++ b/http/org_service.go @@ -210,10 +210,11 @@ func decodeGetOrgsRequest(ctx context.Context, r *http.Request) (*getOrgsRequest req := &getOrgsRequest{} if id := qp.Get("id"); id != "" { - req.filter.ID = &platform.ID{} - if err := req.filter.ID.DecodeFromString(id); err != nil { + temp, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.ID = temp } if name := qp.Get("name"); name != "" { diff --git a/http/task_service.go b/http/task_service.go index e99bf6ecb5..ef514e732b 100644 --- a/http/task_service.go +++ b/http/task_service.go @@ -100,24 +100,27 @@ func decodeGetTasksRequest(ctx context.Context, r *http.Request) (*getTasksReque req := &getTasksRequest{} if id := qp.Get("after"); id != "" { - req.filter.After = &platform.ID{} - if err := req.filter.After.DecodeFromString(id); err != nil { + temp, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.After = temp } if id := qp.Get("organization"); id != "" { - req.filter.Organization = &platform.ID{} - if err := req.filter.Organization.DecodeFromString(id); err != nil { + temp, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.Organization = temp } if id := qp.Get("user"); id != "" { - req.filter.User = &platform.ID{} - if err := req.filter.User.DecodeFromString(id); err != nil { + userID, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.User = userID } return req, nil @@ -337,10 +340,11 @@ func decodeGetLogsRequest(ctx context.Context, r *http.Request, orgs platform.Or } req := &getLogsRequest{} - req.filter.Task = &platform.ID{} - if err := req.filter.Task.DecodeFromString(id); err != nil { + taskID, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.Task = taskID qp := r.URL.Query() @@ -354,10 +358,11 @@ func decodeGetLogsRequest(ctx context.Context, r *http.Request, orgs platform.Or } if id := params.ByName("rid"); id != "" { - req.filter.Run = &platform.ID{} - if err := req.filter.Run.DecodeFromString(id); err != nil { + temp, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.Run = temp } return req, nil @@ -409,10 +414,11 @@ func decodeGetRunsRequest(ctx context.Context, r *http.Request, orgs platform.Or } req := &getRunsRequest{} - req.filter.Task = &platform.ID{} - if err := req.filter.Task.DecodeFromString(id); err != nil { + taskID, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.Task = taskID qp := r.URL.Query() @@ -426,10 +432,11 @@ func decodeGetRunsRequest(ctx context.Context, r *http.Request, orgs platform.Or } if id := qp.Get("after"); id != "" { - req.filter.After = &platform.ID{} - if err := req.filter.After.DecodeFromString(id); err != nil { + afterID, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.After = afterID } if limit := qp.Get("limit"); limit != "" { diff --git a/http/user_service.go b/http/user_service.go index d58945056e..3d2d66d622 100644 --- a/http/user_service.go +++ b/http/user_service.go @@ -257,10 +257,11 @@ func decodeGetUsersRequest(ctx context.Context, r *http.Request) (*getUsersReque req := &getUsersRequest{} if id := qp.Get("id"); id != "" { - req.filter.ID = &platform.ID{} - if err := req.filter.ID.DecodeFromString(id); err != nil { + temp, err := platform.IDFromString(id) + if err != nil { return nil, err } + req.filter.ID = temp } if name := qp.Get("name"); name != "" { diff --git a/id.go b/id.go index c57a0a0afe..c4ecbcf4c6 100644 --- a/id.go +++ b/id.go @@ -1,12 +1,25 @@ package platform import ( + "encoding/binary" "encoding/hex" "encoding/json" + "errors" ) +// IDStringLength is the exact length a string (or a byte slice representing it) must have in order to be decoded into a valid ID. +const IDStringLength = 16 + +// ErrInvalidID is the error thrown to notify invalid IDs. +var ErrInvalidID = errors.New("invalid ID") + +// ErrInvalidIDLength is the error thrown to notify input does not match the wanted length. +var ErrInvalidIDLength = errors.New("input must be an array of 16 bytes") + // ID is a unique identifier. -type ID []byte +// +// Its zero value is not a valid ID. +type ID uint64 // IDGenerator represents a generator for IDs. type IDGenerator interface { @@ -14,10 +27,12 @@ type IDGenerator interface { ID() ID } -// IDFromString creates an ID from a given string -func IDFromString(idstr string) (*ID, error) { +// IDFromString creates an ID from a given string. +// +// It errors if the input string does not match a valid ID. +func IDFromString(str string) (*ID, error) { var id ID - err := id.DecodeFromString(idstr) + err := id.DecodeFromString(str) if err != nil { return nil, err } @@ -25,13 +40,25 @@ func IDFromString(idstr string) (*ID, error) { } // Decode parses b as a hex-encoded byte-slice-string. +// +// It errors if the input byte slice does not have the correct length +// or if it contains all zeros. func (i *ID) Decode(b []byte) error { - dst := make([]byte, hex.DecodedLen(len(b))) + if len(b) != IDStringLength { + return ErrInvalidIDLength + } + + dst := make([]byte, hex.DecodedLen(IDStringLength)) _, err := hex.Decode(dst, b) if err != nil { return err } - *i = dst + *i = ID(binary.BigEndian.Uint64(dst)) + + if !i.Valid() { + return ErrInvalidID + } + return nil } @@ -41,15 +68,32 @@ func (i *ID) DecodeFromString(s string) error { } // Encode converts ID to a hex-encoded byte-slice-string. -func (i ID) Encode() []byte { - dst := make([]byte, hex.EncodedLen(len(i))) - hex.Encode(dst, i) - return dst +// +// It errors if the receiving ID holds its zero value. +func (i ID) Encode() ([]byte, error) { + if !i.Valid() { + return nil, ErrInvalidID + } + + b := make([]byte, hex.DecodedLen(IDStringLength)) + binary.BigEndian.PutUint64(b, uint64(i)) + + dst := make([]byte, hex.EncodedLen(len(b))) + hex.Encode(dst, b) + return dst, nil } -// String returns the ID as a hex encoded string +// Valid checks whether the receiving ID is a valid one or not. +func (i ID) Valid() bool { + return i != 0 +} + +// String returns the ID as a hex encoded string. +// +// Returns an empty string in the case the ID is invalid. func (i ID) String() string { - return string(i.Encode()) + enc, _ := i.Encode() + return string(enc) } // UnmarshalJSON implements JSON unmarshaller for IDs. @@ -60,6 +104,9 @@ func (i *ID) UnmarshalJSON(b []byte) error { // MarshalJSON implements JSON marshaller for IDs. func (i ID) MarshalJSON() ([]byte, error) { - id := i.Encode() - return json.Marshal(string(id[:])) + enc, err := i.Encode() + if err != nil { + return nil, err + } + return json.Marshal(string(enc)) } diff --git a/id_test.go b/id_test.go index f68db5042c..65751b6e7e 100644 --- a/id_test.go +++ b/id_test.go @@ -1,38 +1,190 @@ -package platform +package platform_test import ( + "bytes" + "encoding/json" "reflect" "testing" + + "github.com/influxdata/platform" + platformtesting "github.com/influxdata/platform/testing" ) func TestIDFromString(t *testing.T) { tests := []struct { name string - idstr string - want *ID + id string + want platform.ID wantErr bool + err string }{ { - name: "Is able to decode an id", - idstr: "020f755c3c082000", - want: &ID{0x02, 0x0f, 0x75, 0x5c, 0x3c, 0x08, 0x20, 0x00}, + name: "Should be able to decode an all zeros ID", + id: "0000000000000000", + wantErr: true, + err: platform.ErrInvalidID.Error(), }, { - name: "It should not be able to decode an id that's not hex", - idstr: "gggggggggggggg", + name: "Should be able to decode an all f ID", + id: "ffffffffffffffff", + want: platformtesting.MustIDFromString("ffffffffffffffff"), + }, + { + name: "Should be able to decode an ID", + id: "020f755c3c082000", + want: platformtesting.MustIDFromString("020f755c3c082000"), + }, + { + name: "Should not be able to decode a non hex ID", + id: "gggggggggggggggg", wantErr: true, + err: "encoding/hex: invalid byte: U+0067 'g'", + }, + { + name: "Should not be able to decode inputs with length less than 16 bytes", + id: "abc", + wantErr: true, + err: platform.ErrInvalidIDLength.Error(), + }, + { + name: "Should not be able to decode inputs with length greater than 16 bytes", + id: "abcdabcdabcdabcd0", + wantErr: true, + err: platform.ErrInvalidIDLength.Error(), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := IDFromString(tt.idstr) - if (err != nil) != tt.wantErr { - t.Errorf("IDFromString() error = %v, wantErr %v", err, tt.wantErr) + got, err := platform.IDFromString(tt.id) + + // Check negative test cases + if (err != nil) && tt.wantErr { + if tt.err != err.Error() { + t.Errorf("IDFromString() errors out \"%s\", want \"%s\"", err, tt.err) + } return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("IDFromString() = %v, want %v", got, tt.want) + + // Check positive test cases + if !reflect.DeepEqual(*got, tt.want) && !tt.wantErr { + t.Errorf("IDFromString() outputs %v, want %v", got, tt.want) } }) } } + +func TestDecodeFromString(t *testing.T) { + var id platform.ID + err := id.DecodeFromString("020f755c3c082000") + if err != nil { + t.Errorf(err.Error()) + } + want := []byte{48, 50, 48, 102, 55, 53, 53, 99, 51, 99, 48, 56, 50, 48, 48, 48} + got, _ := id.Encode() + if !bytes.Equal(want, got) { + t.Errorf("got ID not equal to wanted ID") + } + if id.String() != "020f755c3c082000" { + t.Errorf("expecting string representation to contain the right value") + } + if !id.Valid() { + t.Errorf("expecting ID to be a valid one") + } +} + +func TestEncode(t *testing.T) { + var id platform.ID + if _, err := id.Encode(); err == nil { + t.Errorf("encoding an invalid ID should not be possible") + } + + id.DecodeFromString("5ca1ab1eba5eba11") + want := []byte{53, 99, 97, 49, 97, 98, 49, 101, 98, 97, 53, 101, 98, 97, 49, 49} + got, _ := id.Encode() + if !bytes.Equal(want, got) { + t.Errorf("encoding error") + } + if id.String() != "5ca1ab1eba5eba11" { + t.Errorf("expecting string representation to contain the right value") + } + if !id.Valid() { + t.Errorf("expecting ID to be a valid one") + } +} + +func TestDecodeFromAllZeros(t *testing.T) { + var id platform.ID + err := id.Decode(make([]byte, platform.IDStringLength)) + if err == nil { + t.Errorf("expecting all zeros ID to not be a valid ID") + } +} + +func TestDecodeFromShorterString(t *testing.T) { + var id platform.ID + err := id.DecodeFromString("020f75") + if err == nil { + t.Errorf("expecting shorter inputs to error") + } + if id.String() != "" { + t.Errorf("expecting invalid ID to be serialized into empty string") + } +} + +func TestDecodeFromLongerString(t *testing.T) { + var id platform.ID + err := id.DecodeFromString("020f755c3c082000aaa") + if err == nil { + t.Errorf("expecting shorter inputs to error") + } + if id.String() != "" { + t.Errorf("expecting invalid ID to be serialized into empty string") + } +} + +func TestDecodeFromEmptyString(t *testing.T) { + var id platform.ID + err := id.DecodeFromString("") + if err == nil { + t.Errorf("expecting empty inputs to error") + } + if id.String() != "" { + t.Errorf("expecting invalid ID to be serialized into empty string") + } +} + +func TestMarshalling(t *testing.T) { + var id0 platform.ID + _, err := json.Marshal(id0) + if err == nil { + t.Errorf("expecting empty ID to not be a valid one") + } + + init := "ca55e77eca55e77e" + id1, err := platform.IDFromString(init) + if err != nil { + t.Errorf(err.Error()) + } + + serialized, err := json.Marshal(id1) + if err != nil { + t.Errorf(err.Error()) + } + + var id2 platform.ID + json.Unmarshal(serialized, &id2) + + bytes1, _ := id1.Encode() + bytes2, _ := id2.Encode() + + if !bytes.Equal(bytes1, bytes2) { + t.Errorf("error marshalling/unmarshalling ID") + } +} + +func TestValid(t *testing.T) { + var id platform.ID + if id.Valid() { + t.Errorf("expecting initial ID to be invalid") + } +} diff --git a/organization.go b/organization.go index e16ef71da7..dd4b73fce4 100644 --- a/organization.go +++ b/organization.go @@ -2,7 +2,7 @@ package platform import "context" -// Organization is a organization. 🎉 +// Organization is an organization. 🎉 type Organization struct { ID ID `json:"id"` Name string `json:"name"` diff --git a/prometheus/auth_service_test.go b/prometheus/auth_service_test.go index e7e5d61302..31d1cffc49 100644 --- a/prometheus/auth_service_test.go +++ b/prometheus/auth_service_test.go @@ -51,7 +51,7 @@ func TestAuthorizationService_Metrics(t *testing.T) { reg.MustRegister(svc.PrometheusCollectors()...) ctx := context.Background() - id := platform.ID{1} + id := platform.ID(1) if _, err := svc.FindAuthorizationByID(ctx, id); err != nil { t.Fatal(err) @@ -89,7 +89,8 @@ func TestAuthorizationService_Metrics(t *testing.T) { t.Fatalf("exp 1 request, got %v", got) } - if err := svc.DeleteAuthorization(ctx, nil); err != nil { + var tempID platform.ID + if err := svc.DeleteAuthorization(ctx, tempID); err != nil { t.Fatal(err) } mfs = promtest.MustGather(t, reg) @@ -137,7 +138,7 @@ func TestAuthorizationService_Metrics(t *testing.T) { t.Fatalf("exp 1 request, got %v", got) } - if err := svc.DeleteAuthorization(ctx, nil); err != forced { + if err := svc.DeleteAuthorization(ctx, tempID); err != forced { t.Fatalf("expected forced error, got %v", err) } mfs = promtest.MustGather(t, reg) diff --git a/query/execute/aggregate_test.go b/query/execute/aggregate_test.go new file mode 100644 index 0000000000..13f3e9d45e --- /dev/null +++ b/query/execute/aggregate_test.go @@ -0,0 +1,450 @@ +package execute_test + +import ( + "sort" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/influxdata/platform/query" + "github.com/influxdata/platform/query/execute" + "github.com/influxdata/platform/query/execute/executetest" + "github.com/influxdata/platform/query/functions" +) + +func TestAggregate_Process(t *testing.T) { + sumAgg := new(functions.SumAgg) + countAgg := new(functions.CountAgg) + testCases := []struct { + name string + agg execute.Aggregate + config execute.AggregateConfig + data []*executetest.Table + want []*executetest.Table + }{ + { + name: "single", + config: execute.DefaultAggregateConfig, + agg: sumAgg, + data: []*executetest.Table{{ + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(0), 0.0}, + {execute.Time(0), execute.Time(100), execute.Time(10), 1.0}, + {execute.Time(0), execute.Time(100), execute.Time(20), 2.0}, + {execute.Time(0), execute.Time(100), execute.Time(30), 3.0}, + {execute.Time(0), execute.Time(100), execute.Time(40), 4.0}, + {execute.Time(0), execute.Time(100), execute.Time(50), 5.0}, + {execute.Time(0), execute.Time(100), execute.Time(60), 6.0}, + {execute.Time(0), execute.Time(100), execute.Time(70), 7.0}, + {execute.Time(0), execute.Time(100), execute.Time(80), 8.0}, + {execute.Time(0), execute.Time(100), execute.Time(90), 9.0}, + }, + }}, + want: []*executetest.Table{{ + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(100), 45.0}, + }, + }}, + }, + { + name: "single use start time", + config: execute.AggregateConfig{ + Columns: []string{execute.DefaultValueColLabel}, + TimeSrc: execute.DefaultStartColLabel, + TimeDst: execute.DefaultTimeColLabel, + }, + agg: sumAgg, + data: []*executetest.Table{{ + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(0), 0.0}, + {execute.Time(0), execute.Time(100), execute.Time(10), 1.0}, + {execute.Time(0), execute.Time(100), execute.Time(20), 2.0}, + {execute.Time(0), execute.Time(100), execute.Time(30), 3.0}, + {execute.Time(0), execute.Time(100), execute.Time(40), 4.0}, + {execute.Time(0), execute.Time(100), execute.Time(50), 5.0}, + {execute.Time(0), execute.Time(100), execute.Time(60), 6.0}, + {execute.Time(0), execute.Time(100), execute.Time(70), 7.0}, + {execute.Time(0), execute.Time(100), execute.Time(80), 8.0}, + {execute.Time(0), execute.Time(100), execute.Time(90), 9.0}, + }, + }}, + want: []*executetest.Table{{ + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(0), 45.0}, + }, + }}, + }, + { + name: "multiple tables", + config: execute.DefaultAggregateConfig, + agg: sumAgg, + data: []*executetest.Table{ + { + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(0), 0.0}, + {execute.Time(0), execute.Time(100), execute.Time(10), 1.0}, + {execute.Time(0), execute.Time(100), execute.Time(20), 2.0}, + {execute.Time(0), execute.Time(100), execute.Time(30), 3.0}, + {execute.Time(0), execute.Time(100), execute.Time(40), 4.0}, + {execute.Time(0), execute.Time(100), execute.Time(50), 5.0}, + {execute.Time(0), execute.Time(100), execute.Time(60), 6.0}, + {execute.Time(0), execute.Time(100), execute.Time(70), 7.0}, + {execute.Time(0), execute.Time(100), execute.Time(80), 8.0}, + {execute.Time(0), execute.Time(100), execute.Time(90), 9.0}, + }, + }, + { + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(100), execute.Time(200), execute.Time(100), 10.0}, + {execute.Time(100), execute.Time(200), execute.Time(110), 11.0}, + {execute.Time(100), execute.Time(200), execute.Time(120), 12.0}, + {execute.Time(100), execute.Time(200), execute.Time(130), 13.0}, + {execute.Time(100), execute.Time(200), execute.Time(140), 14.0}, + {execute.Time(100), execute.Time(200), execute.Time(150), 15.0}, + {execute.Time(100), execute.Time(200), execute.Time(160), 16.0}, + {execute.Time(100), execute.Time(200), execute.Time(170), 17.0}, + {execute.Time(100), execute.Time(200), execute.Time(180), 18.0}, + {execute.Time(100), execute.Time(200), execute.Time(190), 19.0}, + }, + }, + }, + want: []*executetest.Table{ + { + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(100), 45.0}, + }, + }, + { + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(100), execute.Time(200), execute.Time(200), 145.0}, + }, + }, + }, + }, + { + name: "multiple tables with keyed columns", + config: execute.DefaultAggregateConfig, + agg: sumAgg, + data: []*executetest.Table{ + { + KeyCols: []string{"_start", "_stop", "t1"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "t1", Type: query.TString}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), "a", execute.Time(0), 0.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(10), 1.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(20), 2.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(30), 3.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(40), 4.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(50), 5.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(60), 6.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(70), 7.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(80), 8.0}, + {execute.Time(0), execute.Time(100), "a", execute.Time(90), 9.0}, + }, + }, + { + KeyCols: []string{"_start", "_stop", "t1"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "t1", Type: query.TString}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), "b", execute.Time(0), 0.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(10), 1.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(20), 2.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(30), 3.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(40), 4.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(50), 5.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(60), 6.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(70), 7.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(80), 8.3}, + {execute.Time(0), execute.Time(100), "b", execute.Time(90), 9.3}, + }, + }, + { + KeyCols: []string{"_start", "_stop", "t1"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "t1", Type: query.TString}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(100), execute.Time(200), "a", execute.Time(100), 10.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(110), 11.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(120), 12.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(130), 13.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(140), 14.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(150), 15.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(160), 16.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(170), 17.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(180), 18.0}, + {execute.Time(100), execute.Time(200), "a", execute.Time(190), 19.0}, + }, + }, + { + KeyCols: []string{"_start", "_stop", "t1"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "t1", Type: query.TString}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(100), execute.Time(200), "b", execute.Time(100), 10.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(110), 11.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(120), 12.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(130), 13.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(140), 14.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(150), 15.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(160), 16.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(170), 17.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(180), 18.3}, + {execute.Time(100), execute.Time(200), "b", execute.Time(190), 19.3}, + }, + }, + }, + want: []*executetest.Table{ + { + KeyCols: []string{"_start", "_stop", "t1"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "t1", Type: query.TString}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), "a", execute.Time(100), 45.0}, + }, + }, + { + KeyCols: []string{"_start", "_stop", "t1"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "t1", Type: query.TString}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(100), execute.Time(200), "a", execute.Time(200), 145.0}, + }, + }, + { + KeyCols: []string{"_start", "_stop", "t1"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "t1", Type: query.TString}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), "b", execute.Time(100), 48.0}, + }, + }, + { + KeyCols: []string{"_start", "_stop", "t1"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "t1", Type: query.TString}, + {Label: "_time", Type: query.TTime}, + {Label: "_value", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(100), execute.Time(200), "b", execute.Time(200), 148.0}, + }, + }, + }, + }, + { + name: "multiple values", + config: execute.AggregateConfig{ + Columns: []string{"x", "y"}, + TimeSrc: execute.DefaultStopColLabel, + TimeDst: execute.DefaultTimeColLabel, + }, + agg: sumAgg, + data: []*executetest.Table{{ + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "x", Type: query.TFloat}, + {Label: "y", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(0), 0.0, 0.0}, + {execute.Time(0), execute.Time(100), execute.Time(10), 1.0, -1.0}, + {execute.Time(0), execute.Time(100), execute.Time(20), 2.0, -2.0}, + {execute.Time(0), execute.Time(100), execute.Time(30), 3.0, -3.0}, + {execute.Time(0), execute.Time(100), execute.Time(40), 4.0, -4.0}, + {execute.Time(0), execute.Time(100), execute.Time(50), 5.0, -5.0}, + {execute.Time(0), execute.Time(100), execute.Time(60), 6.0, -6.0}, + {execute.Time(0), execute.Time(100), execute.Time(70), 7.0, -7.0}, + {execute.Time(0), execute.Time(100), execute.Time(80), 8.0, -8.0}, + {execute.Time(0), execute.Time(100), execute.Time(90), 9.0, -9.0}, + }, + }}, + want: []*executetest.Table{{ + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "x", Type: query.TFloat}, + {Label: "y", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(100), 45.0, -45.0}, + }, + }}, + }, + { + name: "multiple values changing types", + config: execute.AggregateConfig{ + Columns: []string{"x", "y"}, + TimeSrc: execute.DefaultStopColLabel, + TimeDst: execute.DefaultTimeColLabel, + }, + agg: countAgg, + data: []*executetest.Table{{ + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "x", Type: query.TFloat}, + {Label: "y", Type: query.TFloat}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(0), 0.0, 0.0}, + {execute.Time(0), execute.Time(100), execute.Time(10), 1.0, -1.0}, + {execute.Time(0), execute.Time(100), execute.Time(20), 2.0, -2.0}, + {execute.Time(0), execute.Time(100), execute.Time(30), 3.0, -3.0}, + {execute.Time(0), execute.Time(100), execute.Time(40), 4.0, -4.0}, + {execute.Time(0), execute.Time(100), execute.Time(50), 5.0, -5.0}, + {execute.Time(0), execute.Time(100), execute.Time(60), 6.0, -6.0}, + {execute.Time(0), execute.Time(100), execute.Time(70), 7.0, -7.0}, + {execute.Time(0), execute.Time(100), execute.Time(80), 8.0, -8.0}, + {execute.Time(0), execute.Time(100), execute.Time(90), 9.0, -9.0}, + }, + }}, + want: []*executetest.Table{{ + KeyCols: []string{"_start", "_stop"}, + ColMeta: []query.ColMeta{ + {Label: "_start", Type: query.TTime}, + {Label: "_stop", Type: query.TTime}, + {Label: "_time", Type: query.TTime}, + {Label: "x", Type: query.TInt}, + {Label: "y", Type: query.TInt}, + }, + Data: [][]interface{}{ + {execute.Time(0), execute.Time(100), execute.Time(100), int64(10), int64(10)}, + }, + }}, + }, + } + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + d := executetest.NewDataset(executetest.RandomDatasetID()) + c := execute.NewTableBuilderCache(executetest.UnlimitedAllocator) + c.SetTriggerSpec(execute.DefaultTriggerSpec) + + agg := execute.NewAggregateTransformation(d, c, tc.agg, tc.config) + + parentID := executetest.RandomDatasetID() + for _, b := range tc.data { + if err := agg.Process(parentID, b); err != nil { + t.Fatal(err) + } + } + + got, err := executetest.TablesFromCache(c) + if err != nil { + t.Fatal(err) + } + + executetest.NormalizeTables(got) + executetest.NormalizeTables(tc.want) + + sort.Sort(executetest.SortedTables(got)) + sort.Sort(executetest.SortedTables(tc.want)) + + if !cmp.Equal(tc.want, got, cmpopts.EquateNaNs()) { + t.Errorf("unexpected tables -want/+got\n%s", cmp.Diff(tc.want, got)) + } + }) + } +} diff --git a/query/functions/compspecs/compspecs.go b/query/functions/compspecs/compspecs.go index b2bc930d18..51462ee9de 100644 --- a/query/functions/compspecs/compspecs.go +++ b/query/functions/compspecs/compspecs.go @@ -16,6 +16,8 @@ import ( "github.com/influxdata/platform" "github.com/influxdata/platform/mock" "github.com/influxdata/platform/query/influxql" + "github.com/influxdata/platform/query/semantic/semantictest" + platformtesting "github.com/influxdata/platform/testing" "github.com/google/go-cmp/cmp" "golang.org/x/text/unicode/norm" @@ -92,15 +94,13 @@ func main() { var dbrpMappingSvc = mock.NewDBRPMappingService() func init() { - organizationID := platform.ID("aaaa") - bucketID := platform.ID("bbbb") mapping := platform.DBRPMapping{ Cluster: "cluster", Database: "db", RetentionPolicy: "rp", Default: true, - OrganizationID: organizationID, - BucketID: bucketID, + OrganizationID: platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa"), + BucketID: platformtesting.MustIDFromString("bbbbbbbbbbbbbbbb"), } dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { return &mapping, nil diff --git a/query/functions/query_test.go b/query/functions/query_test.go index f64d75df42..be9b9c6ca1 100644 --- a/query/functions/query_test.go +++ b/query/functions/query_test.go @@ -17,6 +17,8 @@ import ( "github.com/influxdata/platform/query" _ "github.com/influxdata/platform/query/builtin" "github.com/influxdata/platform/query/influxql" + "github.com/influxdata/platform/query/querytest" + platformtesting "github.com/influxdata/platform/testing" "github.com/andreyvit/diff" ) @@ -29,8 +31,8 @@ func init() { Database: "db0", RetentionPolicy: "autogen", Default: true, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucket"), + OrganizationID: platformtesting.MustIDFromString("cadecadecadecade"), + BucketID: platformtesting.MustIDFromString("da7aba5e5eedca5e"), } dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { return &mapping, nil diff --git a/query/influxql/spectests/testing.go b/query/influxql/spectests/testing.go index dcd475e888..37a73983b4 100644 --- a/query/influxql/spectests/testing.go +++ b/query/influxql/spectests/testing.go @@ -14,12 +14,13 @@ import ( "github.com/influxdata/platform" "github.com/influxdata/platform/mock" "github.com/influxdata/platform/query/influxql" + platformtesting "github.com/influxdata/platform/testing" ) var dbrpMappingSvc = mock.NewDBRPMappingService() -var organizationID = platform.ID("aaaa") -var bucketID = platform.ID("bbbb") -var altBucketID = platform.ID("cccc") +var organizationID platform.ID +var bucketID platform.ID +var altBucketID platform.ID func init() { mapping := platform.DBRPMapping{ @@ -83,6 +84,10 @@ func NewFixture(stmt string, spec *flux.Spec) Fixture { } func (f *fixture) Run(t *testing.T) { + organizationID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa") + bucketID = platformtesting.MustIDFromString("bbbbbbbbbbbbbbbb") + altBucketID = platformtesting.MustIDFromString("cccccccccccccccc") + t.Run(f.stmt, func(t *testing.T) { if err := f.spec.Validate(); err != nil { t.Fatalf("%s:%d: expected spec is not valid: %s", f.file, f.line, err) diff --git a/query/influxql/transpiler_test.go b/query/influxql/transpiler_test.go index 0ef493af7e..8573c68f58 100644 --- a/query/influxql/transpiler_test.go +++ b/query/influxql/transpiler_test.go @@ -9,6 +9,7 @@ import ( "github.com/influxdata/platform/mock" "github.com/influxdata/platform/query/influxql" "github.com/influxdata/platform/query/influxql/spectests" + platformtesting "github.com/influxdata/platform/testing" "github.com/pkg/errors" ) @@ -20,8 +21,8 @@ func init() { Database: "db0", RetentionPolicy: "autogen", Default: true, - OrganizationID: platform.ID("aaaa"), - BucketID: platform.ID("bbbb"), + OrganizationID: platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa"), + BucketID: platformtesting.MustIDFromString("bbbbbbbbbbbbbbbb"), } dbrpMappingSvc.FindByFn = func(ctx context.Context, cluster string, db string, rp string) (*platform.DBRPMapping, error) { return &mapping, nil diff --git a/snowflake/id.go b/snowflake/id.go index c6db64c129..509fb4a6e3 100644 --- a/snowflake/id.go +++ b/snowflake/id.go @@ -1,7 +1,6 @@ package snowflake import ( - "encoding/binary" "errors" "math/rand" "sync" @@ -57,7 +56,7 @@ func NewDefaultIDGenerator() *IDGenerator { return NewIDGenerator() } -// IDGenerator generates a new ID. +// IDGenerator holds the ID generator. type IDGenerator struct { Generator *snowflake.Generator } @@ -87,8 +86,12 @@ func NewIDGenerator(opts ...IDGeneratorOp) *IDGenerator { // ID returns the next platform.ID from an IDGenerator. func (g *IDGenerator) ID() platform.ID { - id := make(platform.ID, 8) - i := g.Generator.Next() - binary.BigEndian.PutUint64(id, i) + var id platform.ID + for { + id = platform.ID(g.Generator.Next()) + if id.Valid() { + break + } + } return id } diff --git a/snowflake/id_test.go b/snowflake/id_test.go index 6ba9d789f5..d120dc8fca 100644 --- a/snowflake/id_test.go +++ b/snowflake/id_test.go @@ -1,16 +1,19 @@ package snowflake import ( - "bytes" "testing" "github.com/influxdata/platform" ) -func TestIDLength(t *testing.T) { +func TestIDStringLength(t *testing.T) { gen := NewIDGenerator() id := gen.ID() - if len(id) != 8 { + if !id.Valid() { + t.Fail() + } + enc, _ := id.Encode() + if len(enc) != platform.IDStringLength { t.Fail() } } @@ -21,7 +24,7 @@ func TestToFromString(t *testing.T) { var clone platform.ID if err := clone.DecodeFromString(id.String()); err != nil { t.Error(err) - } else if !bytes.Equal(id, clone) { + } else if id != clone { t.Errorf("id started as %x but got back %x", id, clone) } } diff --git a/task/backend/executor/executor_test.go b/task/backend/executor/executor_test.go index 6baa703dec..20a29b5552 100644 --- a/task/backend/executor/executor_test.go +++ b/task/backend/executor/executor_test.go @@ -20,6 +20,7 @@ import ( _ "github.com/influxdata/platform/query/builtin" "github.com/influxdata/platform/task/backend" "github.com/influxdata/platform/task/backend/executor" + platformtesting "github.com/influxdata/platform/testing" "go.uber.org/zap" ) @@ -250,13 +251,15 @@ const testScript = `option task = { from(bucket: "one") |> toHTTP(url: "http://example.com")` func testExecutorQuerySuccess(t *testing.T, fn createSysFn) { + var orgID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa") + var userID = platformtesting.MustIDFromString("baaaaaaaaaaaaaab") sys := fn() t.Run(sys.name+"/QuerySuccess", func(t *testing.T) { - tid, err := sys.st.CreateTask(context.Background(), platform.ID("org"), platform.ID("user"), testScript, 0) + tid, err := sys.st.CreateTask(context.Background(), orgID, userID, testScript) if err != nil { t.Fatal(err) } - qr := backend.QueuedRun{TaskID: tid, RunID: platform.ID{1}, Now: 123} + qr := backend.QueuedRun{TaskID: *tid, RunID: platform.ID(1), Now: 123} rp, err := sys.ex.Execute(context.Background(), qr) if err != nil { t.Fatal(err) @@ -300,13 +303,15 @@ func testExecutorQuerySuccess(t *testing.T, fn createSysFn) { } func testExecutorQueryFailure(t *testing.T, fn createSysFn) { + var orgID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa") + var userID = platformtesting.MustIDFromString("baaaaaaaaaaaaaab") sys := fn() t.Run(sys.name+"/QueryFail", func(t *testing.T) { - tid, err := sys.st.CreateTask(context.Background(), platform.ID("org"), platform.ID("user"), testScript, 0) + tid, err := sys.st.CreateTask(context.Background(), orgID, userID, testScript) if err != nil { t.Fatal(err) } - qr := backend.QueuedRun{TaskID: tid, RunID: platform.ID{1}, Now: 123} + qr := backend.QueuedRun{TaskID: *tid, RunID: platform.ID(1), Now: 123} rp, err := sys.ex.Execute(context.Background(), qr) if err != nil { t.Fatal(err) @@ -326,13 +331,15 @@ func testExecutorQueryFailure(t *testing.T, fn createSysFn) { } func testExecutorPromiseCancel(t *testing.T, fn createSysFn) { + var orgID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa") + var userID = platformtesting.MustIDFromString("baaaaaaaaaaaaaab") sys := fn() t.Run(sys.name+"/PromiseCancel", func(t *testing.T) { - tid, err := sys.st.CreateTask(context.Background(), platform.ID("org"), platform.ID("user"), testScript, 0) + tid, err := sys.st.CreateTask(context.Background(), orgID, userID, testScript) if err != nil { t.Fatal(err) } - qr := backend.QueuedRun{TaskID: tid, RunID: platform.ID{1}, Now: 123} + qr := backend.QueuedRun{TaskID: *tid, RunID: platform.ID(1), Now: 123} rp, err := sys.ex.Execute(context.Background(), qr) if err != nil { t.Fatal(err) @@ -351,13 +358,15 @@ func testExecutorPromiseCancel(t *testing.T, fn createSysFn) { } func testExecutorServiceError(t *testing.T, fn createSysFn) { + var orgID = platformtesting.MustIDFromString("aaaaaaaaaaaaaaaa") + var userID = platformtesting.MustIDFromString("baaaaaaaaaaaaaab") sys := fn() t.Run(sys.name+"/ServiceError", func(t *testing.T) { - tid, err := sys.st.CreateTask(context.Background(), platform.ID("org"), platform.ID("user"), testScript, 0) + tid, err := sys.st.CreateTask(context.Background(), orgID, userID, testScript) if err != nil { t.Fatal(err) } - qr := backend.QueuedRun{TaskID: tid, RunID: platform.ID{1}, Now: 123} + qr := backend.QueuedRun{TaskID: *tid, RunID: platform.ID(1), Now: 123} var forced = errors.New("forced") sys.svc.FailNextQuery(forced) diff --git a/task/backend/inmem_store.go b/task/backend/inmem_store.go index bf2a317a99..c422b3c7b9 100644 --- a/task/backend/inmem_store.go +++ b/task/backend/inmem_store.go @@ -66,7 +66,7 @@ func (s *inmem) CreateTask(_ context.Context, org, user platform.ID, script stri Delay: int32(o.Delay / time.Second), } - return id, nil + return &id, nil } func (s *inmem) ModifyTask(_ context.Context, id platform.ID, script string) error { @@ -79,7 +79,7 @@ func (s *inmem) ModifyTask(_ context.Context, id platform.ID, script string) err defer s.mu.Unlock() for n, t := range s.tasks { - if !bytes.Equal(t.ID, id) { + if t.ID != id { continue } @@ -93,7 +93,7 @@ func (s *inmem) ModifyTask(_ context.Context, id platform.ID, script string) err } func (s *inmem) ListTasks(_ context.Context, params TaskSearchParams) ([]StoreTask, error) { - if len(params.Org) > 0 && len(params.User) > 0 { + if params.Org.Valid() && params.User.Valid() { return nil, errors.New("ListTasks: org and user filters are mutually exclusive") } @@ -124,13 +124,19 @@ func (s *inmem) ListTasks(_ context.Context, params TaskSearchParams) ([]StoreTa defer s.mu.RUnlock() for _, t := range s.tasks { - if len(after) > 0 && bytes.Compare(after, t.ID) >= 0 { + taskIDBytes, err := t.ID.Encode() + if err != nil { + return nil, err + } + afterBytes, _ := after.Encode() + + if bytes.Compare(afterBytes, taskIDBytes) >= 0 { continue } - if len(org) > 0 && !bytes.Equal(org, t.Org) { + if org.Valid() && org != t.Org { continue } - if len(user) > 0 && !bytes.Equal(user, t.User) { + if user.Valid() && user != t.User { continue } @@ -148,7 +154,7 @@ func (s *inmem) FindTaskByID(_ context.Context, id platform.ID) (*StoreTask, err defer s.mu.RUnlock() for _, t := range s.tasks { - if bytes.Equal(t.ID, id) { + if t.ID == id { // Return a copy of the task. task := new(StoreTask) *task = t @@ -230,7 +236,7 @@ func (s *inmem) DeleteTask(_ context.Context, id platform.ID) (deleted bool, err idx := -1 for i, t := range s.tasks { - if bytes.Equal(t.ID, id) { + if t.ID == id { idx = i break } @@ -317,7 +323,7 @@ func (s *inmem) delete(ctx context.Context, id platform.ID, f func(StoreTask) pl newTasks := []StoreTask{} deletingTasks := []platform.ID{} for i := range s.tasks { - if !bytes.Equal(f(s.tasks[i]), id) { + if f(s.tasks[i]) != id { newTasks = append(newTasks, s.tasks[i]) } else { deletingTasks = append(deletingTasks, s.tasks[i].ID) diff --git a/task/backend/scheduler_test.go b/task/backend/scheduler_test.go index 80c66c61d5..a465d64263 100644 --- a/task/backend/scheduler_test.go +++ b/task/backend/scheduler_test.go @@ -25,7 +25,7 @@ func TestScheduler_StartScriptOnClaim(t *testing.T) { defer o.Stop() task := &backend.StoreTask{ - ID: platform.ID{1}, + ID: platform.ID(1), } meta := &backend.StoreTaskMeta{ MaxConcurrency: 1, @@ -44,7 +44,7 @@ func TestScheduler_StartScriptOnClaim(t *testing.T) { // For every second, can queue for timestamps 4 and 5. task = &backend.StoreTask{ - ID: platform.ID{2}, + ID: platform.ID(2), } meta = &backend.StoreTaskMeta{ MaxConcurrency: 99, @@ -99,7 +99,7 @@ func TestScheduler_CreateNextRunOnTick(t *testing.T) { defer o.Stop() task := &backend.StoreTask{ - ID: platform.ID{1}, + ID: platform.ID(1), } meta := &backend.StoreTaskMeta{ MaxConcurrency: 2, @@ -169,7 +169,7 @@ func TestScheduler_Release(t *testing.T) { defer o.Stop() task := &backend.StoreTask{ - ID: platform.ID{1}, + ID: platform.ID(1), } meta := &backend.StoreTaskMeta{ MaxConcurrency: 99, @@ -205,7 +205,7 @@ func TestScheduler_Queue(t *testing.T) { defer o.Stop() task := &backend.StoreTask{ - ID: platform.ID{1}, + ID: platform.ID(1), } meta := &backend.StoreTaskMeta{ MaxConcurrency: 1, @@ -418,7 +418,7 @@ func TestScheduler_Metrics(t *testing.T) { // Claim a task that starts later. task := &backend.StoreTask{ - ID: platform.ID{1}, + ID: platform.ID(1), } meta := &backend.StoreTaskMeta{ MaxConcurrency: 99, diff --git a/task/backend/store.go b/task/backend/store.go index a9b4ce0a43..9af703dc98 100644 --- a/task/backend/store.go +++ b/task/backend/store.go @@ -256,10 +256,10 @@ func (StoreValidation) CreateArgs(org, user platform.ID, script string) (options } } - if len(org) == 0 { + if !org.Valid() { missing = append(missing, "organization ID") } - if len(user) == 0 { + if !user.Valid() { missing = append(missing, "user ID") } @@ -286,7 +286,7 @@ func (StoreValidation) ModifyArgs(taskID platform.ID, script string) (options.Op } } - if len(taskID) == 0 { + if !taskID.Valid() { missing = append(missing, "task ID") } diff --git a/task/mock/scheduler.go b/task/mock/scheduler.go index 5a956b3ddb..782946fb86 100644 --- a/task/mock/scheduler.go +++ b/task/mock/scheduler.go @@ -2,7 +2,6 @@ package mock import ( - "bytes" "context" "encoding/binary" "errors" @@ -134,7 +133,7 @@ func (s *Scheduler) ReleaseError(err error) { type DesiredState struct { mu sync.Mutex // Map of stringified task ID to last ID used for run. - runIDs map[string]uint32 + runIDs map[string]uint64 // Map of stringified, concatenated task and platform ID, to runs that have been created. created map[string]backend.QueuedRun @@ -147,7 +146,7 @@ var _ backend.DesiredState = (*DesiredState)(nil) func NewDesiredState() *DesiredState { return &DesiredState{ - runIDs: make(map[string]uint32), + runIDs: make(map[string]uint64), created: make(map[string]backend.QueuedRun), meta: make(map[string]backend.StoreTaskMeta), } @@ -217,7 +216,7 @@ func (d *DesiredState) CreatedFor(taskID platform.ID) []backend.QueuedRun { var qrs []backend.QueuedRun for _, qr := range d.created { - if bytes.Equal(qr.TaskID, taskID) { + if qr.TaskID == taskID { qrs = append(qrs, qr) } } @@ -289,7 +288,7 @@ func (e *Executor) RunningFor(taskID platform.ID) []*RunPromise { var rps []*RunPromise for _, rp := range e.running { - if bytes.Equal(rp.Run().TaskID, taskID) { + if rp.Run().TaskID == taskID { rps = append(rps, rp) } } diff --git a/task/platform_adapter.go b/task/platform_adapter.go index e93751e452..9d85c8a2e1 100644 --- a/task/platform_adapter.go +++ b/task/platform_adapter.go @@ -79,7 +79,7 @@ func (p pAdapter) CreateTask(ctx context.Context, t *platform.Task) error { if err != nil { return err } - t.ID = id + t.ID = *id t.Every = opts.Every.String() t.Cron = opts.Cron @@ -172,8 +172,8 @@ func toPlatformTask(t backend.StoreTask) (*platform.Task, error) { Name: t.Name, Status: "", // TODO: set and update status Owner: platform.User{ - ID: append([]byte(nil), t.User...), // Copy just in case. - Name: "", // TODO(mr): how to get owner name? + ID: t.User, + Name: "", // TODO(mr): how to get owner name? }, Flux: t.Script, Cron: opts.Cron, diff --git a/testing/auth.go b/testing/auth.go index f5010c72bf..859ad0d3af 100644 --- a/testing/auth.go +++ b/testing/auth.go @@ -110,7 +110,7 @@ func CreateAuthorization( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, }, }, @@ -126,8 +126,8 @@ func CreateAuthorization( wants: wants{ authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "rand", Status: platform.Active, User: "cooluser", @@ -151,17 +151,17 @@ func CreateAuthorization( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "regularuser", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, Authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "supersecret", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -181,8 +181,8 @@ func CreateAuthorization( wants: wants{ authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), User: "cooluser", Status: platform.Active, Token: "supersecret", @@ -192,9 +192,8 @@ func CreateAuthorization( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), - Status: platform.Active, + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), User: "regularuser", Token: "rand", Permissions: []platform.Permission{ @@ -221,7 +220,9 @@ func CreateAuthorization( t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error()) } } + // if tt.args.authorization.ID != nil { defer s.DeleteAuthorization(ctx, tt.args.authorization.ID) + // } authorizations, _, err := s.FindAuthorizations(ctx, platform.AuthorizationFilter{}) if err != nil { @@ -259,17 +260,17 @@ func FindAuthorizationByID( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "regularuser", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, Authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "rand1", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -277,8 +278,8 @@ func FindAuthorizationByID( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), Token: "rand2", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -287,12 +288,12 @@ func FindAuthorizationByID( }, }, args: args{ - id: idFromString(t, authTwoID), + id: MustIDFromString(authTwoID), }, wants: wants{ authorization: &platform.Authorization{ - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), User: "regularuser", Status: platform.Active, Token: "rand2", @@ -353,17 +354,17 @@ func FindAuthorizationByToken( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "regularuser", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, Authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "rand1", Status: platform.Inactive, Permissions: []platform.Permission{ @@ -372,8 +373,8 @@ func FindAuthorizationByToken( }, }, { - ID: idFromString(t, authZeroID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authZeroID), + UserID: MustIDFromString(userOneID), Token: "rand0", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -381,16 +382,16 @@ func FindAuthorizationByToken( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), Token: "rand2", Permissions: []platform.Permission{ platform.CreateUserPermission, }, }, { - ID: idFromString(t, authThreeID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authThreeID), + UserID: MustIDFromString(userOneID), Token: "rand3", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -404,9 +405,8 @@ func FindAuthorizationByToken( }, wants: wants{ authorization: &platform.Authorization{ - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), - Status: platform.Inactive, + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), User: "cooluser", Token: "rand1", Permissions: []platform.Permission{ @@ -469,17 +469,17 @@ func FindAuthorizations( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "regularuser", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, Authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "rand1", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -487,9 +487,8 @@ func FindAuthorizations( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), - Status: platform.Active, + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), Token: "rand2", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -501,8 +500,8 @@ func FindAuthorizations( wants: wants{ authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), User: "cooluser", Token: "rand1", Status: platform.Active, @@ -512,8 +511,8 @@ func FindAuthorizations( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), User: "regularuser", Token: "rand2", Status: platform.Active, @@ -530,17 +529,17 @@ func FindAuthorizations( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "regularuser", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, Authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "rand1", Status: platform.Active, Permissions: []platform.Permission{ @@ -549,16 +548,16 @@ func FindAuthorizations( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), Token: "rand2", Permissions: []platform.Permission{ platform.CreateUserPermission, }, }, { - ID: idFromString(t, authThreeID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authThreeID), + UserID: MustIDFromString(userOneID), Token: "rand3", Permissions: []platform.Permission{ platform.DeleteUserPermission, @@ -567,13 +566,13 @@ func FindAuthorizations( }, }, args: args{ - UserID: idFromString(t, userOneID), + UserID: MustIDFromString(userOneID), }, wants: wants{ authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), User: "cooluser", Status: platform.Active, Token: "rand1", @@ -583,8 +582,8 @@ func FindAuthorizations( }, }, { - ID: idFromString(t, authThreeID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authThreeID), + UserID: MustIDFromString(userOneID), User: "cooluser", Status: platform.Active, Token: "rand3", @@ -601,25 +600,25 @@ func FindAuthorizations( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "regularuser", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, Authorizations: []*platform.Authorization{ { - ID: idFromString(t, authZeroID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authZeroID), + UserID: MustIDFromString(userOneID), Token: "rand1", Permissions: []platform.Permission{ platform.DeleteUserPermission, }, }, { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "rand1", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -627,16 +626,16 @@ func FindAuthorizations( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), Token: "rand2", Permissions: []platform.Permission{ platform.CreateUserPermission, }, }, { - ID: idFromString(t, authThreeID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authThreeID), + UserID: MustIDFromString(userOneID), Token: "rand3", Permissions: []platform.Permission{ platform.DeleteUserPermission, @@ -650,8 +649,8 @@ func FindAuthorizations( wants: wants{ authorizations: []*platform.Authorization{ { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), User: "regularuser", Token: "rand2", Status: platform.Active, @@ -671,10 +670,10 @@ func FindAuthorizations( ctx := context.TODO() filter := platform.AuthorizationFilter{} - if tt.args.ID != nil { + if tt.args.ID.Valid() { filter.ID = &tt.args.ID } - if tt.args.UserID != nil { + if tt.args.UserID.Valid() { filter.UserID = &tt.args.UserID } if tt.args.token != "" { @@ -724,17 +723,17 @@ func DeleteAuthorization( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "regularuser", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, Authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "rand1", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -742,8 +741,8 @@ func DeleteAuthorization( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), Token: "rand2", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -752,13 +751,13 @@ func DeleteAuthorization( }, }, args: args{ - ID: idFromString(t, authOneID), + ID: MustIDFromString(authOneID), }, wants: wants{ authorizations: []*platform.Authorization{ { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), User: "regularuser", Status: platform.Active, Token: "rand2", @@ -775,17 +774,17 @@ func DeleteAuthorization( Users: []*platform.User{ { Name: "cooluser", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "regularuser", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, Authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), Token: "rand1", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -793,8 +792,8 @@ func DeleteAuthorization( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), Token: "rand2", Permissions: []platform.Permission{ platform.CreateUserPermission, @@ -803,14 +802,14 @@ func DeleteAuthorization( }, }, args: args{ - ID: idFromString(t, authThreeID), + ID: MustIDFromString(authThreeID), }, wants: wants{ err: fmt.Errorf("authorization not found"), authorizations: []*platform.Authorization{ { - ID: idFromString(t, authOneID), - UserID: idFromString(t, userOneID), + ID: MustIDFromString(authOneID), + UserID: MustIDFromString(userOneID), User: "cooluser", Token: "rand1", Status: platform.Active, @@ -820,8 +819,8 @@ func DeleteAuthorization( }, }, { - ID: idFromString(t, authTwoID), - UserID: idFromString(t, userTwoID), + ID: MustIDFromString(authTwoID), + UserID: MustIDFromString(userTwoID), User: "regularuser", Token: "rand2", Status: platform.Active, @@ -839,7 +838,7 @@ func DeleteAuthorization( s, done := init(tt.fields, t) defer done() ctx := context.TODO() - err := s.DeleteAuthorization(ctx, platform.ID(tt.args.ID)) + err := s.DeleteAuthorization(ctx, tt.args.ID) if (err != nil) != (tt.wants.err != nil) { t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err) } diff --git a/testing/bucket_service.go b/testing/bucket_service.go index 04c095674e..a34269a105 100644 --- a/testing/bucket_service.go +++ b/testing/bucket_service.go @@ -112,22 +112,22 @@ func CreateBucket( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, }, args: args{ bucket: &platform.Bucket{ Name: "name1", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, }, wants: wants{ buckets: []*platform.Bucket{ { Name: "name1", - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", }, }, @@ -138,46 +138,46 @@ func CreateBucket( fields: BucketFields{ IDGenerator: &mock.IDGenerator{ IDFn: func() platform.ID { - return idFromString(t, bucketTwoID) + return MustIDFromString(bucketTwoID) }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), + ID: MustIDFromString(bucketOneID), Name: "bucket1", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, }, Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, { Name: "otherorg", - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), }, }, }, args: args{ bucket: &platform.Bucket{ Name: "bucket2", - OrganizationID: idFromString(t, orgTwoID), + OrganizationID: MustIDFromString(orgTwoID), }, }, wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), + ID: MustIDFromString(bucketOneID), Name: "bucket1", Organization: "theorg", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, { - ID: idFromString(t, bucketTwoID), + ID: MustIDFromString(bucketTwoID), Name: "bucket2", Organization: "otherorg", - OrganizationID: idFromString(t, orgTwoID), + OrganizationID: MustIDFromString(orgTwoID), }, }, }, @@ -187,24 +187,24 @@ func CreateBucket( fields: BucketFields{ IDGenerator: &mock.IDGenerator{ IDFn: func() platform.ID { - return idFromString(t, bucketTwoID) + return MustIDFromString(bucketTwoID) }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), + ID: MustIDFromString(bucketOneID), Name: "bucket1", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, }, Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, { Name: "otherorg", - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), }, }, }, @@ -217,16 +217,16 @@ func CreateBucket( wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), + ID: MustIDFromString(bucketOneID), Name: "bucket1", Organization: "theorg", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, { - ID: idFromString(t, bucketTwoID), + ID: MustIDFromString(bucketTwoID), Name: "bucket2", Organization: "otherorg", - OrganizationID: idFromString(t, orgTwoID), + OrganizationID: MustIDFromString(orgTwoID), }, }, }, @@ -236,40 +236,40 @@ func CreateBucket( fields: BucketFields{ IDGenerator: &mock.IDGenerator{ IDFn: func() platform.ID { - return idFromString(t, bucketTwoID) + return MustIDFromString(bucketTwoID) }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), + ID: MustIDFromString(bucketOneID), Name: "bucket1", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, }, Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, { Name: "otherorg", - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), }, }, }, args: args{ bucket: &platform.Bucket{ Name: "bucket1", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, }, wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), + ID: MustIDFromString(bucketOneID), Name: "bucket1", Organization: "theorg", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, }, err: fmt.Errorf("bucket with name bucket1 already exists"), @@ -280,46 +280,46 @@ func CreateBucket( fields: BucketFields{ IDGenerator: &mock.IDGenerator{ IDFn: func() platform.ID { - return idFromString(t, bucketTwoID) + return MustIDFromString(bucketTwoID) }, }, Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, { Name: "otherorg", - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), + ID: MustIDFromString(bucketOneID), Name: "bucket1", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, }, }, args: args{ bucket: &platform.Bucket{ Name: "bucket1", - OrganizationID: idFromString(t, orgTwoID), + OrganizationID: MustIDFromString(orgTwoID), }, }, wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), + ID: MustIDFromString(bucketOneID), Name: "bucket1", Organization: "theorg", - OrganizationID: idFromString(t, orgOneID), + OrganizationID: MustIDFromString(orgOneID), }, { - ID: idFromString(t, bucketTwoID), + ID: MustIDFromString(bucketTwoID), Name: "bucket1", Organization: "otherorg", - OrganizationID: idFromString(t, orgTwoID), + OrganizationID: MustIDFromString(orgTwoID), }, }, }, @@ -344,7 +344,11 @@ func CreateBucket( t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error()) } } + + // Delete only newly created buckets - ie., with a not nil ID + // if tt.args.bucket.ID.Valid() { defer s.DeleteBucket(ctx, tt.args.bucket.ID) + // } buckets, _, err := s.FindBuckets(ctx, platform.BucketFilter{}) if err != nil { @@ -381,30 +385,30 @@ func FindBucketByID( fields: BucketFields{ Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "bucket1", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Name: "bucket2", }, }, Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, }, args: args{ - id: idFromString(t, bucketTwoID), + id: MustIDFromString(bucketTwoID), }, wants: wants{ bucket: &platform.Bucket{ - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "bucket2", }, @@ -464,22 +468,22 @@ func FindBuckets( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, { Name: "otherorg", - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgTwoID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgTwoID), Name: "xyz", }, }, @@ -488,14 +492,14 @@ func FindBuckets( wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "abc", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgTwoID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgTwoID), Organization: "otherorg", Name: "xyz", }, @@ -508,27 +512,27 @@ func FindBuckets( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, { Name: "otherorg", - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgTwoID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgTwoID), Name: "xyz", }, { - ID: idFromString(t, bucketThreeID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketThreeID), + OrganizationID: MustIDFromString(orgOneID), Name: "123", }, }, @@ -539,14 +543,14 @@ func FindBuckets( wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "abc", }, { - ID: idFromString(t, bucketThreeID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketThreeID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "123", }, @@ -559,45 +563,45 @@ func FindBuckets( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, { Name: "otherorg", - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgTwoID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgTwoID), Name: "xyz", }, { - ID: idFromString(t, bucketThreeID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketThreeID), + OrganizationID: MustIDFromString(orgOneID), Name: "123", }, }, }, args: args{ - organizationID: idFromString(t, orgOneID), + organizationID: MustIDFromString(orgOneID), }, wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "abc", }, { - ID: idFromString(t, bucketThreeID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketThreeID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "123", }, @@ -610,30 +614,30 @@ func FindBuckets( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Name: "xyz", }, }, }, args: args{ - ID: idFromString(t, bucketTwoID), + ID: MustIDFromString(bucketTwoID), }, wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "xyz", }, @@ -646,18 +650,18 @@ func FindBuckets( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Name: "xyz", }, }, @@ -668,8 +672,8 @@ func FindBuckets( wants: wants{ buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "xyz", }, @@ -685,10 +689,10 @@ func FindBuckets( ctx := context.TODO() filter := platform.BucketFilter{} - if tt.args.ID != nil { + if tt.args.ID.Valid() { filter.ID = &tt.args.ID } - if tt.args.organizationID != nil { + if tt.args.organizationID.Valid() { filter.OrganizationID = &tt.args.organizationID } if tt.args.organization != "" { @@ -741,31 +745,31 @@ func DeleteBucket( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, Buckets: []*platform.Bucket{ { Name: "A", - ID: platform.ID("abc"), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), }, { Name: "B", - ID: platform.ID("xyz"), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketThreeID), + OrganizationID: MustIDFromString(orgOneID), }, }, }, args: args{ - ID: "abc", + ID: bucketOneID, }, wants: wants{ buckets: []*platform.Bucket{ { Name: "B", - ID: platform.ID("xyz"), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketThreeID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", }, }, @@ -777,38 +781,38 @@ func DeleteBucket( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, Buckets: []*platform.Bucket{ { Name: "A", - ID: platform.ID("abc"), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), }, { Name: "B", - ID: platform.ID("xyz"), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketThreeID), + OrganizationID: MustIDFromString(orgOneID), }, }, }, args: args{ - ID: "123", + ID: "1234567890654321", }, wants: wants{ err: fmt.Errorf("bucket not found"), buckets: []*platform.Bucket{ { Name: "A", - ID: platform.ID("abc"), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", }, { Name: "B", - ID: platform.ID("xyz"), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketThreeID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", }, }, @@ -821,7 +825,7 @@ func DeleteBucket( s, done := init(tt.fields, t) defer done() ctx := context.TODO() - err := s.DeleteBucket(ctx, platform.ID(tt.args.ID)) + err := s.DeleteBucket(ctx, MustIDFromString(tt.args.ID)) if (err != nil) != (tt.wants.err != nil) { t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err) } @@ -871,30 +875,30 @@ func FindBucket( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Name: "xyz", }, }, }, args: args{ name: "abc", - organizationID: idFromString(t, orgOneID), + organizationID: MustIDFromString(orgOneID), }, wants: wants{ bucket: &platform.Bucket{ - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "abc", }, @@ -911,7 +915,7 @@ func FindBucket( if tt.args.name != "" { filter.Name = &tt.args.name } - if tt.args.organizationID != nil { + if tt.args.organizationID.Valid() { filter.OrganizationID = &tt.args.organizationID } @@ -960,30 +964,30 @@ func UpdateBucket( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "bucket1", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Name: "bucket2", }, }, }, args: args{ - id: idFromString(t, bucketOneID), + id: MustIDFromString(bucketOneID), name: "changed", }, wants: wants{ bucket: &platform.Bucket{ - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "changed", }, @@ -995,30 +999,30 @@ func UpdateBucket( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "bucket1", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Name: "bucket2", }, }, }, args: args{ - id: idFromString(t, bucketOneID), + id: MustIDFromString(bucketOneID), retention: 100, }, wants: wants{ bucket: &platform.Bucket{ - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "bucket1", RetentionPeriod: 100 * time.Minute, @@ -1031,31 +1035,31 @@ func UpdateBucket( Organizations: []*platform.Organization{ { Name: "theorg", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, Buckets: []*platform.Bucket{ { - ID: idFromString(t, bucketOneID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketOneID), + OrganizationID: MustIDFromString(orgOneID), Name: "bucket1", }, { - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Name: "bucket2", }, }, }, args: args{ - id: idFromString(t, bucketTwoID), + id: MustIDFromString(bucketTwoID), retention: 101, name: "changed", }, wants: wants{ bucket: &platform.Bucket{ - ID: idFromString(t, bucketTwoID), - OrganizationID: idFromString(t, orgOneID), + ID: MustIDFromString(bucketTwoID), + OrganizationID: MustIDFromString(orgOneID), Organization: "theorg", Name: "changed", RetentionPeriod: 101 * time.Minute, diff --git a/testing/dbrp_mapping.go b/testing/dbrp_mapping.go index b3fec829e1..8aaed8ce39 100644 --- a/testing/dbrp_mapping.go +++ b/testing/dbrp_mapping.go @@ -11,6 +11,16 @@ import ( "github.com/pkg/errors" ) +const ( + dbrpOrg1ID = "ba55ba55ba55ba55" + dbrpOrg2ID = "beadbeadbeadbead" + dbrpOrg3ID = "1005e1eaf1005e1e" + dbrpBucket1ID = "cab00d1ecab00d1e" + dbrpBucket2ID = "ca1fca1fca1fca1f" + dbrpBucketAID = "a55e55eda55e55ed" + dbrpBucketBID = "b1077edb1077eded" +) + var dbrpMappingCmpOptions = cmp.Options{ cmp.Comparer(func(x, y []byte) bool { return bytes.Equal(x, y) @@ -91,8 +101,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, }, wants: wants{ @@ -101,8 +111,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }}, }, }, @@ -114,8 +124,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }}, }, args: args{ @@ -124,8 +134,8 @@ func CreateDBRPMapping( Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, wants: wants{ @@ -135,16 +145,16 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, { Cluster: "cluster2", Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, }, @@ -157,8 +167,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }}, }, args: args{ @@ -167,8 +177,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, }, wants: wants{ @@ -178,8 +188,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, }, }, @@ -192,8 +202,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }}, }, args: args{ @@ -202,8 +212,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: true, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, }, wants: wants{ @@ -214,8 +224,8 @@ func CreateDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, }, }, @@ -277,16 +287,16 @@ func FindDBRPMappings( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, { Cluster: "cluster2", Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, }, @@ -300,16 +310,16 @@ func FindDBRPMappings( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, { Cluster: "cluster2", Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, }, @@ -323,16 +333,16 @@ func FindDBRPMappings( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, { Cluster: "cluster2", Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, }, @@ -348,8 +358,8 @@ func FindDBRPMappings( Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, }, @@ -363,16 +373,16 @@ func FindDBRPMappings( Database: "database", RetentionPolicy: "retention_policyA", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketA"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketAID), }, { Cluster: "cluster", Database: "database", RetentionPolicy: "retention_policyB", Default: true, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketB"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketBID), }, }, }, @@ -390,8 +400,8 @@ func FindDBRPMappings( Database: "database", RetentionPolicy: "retention_policyB", Default: true, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketB"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketBID), }, }, }, @@ -453,16 +463,16 @@ func FindDBRPMappingByKey( Database: "database", RetentionPolicy: "retention_policyA", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketA"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketAID), }, { Cluster: "cluster", Database: "database", RetentionPolicy: "retention_policyB", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketB"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketBID), }, }, }, @@ -477,8 +487,8 @@ func FindDBRPMappingByKey( Database: "database", RetentionPolicy: "retention_policyB", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketB"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketBID), }, }, }, @@ -491,8 +501,8 @@ func FindDBRPMappingByKey( Database: "database", RetentionPolicy: "retention_policyA", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketA"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketAID), }, }, }, @@ -560,16 +570,16 @@ func FindDBRPMapping( Database: "database", RetentionPolicy: "retention_policyA", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketA"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketAID), }, { Cluster: "cluster", Database: "database", RetentionPolicy: "retention_policyB", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketB"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketBID), }, }, }, @@ -586,8 +596,8 @@ func FindDBRPMapping( Database: "database", RetentionPolicy: "retention_policyB", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketB"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketBID), }, }, }, @@ -600,16 +610,16 @@ func FindDBRPMapping( Database: "database", RetentionPolicy: "retention_policyA", Default: false, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketA"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketAID), }, { Cluster: "cluster", Database: "database", RetentionPolicy: "retention_policyB", Default: true, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketB"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketBID), }, }, }, @@ -626,8 +636,8 @@ func FindDBRPMapping( Database: "database", RetentionPolicy: "retention_policyB", Default: true, - OrganizationID: platform.ID("org"), - BucketID: platform.ID("bucketB"), + OrganizationID: MustIDFromString(dbrpOrg3ID), + BucketID: MustIDFromString(dbrpBucketBID), }, }, }, @@ -685,16 +695,16 @@ func DeleteDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, { Cluster: "cluster2", Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, }, @@ -709,8 +719,8 @@ func DeleteDBRPMapping( Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }}, }, }, @@ -723,16 +733,16 @@ func DeleteDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, { Cluster: "cluster2", Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, }, @@ -748,16 +758,16 @@ func DeleteDBRPMapping( Database: "database1", RetentionPolicy: "retention_policy1", Default: false, - OrganizationID: platform.ID("org1"), - BucketID: platform.ID("bucket1"), + OrganizationID: MustIDFromString(dbrpOrg1ID), + BucketID: MustIDFromString(dbrpBucket1ID), }, { Cluster: "cluster2", Database: "database2", RetentionPolicy: "retention_policy2", Default: true, - OrganizationID: platform.ID("org2"), - BucketID: platform.ID("bucket2"), + OrganizationID: MustIDFromString(dbrpOrg2ID), + BucketID: MustIDFromString(dbrpBucket2ID), }, }, }, diff --git a/testing/organization_service.go b/testing/organization_service.go index 958e589be2..9b2a433b82 100644 --- a/testing/organization_service.go +++ b/testing/organization_service.go @@ -111,7 +111,7 @@ func CreateOrganization( organizations: []*platform.Organization{ { Name: "name1", - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), }, }, }, @@ -122,7 +122,7 @@ func CreateOrganization( IDGenerator: mock.NewIDGenerator(orgTwoID, t), Organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "organization1", }, }, @@ -135,23 +135,23 @@ func CreateOrganization( wants: wants{ organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "organization1", }, { - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "organization2", }, }, }, }, { - name: "names should not be unique", + name: "names should be unique", fields: OrganizationFields{ IDGenerator: mock.NewIDGenerator(orgTwoID, t), Organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "organization1", }, }, @@ -164,7 +164,7 @@ func CreateOrganization( wants: wants{ organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "organization1", }, }, @@ -188,7 +188,11 @@ func CreateOrganization( t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error()) } } + + // Delete only newly created organizations + // if tt.args.organization.ID != nil { defer s.DeleteOrganization(ctx, tt.args.organization.ID) + // } organizations, _, err := s.FindOrganizations(ctx, platform.OrganizationFilter{}) if err != nil { @@ -225,21 +229,21 @@ func FindOrganizationByID( fields: OrganizationFields{ Organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "organization1", }, { - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "organization2", }, }, }, args: args{ - id: idFromString(t, orgTwoID), + id: MustIDFromString(orgTwoID), }, wants: wants{ organization: &platform.Organization{ - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "organization2", }, }, @@ -295,11 +299,11 @@ func FindOrganizations( fields: OrganizationFields{ Organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "xyz", }, }, @@ -308,11 +312,11 @@ func FindOrganizations( wants: wants{ organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "xyz", }, }, @@ -323,22 +327,22 @@ func FindOrganizations( fields: OrganizationFields{ Organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "xyz", }, }, }, args: args{ - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), }, wants: wants{ organizations: []*platform.Organization{ { - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "xyz", }, }, @@ -349,11 +353,11 @@ func FindOrganizations( fields: OrganizationFields{ Organizations: []*platform.Organization{ { - ID: idFromString(t, orgOneID), + ID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "xyz", }, }, @@ -364,7 +368,7 @@ func FindOrganizations( wants: wants{ organizations: []*platform.Organization{ { - ID: idFromString(t, orgTwoID), + ID: MustIDFromString(orgTwoID), Name: "xyz", }, }, @@ -379,7 +383,7 @@ func FindOrganizations( ctx := context.TODO() filter := platform.OrganizationFilter{} - if tt.args.ID != nil { + if tt.args.ID.Valid() { filter.ID = &tt.args.ID } if tt.args.name != "" { @@ -429,22 +433,22 @@ func DeleteOrganization( Organizations: []*platform.Organization{ { Name: "orgA", - ID: platform.ID("abc"), + ID: MustIDFromString(orgOneID), }, { Name: "orgB", - ID: platform.ID("xyz"), + ID: MustIDFromString(orgTwoID), }, }, }, args: args{ - ID: "abc", + ID: orgOneID, }, wants: wants{ organizations: []*platform.Organization{ { Name: "orgB", - ID: platform.ID("xyz"), + ID: MustIDFromString(orgTwoID), }, }, }, @@ -455,27 +459,27 @@ func DeleteOrganization( Organizations: []*platform.Organization{ { Name: "orgA", - ID: platform.ID("abc"), + ID: MustIDFromString(orgOneID), }, { Name: "orgB", - ID: platform.ID("xyz"), + ID: MustIDFromString(orgTwoID), }, }, }, args: args{ - ID: "123", + ID: "1234567890654321", }, wants: wants{ err: fmt.Errorf("organization not found"), organizations: []*platform.Organization{ { Name: "orgA", - ID: platform.ID("abc"), + ID: MustIDFromString(orgOneID), }, { Name: "orgB", - ID: platform.ID("xyz"), + ID: MustIDFromString(orgTwoID), }, }, }, @@ -487,7 +491,7 @@ func DeleteOrganization( s, done := init(tt.fields, t) defer done() ctx := context.TODO() - err := s.DeleteOrganization(ctx, platform.ID(tt.args.ID)) + err := s.DeleteOrganization(ctx, MustIDFromString(tt.args.ID)) if (err != nil) != (tt.wants.err != nil) { t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err) } @@ -535,11 +539,11 @@ func FindOrganization( fields: OrganizationFields{ Organizations: []*platform.Organization{ { - ID: platform.ID("a"), + ID: MustIDFromString(orgOneID), Name: "abc", }, { - ID: platform.ID("b"), + ID: MustIDFromString(orgTwoID), Name: "xyz", }, }, @@ -549,7 +553,7 @@ func FindOrganization( }, wants: wants{ organization: &platform.Organization{ - ID: platform.ID("a"), + ID: MustIDFromString(orgOneID), Name: "abc", }, }, @@ -609,22 +613,22 @@ func UpdateOrganization( fields: OrganizationFields{ Organizations: []*platform.Organization{ { - ID: platform.ID("1"), + ID: MustIDFromString(orgOneID), Name: "organization1", }, { - ID: platform.ID("2"), + ID: MustIDFromString(orgTwoID), Name: "organization2", }, }, }, args: args{ - id: platform.ID("1"), + id: MustIDFromString(orgOneID), name: "changed", }, wants: wants{ organization: &platform.Organization{ - ID: platform.ID("1"), + ID: MustIDFromString(orgOneID), Name: "changed", }, }, diff --git a/testing/user_service.go b/testing/user_service.go index 4580834f53..7fe22ddd2d 100644 --- a/testing/user_service.go +++ b/testing/user_service.go @@ -112,7 +112,7 @@ func CreateUser( users: []*platform.User{ { Name: "name1", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, }, }, @@ -123,7 +123,7 @@ func CreateUser( IDGenerator: mock.NewIDGenerator(userTwoID, t), Users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "user1", }, }, @@ -136,27 +136,27 @@ func CreateUser( wants: wants{ users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "user1", }, { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "user2", }, }, }, }, { - name: "names should not be unique", + name: "names should be unique", fields: UserFields{ IDGenerator: &mock.IDGenerator{ IDFn: func() platform.ID { - return idFromString(t, userOneID) + return MustIDFromString(userOneID) }, }, Users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "user1", }, }, @@ -169,7 +169,7 @@ func CreateUser( wants: wants{ users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "user1", }, }, @@ -193,7 +193,11 @@ func CreateUser( t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error()) } } - defer s.DeleteUser(ctx, tt.args.user.ID) + + // Delete only created users - ie., having a not nil ID + if tt.args.user.ID.Valid() { + defer s.DeleteUser(ctx, tt.args.user.ID) + } users, _, err := s.FindUsers(ctx, platform.UserFilter{}) if err != nil { @@ -230,21 +234,21 @@ func FindUserByID( fields: UserFields{ Users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "user1", }, { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "user2", }, }, }, args: args{ - id: idFromString(t, userTwoID), + id: MustIDFromString(userTwoID), }, wants: wants{ user: &platform.User{ - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "user2", }, }, @@ -300,11 +304,11 @@ func FindUsers( fields: UserFields{ Users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "abc", }, { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "xyz", }, }, @@ -313,11 +317,11 @@ func FindUsers( wants: wants{ users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "abc", }, { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "xyz", }, }, @@ -328,22 +332,22 @@ func FindUsers( fields: UserFields{ Users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "abc", }, { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "xyz", }, }, }, args: args{ - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, wants: wants{ users: []*platform.User{ { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "xyz", }, }, @@ -354,11 +358,11 @@ func FindUsers( fields: UserFields{ Users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "abc", }, { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "xyz", }, }, @@ -369,7 +373,7 @@ func FindUsers( wants: wants{ users: []*platform.User{ { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "xyz", }, }, @@ -384,7 +388,7 @@ func FindUsers( ctx := context.TODO() filter := platform.UserFilter{} - if tt.args.ID != nil { + if tt.args.ID.Valid() { filter.ID = &tt.args.ID } if tt.args.name != "" { @@ -434,22 +438,22 @@ func DeleteUser( Users: []*platform.User{ { Name: "orgA", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "orgB", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, }, args: args{ - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, wants: wants{ users: []*platform.User{ { Name: "orgB", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, }, @@ -460,27 +464,27 @@ func DeleteUser( Users: []*platform.User{ { Name: "orgA", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "orgB", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, }, args: args{ - ID: idFromString(t, userThreeID), + ID: MustIDFromString(userThreeID), }, wants: wants{ err: fmt.Errorf("user not found"), users: []*platform.User{ { Name: "orgA", - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), }, { Name: "orgB", - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), }, }, }, @@ -540,11 +544,11 @@ func FindUser( fields: UserFields{ Users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "abc", }, { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "xyz", }, }, @@ -554,7 +558,7 @@ func FindUser( }, wants: wants{ user: &platform.User{ - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "abc", }, }, @@ -614,22 +618,22 @@ func UpdateUser( fields: UserFields{ Users: []*platform.User{ { - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "user1", }, { - ID: idFromString(t, userTwoID), + ID: MustIDFromString(userTwoID), Name: "user2", }, }, }, args: args{ - id: idFromString(t, userOneID), + id: MustIDFromString(userOneID), name: "changed", }, wants: wants{ user: &platform.User{ - ID: idFromString(t, userOneID), + ID: MustIDFromString(userOneID), Name: "changed", }, }, diff --git a/testing/util.go b/testing/util.go index 23b9ff3346..4701770e09 100644 --- a/testing/util.go +++ b/testing/util.go @@ -1,15 +1,14 @@ package testing import ( - "testing" - "github.com/influxdata/platform" ) -func idFromString(t *testing.T, s string) platform.ID { +// MustIDFromString is an helper to ensure a correct ID is built during testing. +func MustIDFromString(s string) platform.ID { id, err := platform.IDFromString(s) if err != nil { - t.Fatal(err) + panic(err) } return *id } diff --git a/user.go b/user.go index b6a8b591b8..5b18555c1d 100644 --- a/user.go +++ b/user.go @@ -2,7 +2,7 @@ package platform import "context" -// User is a user. 🎉 +// User is an user. 🎉 type User struct { ID ID `json:"id,omitempty"` Name string `json:"name"` diff --git a/view_test.go b/view_test.go index efb40c51f8..6ec0cc9f7d 100644 --- a/view_test.go +++ b/view_test.go @@ -6,6 +6,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/influxdata/platform" + platformtesting "github.com/influxdata/platform/testing" ) func TestView_MarshalJSON(t *testing.T) { @@ -24,7 +25,7 @@ func TestView_MarshalJSON(t *testing.T) { args: args{ view: platform.View{ ViewContents: platform.ViewContents{ - ID: platform.ID("0"), + ID: platformtesting.MustIDFromString("f01dab1ef005ba11"), Name: "hello", }, Properties: platform.LineViewProperties{ @@ -35,7 +36,7 @@ func TestView_MarshalJSON(t *testing.T) { wants: wants{ json: ` { - "id": "30", + "id": "f01dab1ef005ba11", "name": "hello", "properties": { "shape": "chronograf-v2",