| 
									
										
										
										
											2015-04-09 20:11:19 +02:00
										 |  |  | package test_helper | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-04-12 09:36:14 +02:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2015-04-09 20:11:19 +02:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-07-04 16:51:59 +02:00
										 |  |  | 	"io/ioutil" | 
					
						
							| 
									
										
										
										
											2015-04-12 09:36:14 +02:00
										 |  |  | 	"math/rand" | 
					
						
							| 
									
										
										
										
											2015-07-04 16:51:59 +02:00
										 |  |  | 	"os" | 
					
						
							|  |  |  | 	"os/exec" | 
					
						
							| 
									
										
										
										
											2015-04-09 20:11:19 +02:00
										 |  |  | 	"path/filepath" | 
					
						
							|  |  |  | 	"reflect" | 
					
						
							|  |  |  | 	"runtime" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/restic/restic/backend" | 
					
						
							| 
									
										
										
										
											2015-07-04 16:51:59 +02:00
										 |  |  | 	"github.com/restic/restic/backend/local" | 
					
						
							|  |  |  | 	"github.com/restic/restic/repository" | 
					
						
							| 
									
										
										
										
											2015-04-09 20:11:19 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Assert fails the test if the condition is false. | 
					
						
							|  |  |  | func Assert(tb testing.TB, condition bool, msg string, v ...interface{}) { | 
					
						
							|  |  |  | 	if !condition { | 
					
						
							|  |  |  | 		_, file, line, _ := runtime.Caller(1) | 
					
						
							|  |  |  | 		fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...) | 
					
						
							|  |  |  | 		tb.FailNow() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 16:22:43 +02:00
										 |  |  | // OK fails the test if an err is not nil. | 
					
						
							| 
									
										
										
										
											2015-04-09 20:11:19 +02:00
										 |  |  | func OK(tb testing.TB, err error) { | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		_, file, line, _ := runtime.Caller(1) | 
					
						
							|  |  |  | 		fmt.Printf("\033[31m%s:%d: unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error()) | 
					
						
							|  |  |  | 		tb.FailNow() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 16:22:43 +02:00
										 |  |  | // Equals fails the test if exp is not equal to act. | 
					
						
							| 
									
										
										
										
											2015-04-09 20:11:19 +02:00
										 |  |  | func Equals(tb testing.TB, exp, act interface{}) { | 
					
						
							|  |  |  | 	if !reflect.DeepEqual(exp, act) { | 
					
						
							|  |  |  | 		_, file, line, _ := runtime.Caller(1) | 
					
						
							|  |  |  | 		fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act) | 
					
						
							|  |  |  | 		tb.FailNow() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-26 17:10:31 +02:00
										 |  |  | func ParseID(s string) backend.ID { | 
					
						
							| 
									
										
										
										
											2015-04-09 20:11:19 +02:00
										 |  |  | 	id, err := backend.ParseID(s) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return id | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-12 09:36:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Random returns size bytes of pseudo-random data derived from the seed. | 
					
						
							|  |  |  | func Random(seed, count int) []byte { | 
					
						
							|  |  |  | 	buf := make([]byte, count) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rnd := rand.New(rand.NewSource(int64(seed))) | 
					
						
							|  |  |  | 	for i := 0; i < count; i++ { | 
					
						
							|  |  |  | 		buf[i] = byte(rnd.Uint32()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return buf | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // RandomReader returns a reader that returns size bytes of pseudo-random data | 
					
						
							|  |  |  | // derived from the seed. | 
					
						
							|  |  |  | func RandomReader(seed, size int) *bytes.Reader { | 
					
						
							|  |  |  | 	return bytes.NewReader(Random(seed, size)) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-04 16:51:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // SetupTarTestFixture extracts the tarFile to outputDir. | 
					
						
							|  |  |  | func SetupTarTestFixture(t testing.TB, outputDir, tarFile string) { | 
					
						
							|  |  |  | 	err := System("sh", "-c", `(cd "$1" && tar xz) < "$2"`, | 
					
						
							|  |  |  | 		"sh", outputDir, tarFile) | 
					
						
							|  |  |  | 	OK(t, err) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // System runs the command and returns the exit code. Output is passed on to | 
					
						
							|  |  |  | // stdout/stderr. | 
					
						
							|  |  |  | func System(command string, args ...string) error { | 
					
						
							|  |  |  | 	cmd := exec.Command(command, args...) | 
					
						
							|  |  |  | 	cmd.Stdout = os.Stdout | 
					
						
							|  |  |  | 	cmd.Stderr = os.Stderr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return cmd.Run() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // WithTestEnvironment creates a test environment, extracts the repository | 
					
						
							|  |  |  | // fixture and and calls f with the repository dir. | 
					
						
							|  |  |  | func WithTestEnvironment(t testing.TB, repoFixture string, f func(repodir string)) { | 
					
						
							|  |  |  | 	tempdir, err := ioutil.TempDir(TestTempDir, "restic-test-") | 
					
						
							|  |  |  | 	OK(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fd, err := os.Open(repoFixture) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	OK(t, fd.Close()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SetupTarTestFixture(t, tempdir, repoFixture) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	f(filepath.Join(tempdir, "repo")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !TestCleanup { | 
					
						
							|  |  |  | 		t.Logf("leaving temporary directory %v used for test", tempdir) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	OK(t, os.RemoveAll(tempdir)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // OpenLocalRepo opens the local repository located at dir. | 
					
						
							|  |  |  | func OpenLocalRepo(t testing.TB, dir string) *repository.Repository { | 
					
						
							|  |  |  | 	be, err := local.Open(dir) | 
					
						
							|  |  |  | 	OK(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	repo := repository.New(be) | 
					
						
							|  |  |  | 	err = repo.SearchKey(TestPassword) | 
					
						
							|  |  |  | 	OK(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return repo | 
					
						
							|  |  |  | } |