vitess.io/vitess@v0.16.2/go/vt/mysqlctl/filebackupstorage/file_test.go (about) 1 /* 2 Copyright 2019 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package filebackupstorage 18 19 import ( 20 "context" 21 "io" 22 "testing" 23 ) 24 25 // This file tests the file BackupStorage engine. 26 27 // Note this is a very generic test for BackupStorage implementations, 28 // we test the interface only. But making it a generic test library is 29 // more cumbersome, we'll do that when we have an actual need for 30 // another BackupStorage implementation. 31 32 // setupFileBackupStorage creates a temporary directory, and 33 // returns a FileBackupStorage based on it 34 func setupFileBackupStorage(t *testing.T) *FileBackupStorage { 35 FileBackupStorageRoot = t.TempDir() 36 return &FileBackupStorage{} 37 } 38 39 func TestListBackups(t *testing.T) { 40 fbs := setupFileBackupStorage(t) 41 ctx := context.Background() 42 43 // verify we have no entry now 44 dir := "keyspace/shard" 45 bhs, err := fbs.ListBackups(ctx, dir) 46 if err != nil { 47 t.Fatalf("ListBackups on empty fbs failed: %v", err) 48 } 49 if len(bhs) != 0 { 50 t.Fatalf("ListBackups on empty fbs returned results: %#v", bhs) 51 } 52 53 // add one empty backup 54 firstBackup := "cell-0001-2015-01-14-10-00-00" 55 bh, err := fbs.StartBackup(ctx, dir, firstBackup) 56 if err != nil { 57 t.Fatalf("fbs.StartBackup failed: %v", err) 58 } 59 if err := bh.EndBackup(ctx); err != nil { 60 t.Fatalf("bh.EndBackup failed: %v", err) 61 } 62 63 // verify we have one entry now 64 bhs, err = fbs.ListBackups(ctx, dir) 65 if err != nil { 66 t.Fatalf("ListBackups on empty fbs failed: %v", err) 67 } 68 if len(bhs) != 1 || 69 bhs[0].Directory() != dir || 70 bhs[0].Name() != firstBackup { 71 t.Fatalf("ListBackups with one backup returned wrong results: %#v", bhs) 72 } 73 74 // add another one, with earlier date 75 secondBackup := "cell-0001-2015-01-12-10-00-00" 76 bh, err = fbs.StartBackup(ctx, dir, secondBackup) 77 if err != nil { 78 t.Fatalf("fbs.StartBackup failed: %v", err) 79 } 80 if err := bh.EndBackup(ctx); err != nil { 81 t.Fatalf("bh.EndBackup failed: %v", err) 82 } 83 84 // verify we have two sorted entries now 85 bhs, err = fbs.ListBackups(ctx, dir) 86 if err != nil { 87 t.Fatalf("ListBackups on empty fbs failed: %v", err) 88 } 89 if len(bhs) != 2 || 90 bhs[0].Directory() != dir || 91 bhs[0].Name() != secondBackup || 92 bhs[1].Directory() != dir || 93 bhs[1].Name() != firstBackup { 94 t.Fatalf("ListBackups with two backups returned wrong results: %#v", bhs) 95 } 96 97 // remove a backup, back to one 98 if err := fbs.RemoveBackup(ctx, dir, secondBackup); err != nil { 99 t.Fatalf("RemoveBackup failed: %v", err) 100 } 101 bhs, err = fbs.ListBackups(ctx, dir) 102 if err != nil { 103 t.Fatalf("ListBackups after deletion failed: %v", err) 104 } 105 if len(bhs) != 1 || 106 bhs[0].Directory() != dir || 107 bhs[0].Name() != firstBackup { 108 t.Fatalf("ListBackups after deletion returned wrong results: %#v", bhs) 109 } 110 111 // add a backup but abort it, should stay at one 112 bh, err = fbs.StartBackup(ctx, dir, secondBackup) 113 if err != nil { 114 t.Fatalf("fbs.StartBackup failed: %v", err) 115 } 116 if err := bh.AbortBackup(ctx); err != nil { 117 t.Fatalf("bh.AbortBackup failed: %v", err) 118 } 119 bhs, err = fbs.ListBackups(ctx, dir) 120 if err != nil { 121 t.Fatalf("ListBackups after abort failed: %v", err) 122 } 123 if len(bhs) != 1 || 124 bhs[0].Directory() != dir || 125 bhs[0].Name() != firstBackup { 126 t.Fatalf("ListBackups after abort returned wrong results: %#v", bhs) 127 } 128 129 // check we cannot chaneg a backup we listed 130 if _, err := bhs[0].AddFile(ctx, "test", 0); err == nil { 131 t.Fatalf("was able to AddFile to read-only backup") 132 } 133 if err := bhs[0].EndBackup(ctx); err == nil { 134 t.Fatalf("was able to EndBackup a read-only backup") 135 } 136 if err := bhs[0].AbortBackup(ctx); err == nil { 137 t.Fatalf("was able to AbortBackup a read-only backup") 138 } 139 } 140 141 func TestFileContents(t *testing.T) { 142 fbs := setupFileBackupStorage(t) 143 ctx := context.Background() 144 145 dir := "keyspace/shard" 146 name := "cell-0001-2015-01-14-10-00-00" 147 filename1 := "file1" 148 contents1 := "contents of the first file" 149 150 // start a backup, add a file 151 bh, err := fbs.StartBackup(ctx, dir, name) 152 if err != nil { 153 t.Fatalf("fbs.StartBackup failed: %v", err) 154 } 155 wc, err := bh.AddFile(ctx, filename1, 0) 156 if err != nil { 157 t.Fatalf("bh.AddFile failed: %v", err) 158 } 159 if _, err := wc.Write([]byte(contents1)); err != nil { 160 t.Fatalf("wc.Write failed: %v", err) 161 } 162 if err := wc.Close(); err != nil { 163 t.Fatalf("wc.Close failed: %v", err) 164 } 165 166 // test we can't read back on read-write backup 167 if _, err := bh.ReadFile(ctx, filename1); err == nil { 168 t.Fatalf("was able to ReadFile to read-write backup") 169 } 170 171 // and close 172 if err := bh.EndBackup(ctx); err != nil { 173 t.Fatalf("bh.EndBackup failed: %v", err) 174 } 175 176 // re-read the file 177 bhs, err := fbs.ListBackups(ctx, dir) 178 if err != nil || len(bhs) != 1 { 179 t.Fatalf("ListBackups after abort returned wrong return: %v %v", err, bhs) 180 } 181 rc, err := bhs[0].ReadFile(ctx, filename1) 182 if err != nil { 183 t.Fatalf("bhs[0].ReadFile failed: %v", err) 184 } 185 buf := make([]byte, len(contents1)+10) 186 if n, err := rc.Read(buf); (err != nil && err != io.EOF) || n != len(contents1) { 187 t.Fatalf("rc.Read returned wrong result: %v %#v", err, n) 188 } 189 if err := rc.Close(); err != nil { 190 t.Fatalf("rc.Close failed: %v", err) 191 } 192 }