73 lines
1.5 KiB
Go
73 lines
1.5 KiB
Go
package blob
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"net/url"
|
|
|
|
"gocloud.dev/blob"
|
|
"gocloud.dev/blob/memblob"
|
|
)
|
|
|
|
type MockBlob struct {
|
|
mux *blob.URLMux
|
|
scheme string
|
|
opener *fakeOpener
|
|
}
|
|
|
|
type fakeOpener struct {
|
|
object string
|
|
content string
|
|
keepModTime bool
|
|
getSync func() *Sync
|
|
}
|
|
|
|
func (f *fakeOpener) OpenBucketURL(ctx context.Context, _ *url.URL) (*blob.Bucket, error) {
|
|
bucketURL, err := url.Parse("mem://")
|
|
if err != nil {
|
|
log.Fatalf("couldn't parse url: %s: %v", "mem://", err)
|
|
}
|
|
opener := &memblob.URLOpener{}
|
|
bucket, err := opener.OpenBucketURL(ctx, bucketURL)
|
|
if err != nil {
|
|
log.Fatalf("couldn't open in memory bucket: %v", err)
|
|
}
|
|
if f.object != "" {
|
|
err = bucket.WriteAll(ctx, f.object, []byte(f.content), nil)
|
|
if err != nil {
|
|
log.Fatalf("couldn't write in memory file: %v", err)
|
|
}
|
|
}
|
|
if f.keepModTime && f.object != "" {
|
|
attrs, err := bucket.Attributes(ctx, f.object)
|
|
if err != nil {
|
|
log.Fatalf("couldn't get memory file attributes: %v", err)
|
|
}
|
|
f.getSync().lastUpdated = attrs.ModTime
|
|
} else {
|
|
f.keepModTime = true
|
|
}
|
|
return bucket, nil
|
|
}
|
|
|
|
func NewMockBlob(scheme string, getSync func() *Sync) *MockBlob {
|
|
mux := new(blob.URLMux)
|
|
opener := &fakeOpener{getSync: getSync}
|
|
mux.RegisterBucket(scheme, opener)
|
|
return &MockBlob{
|
|
mux: mux,
|
|
scheme: scheme,
|
|
opener: opener,
|
|
}
|
|
}
|
|
|
|
func (mb *MockBlob) URLMux() *blob.URLMux {
|
|
return mb.mux
|
|
}
|
|
|
|
func (mb *MockBlob) AddObject(object, content string) {
|
|
mb.opener.object = object
|
|
mb.opener.content = content
|
|
mb.opener.keepModTime = false
|
|
}
|