| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | package server_test | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 	"crypto/rand" | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 	"crypto/sha256" | 
					
						
							|  |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	"flag" | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/restic/restic" | 
					
						
							|  |  |  | 	"github.com/restic/restic/backend" | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 	. "github.com/restic/restic/test" | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | var benchTestDir = flag.String("test.dir", ".", "dir used in benchmarks (default: .)") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | type testJSONStruct struct { | 
					
						
							|  |  |  | 	Foo uint32 | 
					
						
							|  |  |  | 	Bar string | 
					
						
							|  |  |  | 	Baz []byte | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var serverTests = []testJSONStruct{ | 
					
						
							|  |  |  | 	testJSONStruct{Foo: 23, Bar: "Teststring", Baz: []byte("xx")}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestSaveJSON(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	server := SetupBackend(t) | 
					
						
							|  |  |  | 	defer TeardownBackend(t, server) | 
					
						
							|  |  |  | 	key := SetupKey(t, server, "geheim") | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 	server.SetKey(key) | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for _, obj := range serverTests { | 
					
						
							|  |  |  | 		data, err := json.Marshal(obj) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 		data = append(data, '\n') | 
					
						
							|  |  |  | 		h := sha256.Sum256(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		blob, err := server.SaveJSON(backend.Tree, obj) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		Assert(t, bytes.Equal(h[:], blob.ID), | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 			"TestSaveJSON: wrong plaintext ID: expected %02x, got %02x", | 
					
						
							|  |  |  | 			h, blob.ID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkSaveJSON(t *testing.B) { | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	server := SetupBackend(t) | 
					
						
							|  |  |  | 	defer TeardownBackend(t, server) | 
					
						
							|  |  |  | 	key := SetupKey(t, server, "geheim") | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 	server.SetKey(key) | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	obj := serverTests[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	data, err := json.Marshal(obj) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 	OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 	data = append(data, '\n') | 
					
						
							|  |  |  | 	h := sha256.Sum256(data) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 	t.ResetTimer() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 	for i := 0; i < t.N; i++ { | 
					
						
							|  |  |  | 		blob, err := server.SaveJSON(backend.Tree, obj) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		Assert(t, bytes.Equal(h[:], blob.ID), | 
					
						
							| 
									
										
										
										
											2015-02-16 19:32:36 +01:00
										 |  |  | 			"TestSaveJSON: wrong plaintext ID: expected %02x, got %02x", | 
					
						
							|  |  |  | 			h, blob.ID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | var testSizes = []int{5, 23, 2<<18 + 23, 1 << 20} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestSaveFrom(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	server := SetupBackend(t) | 
					
						
							|  |  |  | 	defer TeardownBackend(t, server) | 
					
						
							|  |  |  | 	key := SetupKey(t, server, "geheim") | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 	server.SetKey(key) | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for _, size := range testSizes { | 
					
						
							|  |  |  | 		data := make([]byte, size) | 
					
						
							|  |  |  | 		_, err := io.ReadFull(rand.Reader, data) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		id := sha256.Sum256(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// save | 
					
						
							|  |  |  | 		blob, err := server.SaveFrom(backend.Data, id[:], uint(size), bytes.NewReader(data)) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// read back | 
					
						
							|  |  |  | 		buf, err := server.Load(backend.Data, blob) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		Assert(t, len(buf) == len(data), | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 			"number of bytes read back does not match: expected %d, got %d", | 
					
						
							|  |  |  | 			len(data), len(buf)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		Assert(t, bytes.Equal(buf, data), | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 			"data does not match: expected %02x, got %02x", | 
					
						
							|  |  |  | 			data, buf) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkSaveFrom(t *testing.B) { | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	server := SetupBackend(t) | 
					
						
							|  |  |  | 	defer TeardownBackend(t, server) | 
					
						
							|  |  |  | 	key := SetupKey(t, server, "geheim") | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 	server.SetKey(key) | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	size := 4 << 20 // 4MiB | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	data := make([]byte, size) | 
					
						
							|  |  |  | 	_, err := io.ReadFull(rand.Reader, data) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 	OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	id := sha256.Sum256(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.ResetTimer() | 
					
						
							|  |  |  | 	t.SetBytes(int64(size)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i := 0; i < t.N; i++ { | 
					
						
							|  |  |  | 		// save | 
					
						
							|  |  |  | 		_, err := server.SaveFrom(backend.Data, id[:], uint(size), bytes.NewReader(data)) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 		OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-16 20:00:23 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-02-17 23:05:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | func TestLoadJSONID(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	if *benchTestDir == "" { | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 		t.Skip("benchdir not set, skipping TestServerStats") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	server := SetupBackend(t) | 
					
						
							|  |  |  | 	defer TeardownBackend(t, server) | 
					
						
							|  |  |  | 	key := SetupKey(t, server, "geheim") | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 	server.SetKey(key) | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// archive a few files | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	sn := SnapshotDir(t, server, *benchTestDir, nil) | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 	t.Logf("archived snapshot %v", sn.ID()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// benchmark loading first tree | 
					
						
							| 
									
										
										
										
											2015-03-28 11:50:23 +01:00
										 |  |  | 	done := make(chan struct{}) | 
					
						
							|  |  |  | 	first, found := <-server.List(backend.Tree, done) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 	Assert(t, found, "no Trees in repository found") | 
					
						
							| 
									
										
										
										
											2015-03-28 11:50:23 +01:00
										 |  |  | 	close(done) | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 	id, err := backend.ParseID(first) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 	OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 	tree := restic.NewTree() | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 	err = server.LoadJSONID(backend.Tree, id, &tree) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 	OK(t, err) | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkLoadJSONID(t *testing.B) { | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	if *benchTestDir == "" { | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 		t.Skip("benchdir not set, skipping TestServerStats") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	server := SetupBackend(t) | 
					
						
							|  |  |  | 	defer TeardownBackend(t, server) | 
					
						
							|  |  |  | 	key := SetupKey(t, server, "geheim") | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 	server.SetKey(key) | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// archive a few files | 
					
						
							| 
									
										
										
										
											2015-04-26 14:46:15 +02:00
										 |  |  | 	sn := SnapshotDir(t, server, *benchTestDir, nil) | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 	t.Logf("archived snapshot %v", sn.ID()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.ResetTimer() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tree := restic.NewTree() | 
					
						
							|  |  |  | 	for i := 0; i < t.N; i++ { | 
					
						
							| 
									
										
										
										
											2015-03-28 15:07:08 +01:00
										 |  |  | 		for name := range server.List(backend.Tree, nil) { | 
					
						
							|  |  |  | 			id, err := backend.ParseID(name) | 
					
						
							| 
									
										
										
										
											2015-04-09 21:15:48 +02:00
										 |  |  | 			OK(t, err) | 
					
						
							|  |  |  | 			OK(t, server.LoadJSONID(backend.Tree, id, &tree)) | 
					
						
							| 
									
										
										
										
											2015-02-18 22:46:09 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |