1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
// Copyright (C) MongoDB, Inc. 2017-present.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
package gridfs
import (
"context"
"os"
"testing"
"go.mongodb.org/mongo-driver/event"
"go.mongodb.org/mongo-driver/internal/testutil"
"go.mongodb.org/mongo-driver/internal/testutil/assert"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"go.mongodb.org/mongo-driver/mongo/writeconcern"
)
var (
connsCheckedOut int
)
func TestGridFS(t *testing.T) {
if os.Getenv("TEST_MONGODB_SERVER") == "" {
t.Skip()
}
cs := testutil.ConnString(t)
poolMonitor := &event.PoolMonitor{
Event: func(evt *event.PoolEvent) {
switch evt.Type {
case event.GetSucceeded:
connsCheckedOut++
case event.ConnectionReturned:
connsCheckedOut--
}
},
}
clientOpts := options.Client().
ApplyURI(cs.Original).
SetReadPreference(readpref.Primary()).
SetWriteConcern(writeconcern.New(writeconcern.WMajority())).
SetPoolMonitor(poolMonitor).
// Connect to a single host. For sharded clusters, this will pin to a single mongos, which avoids
// non-deterministic versioning errors in the server. This has no effect for replica sets because the driver
// will discover the other hosts during SDAM checks.
SetHosts(cs.Hosts[:1])
client, err := mongo.Connect(context.Background(), clientOpts)
assert.Nil(t, err, "Connect error: %v", err)
db := client.Database("gridfs")
defer func() {
sessions := client.NumberSessionsInProgress()
conns := connsCheckedOut
_ = db.Drop(context.Background())
_ = client.Disconnect(context.Background())
assert.Equal(t, 0, sessions, "%v sessions checked out", sessions)
assert.Equal(t, 0, conns, "%v connections checked out", conns)
}()
// Unit tests showing the chunk size is set correctly on the bucket and upload stream objects.
t.Run("ChunkSize", func(t *testing.T) {
chunkSizeTests := []struct {
testName string
bucketOpts *options.BucketOptions
uploadOpts *options.UploadOptions
}{
{"Default values", nil, nil},
{"Options provided without chunk size", options.GridFSBucket(), options.GridFSUpload()},
{"Bucket chunk size set", options.GridFSBucket().SetChunkSizeBytes(27), nil},
{"Upload stream chunk size set", nil, options.GridFSUpload().SetChunkSizeBytes(27)},
{"Bucket and upload set to different values", options.GridFSBucket().SetChunkSizeBytes(27), options.GridFSUpload().SetChunkSizeBytes(31)},
}
for _, tt := range chunkSizeTests {
t.Run(tt.testName, func(t *testing.T) {
bucket, err := NewBucket(db, tt.bucketOpts)
assert.Nil(t, err, "NewBucket error: %v", err)
us, err := bucket.OpenUploadStream("filename", tt.uploadOpts)
assert.Nil(t, err, "OpenUploadStream error: %v", err)
expectedBucketChunkSize := DefaultChunkSize
if tt.bucketOpts != nil && tt.bucketOpts.ChunkSizeBytes != nil {
expectedBucketChunkSize = *tt.bucketOpts.ChunkSizeBytes
}
assert.Equal(t, expectedBucketChunkSize, bucket.chunkSize,
"expected chunk size %v, got %v", expectedBucketChunkSize, bucket.chunkSize)
expectedUploadChunkSize := expectedBucketChunkSize
if tt.uploadOpts != nil && tt.uploadOpts.ChunkSizeBytes != nil {
expectedUploadChunkSize = *tt.uploadOpts.ChunkSizeBytes
}
assert.Equal(t, expectedUploadChunkSize, us.chunkSize,
"expected chunk size %v, got %v", expectedUploadChunkSize, us.chunkSize)
})
}
})
}
|