github.com/release-engineering/exodus-rsync@v1.11.2/internal/cmd/cmd_sync_read_errors_test.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "os" 6 "strings" 7 "testing" 8 9 "github.com/golang/mock/gomock" 10 "github.com/release-engineering/exodus-rsync/internal/gw" 11 ) 12 13 func TestMainSyncUnreadableFile(t *testing.T) { 14 SetConfig(t, CONFIG) 15 16 logs := CaptureLogger(t) 17 18 // Make a couple of files, one of which we can't read 19 os.Mkdir("src", 0755) 20 os.WriteFile("src/file1", []byte("hello"), 0644) 21 os.WriteFile("src/file2", []byte("can't read me"), 0000) 22 23 ctrl := MockController(t) 24 25 mockGw := gw.NewMockInterface(ctrl) 26 ext.gw = mockGw 27 28 client := FakeClient{blobs: make(map[string]string)} 29 mockGw.EXPECT().NewClient(gomock.Any(), EnvMatcher{"best-env"}).Return(&client, nil) 30 31 args := []string{"rsync", "src", "exodus:/some/target"} 32 33 got := Main(args) 34 35 // It should fail. 36 if got != 73 { 37 t.Error("returned incorrect exit code", got) 38 } 39 40 // It should have told us why. 41 entry := FindEntry(logs, "can't read files for sync") 42 if entry == nil { 43 t.Fatal("missing expected log message") 44 } 45 46 err := fmt.Sprint(entry.Fields["error"]) 47 if !strings.Contains(err, "checksum src/file2:") { 48 t.Error("unexpected error message", err) 49 } 50 } 51 52 func TestMainSyncUnreadableFilesFrom(t *testing.T) { 53 SetConfig(t, CONFIG) 54 55 logs := CaptureLogger(t) 56 57 ctrl := MockController(t) 58 59 mockGw := gw.NewMockInterface(ctrl) 60 ext.gw = mockGw 61 62 client := FakeClient{blobs: make(map[string]string)} 63 mockGw.EXPECT().NewClient(gomock.Any(), EnvMatcher{"best-env"}).Return(&client, nil) 64 65 args := []string{"rsync", "--files-from", "/sources.txt", ".", "exodus:/some/target"} 66 67 got := Main(args) 68 69 // It should fail. 70 if got != 73 { 71 t.Error("returned incorrect exit code", got) 72 } 73 74 // It should have told us why. 75 entry := FindEntry(logs, "can't read --files-from file") 76 if entry == nil { 77 t.Fatal("missing expected log message") 78 } 79 80 err := fmt.Sprint(entry.Fields["error"]) 81 if !strings.Contains(err, "no such file or directory") { 82 t.Error("unexpected error message", err) 83 } 84 } 85 86 func TestMainSyncUnreadableDir(t *testing.T) { 87 SetConfig(t, CONFIG) 88 89 logs := CaptureLogger(t) 90 91 // Make a directory which cannot be read 92 os.Mkdir("src", 0755) 93 os.Mkdir("src/unreadable-dir", 0000) 94 95 ctrl := MockController(t) 96 97 mockGw := gw.NewMockInterface(ctrl) 98 ext.gw = mockGw 99 100 client := FakeClient{blobs: make(map[string]string)} 101 mockGw.EXPECT().NewClient(gomock.Any(), EnvMatcher{"best-env"}).Return(&client, nil) 102 103 args := []string{"rsync", "src", "exodus:/some/target"} 104 105 got := Main(args) 106 107 // It should fail. 108 if got != 73 { 109 t.Error("returned incorrect exit code", got) 110 } 111 112 // It should have told us why. 113 entry := FindEntry(logs, "can't read files for sync") 114 if entry == nil { 115 t.Fatal("missing expected log message") 116 } 117 118 err := fmt.Sprint(entry.Fields["error"]) 119 if !strings.Contains(err, "open src/unreadable-dir:") { 120 t.Error("unexpected error message", err) 121 } 122 }