Test for dropbox integration

This commit is contained in:
MaxJa4 2023-08-22 20:01:24 +02:00
parent 894608fff4
commit cd49b8c38e
6 changed files with 12857 additions and 8 deletions

View File

@ -70,6 +70,7 @@ type Config struct {
AzureStorageContainerName string `split_words:"true"` AzureStorageContainerName string `split_words:"true"`
AzureStoragePath string `split_words:"true"` AzureStoragePath string `split_words:"true"`
AzureStorageEndpoint string `split_words:"true" default:"https://{{ .AccountName }}.blob.core.windows.net/"` AzureStorageEndpoint string `split_words:"true" default:"https://{{ .AccountName }}.blob.core.windows.net/"`
DropboxEndpoint string `split_words:"true" default:"https://api.dropbox.com/"`
DropboxRefreshToken string `split_words:"true"` DropboxRefreshToken string `split_words:"true"`
DropboxAppKey string `split_words:"true"` DropboxAppKey string `split_words:"true"`
DropboxAppSecret string `split_words:"true"` DropboxAppSecret string `split_words:"true"`

View File

@ -222,6 +222,7 @@ func newScript() (*script, error) {
if s.c.DropboxRefreshToken != "" && s.c.DropboxAppKey != "" && s.c.DropboxAppSecret != "" { if s.c.DropboxRefreshToken != "" && s.c.DropboxAppKey != "" && s.c.DropboxAppSecret != "" {
dropboxConfig := dropbox.Config{ dropboxConfig := dropbox.Config{
Endpoint: s.c.DropboxEndpoint,
RefreshToken: s.c.DropboxRefreshToken, RefreshToken: s.c.DropboxRefreshToken,
AppKey: s.c.DropboxAppKey, AppKey: s.c.DropboxAppKey,
AppSecret: s.c.DropboxAppSecret, AppSecret: s.c.DropboxAppSecret,

View File

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"context" "context"
"fmt" "fmt"
"net/url"
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
@ -26,6 +27,7 @@ type dropboxStorage struct {
// Config allows to configure a Dropbox storage backend. // Config allows to configure a Dropbox storage backend.
type Config struct { type Config struct {
Endpoint string
RefreshToken string RefreshToken string
AppKey string AppKey string
AppSecret string AppSecret string
@ -35,24 +37,41 @@ type Config struct {
// NewStorageBackend creates and initializes a new Dropbox storage backend. // NewStorageBackend creates and initializes a new Dropbox storage backend.
func NewStorageBackend(opts Config, logFunc storage.Log) (storage.Backend, error) { func NewStorageBackend(opts Config, logFunc storage.Log) (storage.Backend, error) {
tokenUrl, _ := url.JoinPath(opts.Endpoint, "oauth2/token")
conf := &oauth2.Config{ conf := &oauth2.Config{
ClientID: opts.AppKey, ClientID: opts.AppKey,
ClientSecret: opts.AppSecret, ClientSecret: opts.AppSecret,
Endpoint: oauth2.Endpoint{ Endpoint: oauth2.Endpoint{
TokenURL: "https://api.dropbox.com/oauth2/token", TokenURL: tokenUrl,
}, },
} }
isCITest := opts.Endpoint != "https://api.dropbox.com/"
logFunc(storage.LogLevelInfo, "Dropbox", "Fetching fresh access token for Dropbox storage backend.") logFunc(storage.LogLevelInfo, "Dropbox", "Fetching fresh access token for Dropbox storage backend.")
token := &oauth2.Token{RefreshToken: opts.RefreshToken}
if !isCITest {
tkSource := conf.TokenSource(context.TODO(), &oauth2.Token{RefreshToken: opts.RefreshToken}) tkSource := conf.TokenSource(context.TODO(), &oauth2.Token{RefreshToken: opts.RefreshToken})
token, err := tkSource.Token() var err error
token, err = tkSource.Token()
if err != nil { if err != nil {
return nil, fmt.Errorf("(*dropboxStorage).NewStorageBackend: Error refreshing token: %w", err) return nil, fmt.Errorf("(*dropboxStorage).NewStorageBackend: Error refreshing token: %w", err)
} }
}
client := files.New(dropbox.Config{ dbxConfig := dropbox.Config{}
Token: token.AccessToken,
}) if isCITest {
dbxConfig.Token = opts.RefreshToken
dbxConfig.URLGenerator = func(hostType string, namespace string, route string) string {
return fmt.Sprintf("%s/%d/%s/%s", opts.Endpoint, 2, namespace, route)
}
} else {
dbxConfig.Token = token.AccessToken
}
client := files.New(dbxConfig)
if opts.ConcurrencyLevel < 1 { if opts.ConcurrencyLevel < 1 {
logFunc(storage.LogLevelWarning, "Dropbox", "Concurrency level must be at least 1! Using 1 instead of %d.", opts.ConcurrencyLevel) logFunc(storage.LogLevelWarning, "Dropbox", "Concurrency level must be at least 1! Using 1 instead of %d.", opts.ConcurrencyLevel)

View File

@ -0,0 +1,25 @@
# OpenAPI specification options
openapi:
specification_url: '/etc/openapi/user_v2.yaml'
# web server options
http:
cors_enabled: false
port: 8080
response_timeout: 1.0
# application specific options
application:
debug: false
log_format: tty
log_level: info
# options to control generation process
generation:
default_min_float: -1.073741823e+09
default_max_float: 1.073741823e+09
default_min_int: 0
default_max_int: 2147483647
null_probability: 0
suppress_errors: false
use_examples: 'if_present'

50
test/dropbox/run.sh Normal file
View File

@ -0,0 +1,50 @@
#!/bin/sh
set -e
cd "$(dirname "$0")"
. ../util.sh
current_test=$(basename $(pwd))
docker compose up -d
sleep 5
docker compose exec backup backup
sleep 5
expect_running_containers "3"
dvb_logs=$(docker logs backup-1 2>&1)
if $dvb_logs | grep "ERROR"
then
fail "Backup failed, errors reported: $dvb_logs"
else
pass "Backup succeeded, no errors reported."
fi
dbx_logs=$(docker logs openapi_mock-1 2>&1)
if $dbx_logs | grep "ERROR"
then
fail "Backup failed, errors reported: $dvb_logs"
else
pass "Backup succeeded, no errors reported."
fi
# The second part of this test checks if backups get deleted when the retention
# is set to 0 days (which it should not as it would mean all backups get deleted)
# TODO: find out if we can test actual deletion without having to wait for a day
BACKUP_RETENTION_DAYS="0" docker compose up -d
sleep 5
docker compose exec backup backup
dvb_logs=$(docker logs backup-1 2>&1)
if $dvb_logs | grep "Refusing to do so, please check your configuratio"
then
pass "Remote backups have not been deleted."
else
fail "Remote backups would have been deleted: $dvb_logs"
fi
docker compose down --volumes

12753
test/dropbox/user_v2.yaml Normal file

File diff suppressed because it is too large Load Diff