b24ea2ead5
this adds a test framework with fake implementations of a filesystem so that unit tests can be written asserting the output of different command invocations as well as the effects they have on a hypothetical filesystem and storj network. it also implements the mb command lol Change-Id: I134c7ea6bf34f46192956c274a96cb5df7632ac0
95 lines
2.0 KiB
Go
95 lines
2.0 KiB
Go
// Copyright (C) 2021 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/zeebo/clingy"
|
|
|
|
"storj.io/uplink"
|
|
privateAccess "storj.io/uplink/private/access"
|
|
)
|
|
|
|
type projectProvider struct {
|
|
access string
|
|
|
|
testProject *uplink.Project
|
|
testFilesystem filesystem
|
|
}
|
|
|
|
func (pp *projectProvider) Setup(a clingy.Arguments, f clingy.Flags) {
|
|
pp.access = f.New("access", "Which access to use", "").(string)
|
|
}
|
|
|
|
func (pp *projectProvider) setTestFilesystem(fs filesystem) { pp.testFilesystem = fs }
|
|
|
|
func (pp *projectProvider) OpenFilesystem(ctx context.Context, options ...projectOption) (filesystem, error) {
|
|
if pp.testFilesystem != nil {
|
|
return pp.testFilesystem, nil
|
|
}
|
|
|
|
project, err := pp.OpenProject(ctx, options...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &filesystemMixed{
|
|
local: &filesystemLocal{},
|
|
remote: &filesystemRemote{
|
|
project: project,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (pp *projectProvider) OpenProject(ctx context.Context, options ...projectOption) (*uplink.Project, error) {
|
|
if pp.testProject != nil {
|
|
return pp.testProject, nil
|
|
}
|
|
|
|
var opts projectOptions
|
|
for _, opt := range options {
|
|
opt.apply(&opts)
|
|
}
|
|
|
|
accessDefault, accesses, err := gf.GetAccessInfo()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if pp.access != "" {
|
|
accessDefault = pp.access
|
|
}
|
|
|
|
var access *uplink.Access
|
|
if data, ok := accesses[accessDefault]; ok {
|
|
access, err = uplink.ParseAccess(data)
|
|
} else {
|
|
access, err = uplink.ParseAccess(accessDefault)
|
|
// TODO: if this errors then it's probably a name so don't report an error
|
|
// that says "it failed to parse"
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if opts.encryptionBypass {
|
|
if err := privateAccess.EnablePathEncryptionBypass(access); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return uplink.OpenProject(ctx, access)
|
|
}
|
|
|
|
type projectOptions struct {
|
|
encryptionBypass bool
|
|
}
|
|
|
|
type projectOption struct {
|
|
apply func(*projectOptions)
|
|
}
|
|
|
|
func bypassEncryption(bypass bool) projectOption {
|
|
return projectOption{apply: func(opt *projectOptions) { opt.encryptionBypass = bypass }}
|
|
}
|