package rclone import ( "bytes" "errors" "fmt" "io/ioutil" "local/sandbox/arlo-cleaner/config" "os" "path" "strings" "testing" ) func TestMinio(t *testing.T) { if _, ok := os.LookupEnv("INTEGRATION"); !ok { t.Log("$INTEGRATION not set") return } t.Log("docker run --rm -d --name minio -p 9000:9000 -e MINIO_ACCESS_KEY=accesskey -e MINIO_SECRET_KEY=secretkey minio/minio server /data && mc mb local/bucket") f, err := ioutil.TempFile(os.TempDir(), "minio.config.*") if err != nil { t.Fatal(err) } defer os.Remove(f.Name()) f.Write([]byte(` [minio] type = s3 provider = Minio env_auth = false access_key_id = accesskey secret_access_key = secretkey endpoint = http://localhost:9000 acl = private `)) f.Close() os.Setenv("RCCONF", f.Name()) was := os.Args defer func() { os.Args = was }() os.Args = []string{"a"} if err := config.Refresh(); err != nil { t.Fatal(err) } rc, err := New() if err != nil { t.Fatal(err) } name := "minio:bucket/key" calls := []struct { foo func(*RClone, string) error ok bool }{ {minioDel, true}, {minioCopyFrom, false}, {minioCopyTo, true}, {minioList, true}, {minioCopyFrom, true}, {minioDel, true}, {minioCopyFrom, false}, } for _, call := range calls { if err := call.foo(rc, name); (err == nil) != call.ok { t.Fatal(call) } } } func minioCopyTo(rc *RClone, name string) error { return rc.CopyTo(strings.NewReader("hello"), name) } func minioCopyFrom(rc *RClone, name string) error { w := bytes.NewBuffer(nil) if err := rc.CopyFrom(w, name); err != nil { return err } else if v := string(w.Bytes()); v != "hello" { return errors.New(v) } return nil } func minioDel(rc *RClone, name string) error { return rc.Del(name) } func minioList(rc *RClone, name string) error { names, err := rc.List(path.Dir(name)) if err != nil { return err } if len(names) != 1 { return fmt.Errorf("%v", len(names)) } if names[0] != "key" { return errors.New(names[0]) } return nil }