2
2
mirror of https://github.com/octoleo/restic.git synced 2024-11-30 00:33:57 +00:00
restic/internal/backend/rest/rest_test.go

124 lines
2.5 KiB
Go
Raw Normal View History

package rest_test
import (
2017-05-11 20:40:50 +00:00
"context"
"net"
"net/url"
"os"
2017-05-01 21:08:16 +00:00
"os/exec"
"testing"
"time"
2017-07-23 12:21:03 +00:00
"github.com/restic/restic/internal/backend/rest"
"github.com/restic/restic/internal/backend/test"
2017-10-02 13:06:39 +00:00
rtest "github.com/restic/restic/internal/test"
)
2018-01-20 09:16:50 +00:00
func runRESTServer(ctx context.Context, t testing.TB, dir string) (*url.URL, func()) {
2017-05-01 21:08:16 +00:00
srv, err := exec.LookPath("rest-server")
if err != nil {
t.Skip(err)
}
cmd := exec.CommandContext(ctx, srv, "--no-auth", "--path", dir)
2017-05-01 21:08:16 +00:00
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stdout
2017-05-01 21:08:16 +00:00
if err := cmd.Start(); err != nil {
t.Fatal(err)
}
// wait until the TCP port is reachable
var success bool
for i := 0; i < 10; i++ {
time.Sleep(200 * time.Millisecond)
c, err := net.Dial("tcp", "localhost:8000")
if err != nil {
continue
2017-05-01 21:08:16 +00:00
}
success = true
if err := c.Close(); err != nil {
t.Fatal(err)
}
}
if !success {
t.Fatal("unable to connect to rest server")
2018-01-20 09:16:50 +00:00
return nil, nil
}
url, err := url.Parse("http://localhost:8000/restic-test/")
2018-01-20 09:16:50 +00:00
if err != nil {
t.Fatal(err)
}
cleanup := func() {
2017-05-01 21:08:16 +00:00
if err := cmd.Process.Kill(); err != nil {
t.Fatal(err)
}
// ignore errors, we've killed the process
_ = cmd.Wait()
}
2018-01-20 09:16:50 +00:00
return url, cleanup
}
2017-05-01 21:08:16 +00:00
2023-06-08 17:35:20 +00:00
func newTestSuite(url *url.URL, minimalData bool) *test.Suite[rest.Config] {
return &test.Suite[rest.Config]{
2018-01-20 09:16:50 +00:00
MinimalData: minimalData,
2017-05-01 21:08:16 +00:00
// NewConfig returns a config for a new temporary backend that will be used in tests.
NewConfig: func() (*rest.Config, error) {
2017-06-05 22:25:22 +00:00
cfg := rest.NewConfig()
cfg.URL = url
return &cfg, nil
2017-05-01 21:08:16 +00:00
},
Factory: rest.NewFactory(),
2017-05-01 21:08:16 +00:00
}
2017-05-13 19:56:18 +00:00
}
func TestBackendREST(t *testing.T) {
defer func() {
if t.Skipped() {
2017-10-02 13:06:39 +00:00
rtest.SkipDisallowed(t, "restic/backend/rest.TestBackendREST")
2017-05-13 19:56:18 +00:00
}
}()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
dir := rtest.TempDir(t)
2018-01-20 09:16:50 +00:00
serverURL, cleanup := runRESTServer(ctx, t, dir)
2017-05-13 19:56:18 +00:00
defer cleanup()
2023-06-08 17:35:20 +00:00
newTestSuite(serverURL, false).RunTests(t)
2017-05-13 19:56:18 +00:00
}
2018-01-20 09:25:47 +00:00
func TestBackendRESTExternalServer(t *testing.T) {
repostr := os.Getenv("RESTIC_TEST_REST_REPOSITORY")
if repostr == "" {
t.Skipf("environment variable %v not set", "RESTIC_TEST_REST_REPOSITORY")
}
cfg, err := rest.ParseConfig(repostr)
if err != nil {
t.Fatal(err)
}
2023-06-08 17:35:20 +00:00
newTestSuite(cfg.URL, true).RunTests(t)
2018-01-20 09:25:47 +00:00
}
2017-05-13 19:56:18 +00:00
func BenchmarkBackendREST(t *testing.B) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
dir := rtest.TempDir(t)
2018-01-20 09:16:50 +00:00
serverURL, cleanup := runRESTServer(ctx, t, dir)
2017-05-13 19:56:18 +00:00
defer cleanup()
2017-05-01 21:08:16 +00:00
2023-06-08 17:35:20 +00:00
newTestSuite(serverURL, false).RunBenchmarks(t)
2017-05-01 21:08:16 +00:00
}