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  }