Repository: milvus-io/milvus-sdk-go
Pull request #496 (2023-06-21 08:50:56)

Add NewCollection high level API
Add `NewCollection` as high level api to create collection with default setup
/kind improvement


sre-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/milvus-io/milvus-sdk-go/pull/496#" title="Author self-approved">congqixia</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=milvus-io%2Fmilvus-sdk-go).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/milvus-io/milvus-sdk-go/blob/v2.2.x/OWNERS)~~ [congqixia]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io) Report
> Merging [#496](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io) (f9c19f6) into [v2.2.x](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/commit/33002458e1f64261aa80c674d4c8fab88cbc83fb?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io) (3300245) will **increase** coverage by `0.08%`.
> The diff coverage is `86.79%`.

[![Impacted file tree graph](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496/graphs/tree.svg?width=650&height=150&src=pr&token=WJK43PV390&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io)](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io)

```diff
@@            Coverage Diff             @@
##           v2.2.x     #496      +/-   ##
==========================================
+ Coverage   80.56%   80.65%   +0.08%     
==========================================
  Files          34       34              
  Lines        2774     2812      +38     
==========================================
+ Hits         2235     2268      +33     
- Misses        428      432       +4     
- Partials      111      112       +1     
```


| [Impacted Files](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io) | Coverage Δ | |
|---|---|---|
| [client/client.go](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io#diff-Y2xpZW50L2NsaWVudC5nbw==) | `31.70% <ø> (ø)` | |
| [client/options.go](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io#diff-Y2xpZW50L29wdGlvbnMuZ28=) | `65.62% <85.71%> (+2.66%)` | :arrow_up: |
| [client/collection.go](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io#diff-Y2xpZW50L2NvbGxlY3Rpb24uZ28=) | `86.70% <86.11%> (+0.20%)` | :arrow_up: |
| [entity/index.go](https://app.codecov.io/gh/milvus-io/milvus-sdk-go/pull/496?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=milvus-io#diff-ZW50aXR5L2luZGV4Lmdv) | `100.00% <100.00%> (ø)` | |

sre-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/milvus-io/milvus-sdk-go/pull/496#" title="Author self-approved">congqixia</a>*, *<a href="https://github.com/milvus-io/milvus-sdk-go/pull/496#pullrequestreview-1490923296" title="LGTM">yah01</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=milvus-io%2Fmilvus-sdk-go).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/milvus-io/milvus-sdk-go/blob/v2.2.x/OWNERS)~~ [congqixia]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->

Patch:
diff --git a/client/client.go b/client/client.go
index 264ed4c..1d29592 100644
--- a/client/client.go
+++ b/client/client.go
@@ -44,6 +44,8 @@ type Client interface {
 
 	// -- collection --
 
+	// NewCollection intializeds a new collection with pre defined attributes
+	NewCollection(ctx context.Context, collName string, dimension int64, opts ...CreateCollectionOption) error
 	// ListCollections list collections from connection
 	ListCollections(ctx context.Context) ([]*entity.Collection, error)
 	// CreateCollection create collection using provided schema
diff --git a/client/collection.go b/client/collection.go
index f601854..dd8af1e 100644
--- a/client/collection.go
+++ b/client/collection.go
@@ -13,6 +13,7 @@ package client
 
 import (
 	"context"
+	"fmt"
 	"time"
 
 	"github.com/cockroachdb/errors"
@@ -98,6 +99,49 @@ func (c *GrpcClient) ListCollections(ctx context.Context) ([]*entity.Collection,
 	return collections, nil
 }
 
+// NewCollection creates a common simple collection with pre-defined attributes.
+func (c *GrpcClient) NewCollection(ctx context.Context, collName string, dimension int64, opts ...CreateCollectionOption) error {
+	if c.Service == nil {
+		return ErrClientNotReady
+	}
+
+	//	shardNum := entity.DefaultShardNumber
+	opt := &createCollOpt{
+		ConsistencyLevel:    entity.DefaultConsistencyLevel,
+		PrimaryKeyFieldName: "id",
+		PrimaryKeyFieldType: entity.FieldTypeInt64,
+		VectorFieldName:     "vector",
+		MetricsType:         entity.IP,
+		AutoID:              false,
+	}
+
+	for _, o := range opts {
+		o(opt)
+	}
+
+	sch := entity.NewSchema().WithName(collName).WithAutoID(opt.AutoID).
+		WithField(entity.NewField().WithName(opt.PrimaryKeyFieldName).WithDataType(opt.PrimaryKeyFieldType).WithIsAutoID(opt.AutoID).WithIsPrimaryKey(true)).
+		WithField(entity.NewField().WithName(opt.VectorFieldName).WithDataType(entity.FieldTypeFloatVector).WithDim(dimension))
+
+	if err := c.validateSchema(sch); err != nil {
+		return err
+	}
+
+	if err := c.requestCreateCollection(ctx, sch, opt, entity.DefaultShardNumber); err != nil {
+		return err
+	}
+
+	idx := entity.NewGenericIndex("", "", map[string]string{
+		"metric_type": string(opt.MetricsType),
+	})
+
+	if err := c.CreateIndex(ctx, collName, opt.VectorFieldName, idx, false); err != nil {
+		return err
+	}
+
+	return c.LoadCollection(ctx, collName, false)
+}
+
 // CreateCollection create collection with specified schema
 func (c *GrpcClient) CreateCollection(ctx context.Context, collSchema *entity.Schema, shardNum int32, opts ...CreateCollectionOption) error {
 	if c.Service == nil {
@@ -107,25 +151,33 @@ func (c *GrpcClient) CreateCollection(ctx context.Context, collSchema *entity.Sc
 		return err
 	}
 
-	sch := collSchema.ProtoMessage()
-	bs, err := proto.Marshal(sch)
+	opt := &createCollOpt{
+		ConsistencyLevel: entity.DefaultConsistencyLevel,
+		NumPartitions:    0,
+	}
+	// apply options on request
+	for _, o := range opts {
+		o(opt)
+	}
+
+	return c.requestCreateCollection(ctx, collSchema, opt, shardNum)
+}
+
+func (c *GrpcClient) requestCreateCollection(ctx context.Context, sch *entity.Schema, opt *createCollOpt, shardNum int32) error {
+	bs, err := proto.Marshal(sch.ProtoMessage())
 	if err != nil {
 		return err
 	}
+
 	req := &server.CreateCollectionRequest{
-		DbName:         "", // reserved fields, not used for now
-		CollectionName: collSchema.CollectionName,
-		Schema:         bs,
-		ShardsNum:      shardNum,
-		// default consistency level is strong
-		// to be consistent with previous version
-		ConsistencyLevel: common.ConsistencyLevel_Bounded,
-		NumPartitions:    0,
-	}
-	// apply options on request
-	for _, opt := range opts {
-		opt(req)
+		DbName:           "", // reserved fields, not used for now
+		CollectionName:   sch.CollectionName,
+		Schema:           bs,
+		ShardsNum:        shardNum,
+		ConsistencyLevel: opt.ConsistencyLevel.CommonConsistencyLevel(),
+		NumPartitions:    opt.NumPartitions,
 	}
+
 	resp, err := c.Service.CreateCollection(ctx, req)
 	if err != nil {
 		return err
@@ -335,6 +387,7 @@ func (c *GrpcClient) ShowCollection(ctx context.Context, collName string) (*enti
 	}
 
 	if len(resp.CollectionIds) != 1 || len(resp.InMemoryPercentages) != 1 {
+		fmt.Println(len(resp.CollectionIds), len(resp.InMemoryPercentages), resp.String())
 		return nil, errors.New("response len not valid")
 	}
 	return &entity.Collection{
diff --git a/client/options.go b/client/options.go
index 2bfcf41..0209f33 100644
--- a/client/options.go
+++ b/client/options.go
@@ -19,20 +19,60 @@ import (
 	"github.com/milvus-io/milvus-sdk-go/v2/entity"
 )
 
-// CreateCollectionOption is an option that is used to modify CreateCollectionRequest
-type CreateCollectionOption func(*server.CreateCollectionRequest)
+// CreateCollectionOption is an option that is used to alter create collection options.
+type CreateCollectionOption func(opt *createCollOpt)
+
+type createCollOpt struct {
+	ConsistencyLevel    entity.ConsistencyLevel
+	NumPartitions       int64
+	PrimaryKeyFieldName string
+	PrimaryKeyFieldType entity.FieldType
+	VectorFieldName     string
+	MetricsType         entity.MetricType
+	AutoID              bool
+}
+
+func WithPKFieldName(name string) CreateCollectionOption {
+	return func(opt *createCollOpt) {
+		opt.PrimaryKeyFieldName = name
+	}
+}
+
+func WithPKFieldType(tp entity.FieldType) CreateCollectionOption {
+	return func(opt *createCollOpt) {
+		opt.PrimaryKeyFieldType = tp
+	}
+}
+
+func WithVectorFieldName(name string) CreateCollectionOption {
+	return func(opt *createCollOpt) {
+		opt.VectorFieldName = name
+	}
+}
+
+func WithMetricsType(mt entity.MetricType) CreateCollectionOption {
+	return func(opt *createCollOpt) {
+		opt.MetricsType = mt
+	}
+}
+
+func WithAutoID(autoID bool) CreateCollectionOption {
+	return func(opt *createCollOpt) {
+		opt.AutoID = autoID
+	}
+}
 
 // WithConsistencyLevel specifies a specific ConsistencyLevel, rather than using the default ReaderProperties.
 func WithConsistencyLevel(cl entity.ConsistencyLevel) CreateCollectionOption {
-	return func(req *server.CreateCollectionRequest) {
-		req.ConsistencyLevel = cl.CommonConsistencyLevel()
+	return func(opt *createCollOpt) {
+		opt.ConsistencyLevel = cl
 	}
 }
 
 // WithPartitionNum returns a create collection options to set physical partition number when logical partition feature.
 func WithPartitionNum(partitionNums int64) CreateCollectionOption {
-	return func(req *server.CreateCollectionRequest) {
-		req.NumPartitions = partitionNums
+	return func(opt *createCollOpt) {
+		opt.NumPartitions = partitionNums
 	}
 }
 
diff --git a/entity/collection.go b/entity/collection.go
index 345f9c3..c9ad95a 100644
--- a/entity/collection.go
+++ b/entity/collection.go
@@ -15,6 +15,9 @@ package entity
 // DefaultShardNumber const value for using Milvus default shard number.
 const DefaultShardNumber int32 = 0
 
+// DefaultConsistencyLevel const value for using Milvus default consistency level setting.
+const DefaultConsistencyLevel ConsistencyLevel = ClBounded
+
 // Collection represent collection meta in Milvus
 type Collection struct {
 	ID               int64   // collection id
diff --git a/entity/index.go b/entity/index.go
index 98942f8..1f5b11e 100644
--- a/entity/index.go
+++ b/entity/index.go
@@ -93,8 +93,9 @@ type GenericIndex struct {
 
 // Params implements Index
 func (gi GenericIndex) Params() map[string]string {
-	m := map[string]string{
-		tIndexType: string(gi.IndexType()),
+	m := make(map[string]string)
+	if gi.baseIndex.it != "" {
+		m[tIndexType] = string(gi.IndexType())
 	}
 	for k, v := range gi.params {
 		m[k] = v


Test patch:
diff --git a/client/collection_test.go b/client/collection_test.go
index accfb2b..d8e2aef 100644
--- a/client/collection_test.go
+++ b/client/collection_test.go
@@ -11,6 +11,7 @@ import (
 	"github.com/golang/protobuf/proto"
 	common "github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
 	server "github.com/milvus-io/milvus-proto/go-api/v2/milvuspb"
+	"github.com/milvus-io/milvus-proto/go-api/v2/schemapb"
 	schema "github.com/milvus-io/milvus-proto/go-api/v2/schemapb"
 	"github.com/milvus-io/milvus-sdk-go/v2/entity"
 	"github.com/stretchr/testify/assert"
@@ -670,6 +671,138 @@ func (s *CollectionSuite) TestCreateCollection() {
 	})
 }
 
+func (s *CollectionSuite) TestNewCollection() {
+	c := s.client
+	ctx, cancel := context.WithCancel(context.Background())
+
+	defer cancel()
+	s.resetMock()
+
+	s.Run("all_default", func() {
+		defer s.resetMock()
+
+		created := false
+		s.mock.EXPECT().CreateCollection(mock.Anything, mock.AnythingOfType("*milvuspb.CreateCollectionRequest")).
+			Run(func(ctx context.Context, req *server.CreateCollectionRequest) {
+				s.Equal(testCollectionName, req.GetCollectionName())
+				sschema := &schema.CollectionSchema{}
+				s.Require().NoError(proto.Unmarshal(req.GetSchema(), sschema))
+				s.Require().Equal(2, len(sschema.Fields))
+				for _, field := range sschema.Fields {
+					if field.GetName() == "id" {
+						s.Equal(schemapb.DataType_Int64, field.GetDataType())
+					}
+					if field.GetName() == "vector" {
+						s.Equal(schemapb.DataType_FloatVector, field.GetDataType())
+					}
+				}
+
+				s.Equal(entity.DefaultShardNumber, req.GetShardsNum())
+				s.Equal(entity.DefaultConsistencyLevel.CommonConsistencyLevel(), req.GetConsistencyLevel())
+				created = true
+			}).
+			Return(&common.Status{ErrorCode: common.ErrorCode_Success}, nil)
+		s.mock.EXPECT().HasCollection(mock.Anything, &server.HasCollectionRequest{CollectionName: testCollectionName}).Call.Return(func(_ context.Context, _ *server.HasCollectionRequest) *server.BoolResponse {
+			return &server.BoolResponse{Status: &common.Status{}, Value: created}
+		}, nil)
+		s.mock.EXPECT().CreateIndex(mock.Anything, mock.Anything).Return(&common.Status{ErrorCode: common.ErrorCode_Success}, nil)
+		s.mock.EXPECT().Flush(mock.Anything, mock.Anything).Return(&server.FlushResponse{
+			Status:     &common.Status{ErrorCode: common.ErrorCode_Success},
+			CollSegIDs: map[string]*schema.LongArray{},
+		}, nil)
+		s.mock.EXPECT().DescribeIndex(mock.Anything, mock.Anything).Return(&server.DescribeIndexResponse{
+			Status: &common.Status{ErrorCode: common.ErrorCode_Success},
+			IndexDescriptions: []*server.IndexDescription{
+				{FieldName: "vector", State: common.IndexState_Finished},
+			},
+		}, nil)
+		s.mock.EXPECT().LoadCollection(mock.Anything, mock.Anything).Return(&common.Status{ErrorCode: common.ErrorCode_Success}, nil)
+		s.mock.EXPECT().ShowCollections(mock.Anything, mock.Anything).Return(&server.ShowCollectionsResponse{
+			Status:              &common.Status{ErrorCode: common.ErrorCode_Success},
+			CollectionNames:     []string{testCollectionName},
+			CollectionIds:       []int64{0},
+			InMemoryPercentages: []int64{100},
+		}, nil)
+		s.mock.EXPECT().DescribeCollection(mock.Anything, mock.Anything).Return(&server.DescribeCollectionResponse{
+			Status: &common.Status{ErrorCode: common.ErrorCode_Success},
+			Schema: &schema.CollectionSchema{
+				Fields: []*schema.FieldSchema{
+					{Name: "id", DataType: schema.DataType_VarChar},
+					{Name: "vector", DataType: schema.DataType_FloatVector},
+				},
+			},
+		}, nil)
+
+		err := c.NewCollection(ctx, testCollectionName, testVectorDim)
+		s.NoError(err)
+	})
+
+	s.Run("with_custom_set", func() {
+		defer s.resetMock()
+		created := false
+		s.mock.EXPECT().CreateCollection(mock.Anything, mock.AnythingOfType("*milvuspb.CreateCollectionRequest")).
+			Run(func(ctx context.Context, req *server.CreateCollectionRequest) {
+				s.Equal(testCollectionName, req.GetCollectionName())
+				sschema := &schema.CollectionSchema{}
+				s.Require().NoError(proto.Unmarshal(req.GetSchema(), sschema))
+				s.Require().Equal(2, len(sschema.Fields))
+				for _, field := range sschema.Fields {
+					if field.GetName() == "my_pk" {
+						s.Equal(schemapb.DataType_VarChar, field.GetDataType())
+					}
+					if field.GetName() == "embedding" {
+						s.Equal(schemapb.DataType_FloatVector, field.GetDataType())
+					}
+				}
+
+				s.Equal(entity.DefaultShardNumber, req.GetShardsNum())
+				s.Equal(entity.ClEventually.CommonConsistencyLevel(), req.GetConsistencyLevel())
+				created = true
+			}).
+			Return(&common.Status{ErrorCode: common.ErrorCode_Success}, nil)
+		s.mock.EXPECT().HasCollection(mock.Anything, &server.HasCollectionRequest{CollectionName: testCollectionName}).Call.Return(func(_ context.Context, _ *server.HasCollectionRequest) *server.BoolResponse {
+			return &server.BoolResponse{Status: &common.Status{}, Value: created}
+		}, nil)
+		s.mock.EXPECT().CreateIndex(mock.Anything, mock.Anything).Return(&common.Status{ErrorCode: common.ErrorCode_Success}, nil)
+		s.mock.EXPECT().Flush(mock.Anything, mock.Anything).Return(&server.FlushResponse{
+			Status:     &common.Status{ErrorCode: common.ErrorCode_Success},
+			CollSegIDs: map[string]*schema.LongArray{},
+		}, nil)
+		s.mock.EXPECT().DescribeIndex(mock.Anything, mock.Anything).Return(&server.DescribeIndexResponse{
+			Status: &common.Status{ErrorCode: common.ErrorCode_Success},
+			IndexDescriptions: []*server.IndexDescription{
+				{FieldName: "embedding", State: common.IndexState_Finished},
+			},
+		}, nil)
+		s.mock.EXPECT().LoadCollection(mock.Anything, mock.Anything).Return(&common.Status{ErrorCode: common.ErrorCode_Success}, nil)
+		s.mock.EXPECT().ShowCollections(mock.Anything, mock.Anything).Return(&server.ShowCollectionsResponse{
+			Status:              &common.Status{ErrorCode: common.ErrorCode_Success},
+			CollectionNames:     []string{testCollectionName},
+			CollectionIds:       []int64{0},
+			InMemoryPercentages: []int64{100},
+		}, nil)
+		s.mock.EXPECT().DescribeCollection(mock.Anything, mock.Anything).Return(&server.DescribeCollectionResponse{
+			Status: &common.Status{ErrorCode: common.ErrorCode_Success},
+			Schema: &schema.CollectionSchema{
+				Fields: []*schema.FieldSchema{
+					{Name: "my_pk", DataType: schema.DataType_VarChar},
+					{Name: "embedding", DataType: schema.DataType_FloatVector},
+				},
+			},
+		}, nil)
+
+		err := c.NewCollection(ctx, testCollectionName, testVectorDim, WithPKFieldName("my_pk"), WithPKFieldType(entity.FieldTypeVarChar), WithVectorFieldName("embedding"), WithConsistencyLevel(entity.ClEventually))
+		s.NoError(err)
+	})
+
+	s.Run("varchar_autoid", func() {
+		defer s.resetMock()
+
+		err := c.NewCollection(ctx, testCollectionName, testVectorDim, WithPKFieldType(entity.FieldTypeVarChar), WithAutoID(true))
+		s.Error(err)
+	})
+}
+
 func (s *CollectionSuite) TestAlterCollection() {
 	c := s.client
 	ctx, cancel := context.WithCancel(context.Background())
diff --git a/client/options_test.go b/client/options_test.go
index dbf4c80..287d420 100644
--- a/client/options_test.go
+++ b/client/options_test.go
@@ -15,7 +15,6 @@ import (
 	"math/rand"
 	"testing"
 
-	common "github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
 	server "github.com/milvus-io/milvus-proto/go-api/v2/milvuspb"
 	"github.com/milvus-io/milvus-sdk-go/v2/entity"
 	"github.com/stretchr/testify/assert"
@@ -24,26 +23,26 @@ import (
 func TestCreateCollectionWithConsistencyLevel(t *testing.T) {
 	opt := WithConsistencyLevel(entity.ConsistencyLevel(entity.ClBounded))
 	assert.NotNil(t, opt)
-	req := &server.CreateCollectionRequest{}
+	o := &createCollOpt{}
 
 	assert.NotPanics(t, func() {
-		opt(req)
+		opt(o)
 	})
 
-	assert.Equal(t, common.ConsistencyLevel_Bounded, req.GetConsistencyLevel())
+	assert.Equal(t, entity.ClBounded, o.ConsistencyLevel)
 }
 
 func TestCreateCollectionWithPartitionNum(t *testing.T) {
 	partitionNum := rand.Int63n(1000) + 1
 	opt := WithPartitionNum(partitionNum)
 	assert.NotNil(t, opt)
-	req := &server.CreateCollectionRequest{}
+	o := &createCollOpt{}
 
 	assert.NotPanics(t, func() {
-		opt(req)
+		opt(o)
 	})
 
-	assert.Equal(t, partitionNum, req.GetNumPartitions())
+	assert.Equal(t, partitionNum, o.NumPartitions)
 }
 
 func TestLoadCollectionWithReplicaNumber(t *testing.T) {
diff --git a/test/testcases/database_test.go b/test/testcases/database_test.go
index 9e8d30e..8c4cfc3 100644
--- a/test/testcases/database_test.go
+++ b/test/testcases/database_test.go
@@ -137,6 +137,8 @@ func TestCreateDb(t *testing.T) {
 
 // test drop db
 func TestDropDb(t *testing.T) {
+	t.Skip()
+
 	teardownSuite := teardownTest(t)
 	defer teardownSuite(t)