github.com/levb/mattermost-server@v5.3.1+incompatible/utils/file_backend_test.go (about) 1 // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package utils 5 6 import ( 7 "bytes" 8 "fmt" 9 "io/ioutil" 10 "os" 11 "testing" 12 13 "github.com/stretchr/testify/require" 14 "github.com/stretchr/testify/suite" 15 16 "github.com/mattermost/mattermost-server/mlog" 17 "github.com/mattermost/mattermost-server/model" 18 ) 19 20 type FileBackendTestSuite struct { 21 suite.Suite 22 23 settings model.FileSettings 24 backend FileBackend 25 } 26 27 func TestLocalFileBackendTestSuite(t *testing.T) { 28 // Setup a global logger to catch tests logging outside of app context 29 // The global logger will be stomped by apps initalizing but that's fine for testing. Ideally this won't happen. 30 mlog.InitGlobalLogger(mlog.NewLogger(&mlog.LoggerConfiguration{ 31 EnableConsole: true, 32 ConsoleJson: true, 33 ConsoleLevel: "error", 34 EnableFile: false, 35 })) 36 37 dir, err := ioutil.TempDir("", "") 38 require.NoError(t, err) 39 defer os.RemoveAll(dir) 40 41 suite.Run(t, &FileBackendTestSuite{ 42 settings: model.FileSettings{ 43 DriverName: model.NewString(model.IMAGE_DRIVER_LOCAL), 44 Directory: dir, 45 }, 46 }) 47 } 48 49 func TestS3FileBackendTestSuite(t *testing.T) { 50 runBackendTest(t, false) 51 } 52 53 func TestS3FileBackendTestSuiteWithEncryption(t *testing.T) { 54 runBackendTest(t, true) 55 } 56 57 func runBackendTest(t *testing.T, encrypt bool) { 58 s3Host := os.Getenv("CI_HOST") 59 if s3Host == "" { 60 s3Host = "dockerhost" 61 } 62 63 s3Port := os.Getenv("CI_MINIO_PORT") 64 if s3Port == "" { 65 s3Port = "9001" 66 } 67 68 s3Endpoint := fmt.Sprintf("%s:%s", s3Host, s3Port) 69 70 suite.Run(t, &FileBackendTestSuite{ 71 settings: model.FileSettings{ 72 DriverName: model.NewString(model.IMAGE_DRIVER_S3), 73 AmazonS3AccessKeyId: model.MINIO_ACCESS_KEY, 74 AmazonS3SecretAccessKey: model.MINIO_SECRET_KEY, 75 AmazonS3Bucket: model.MINIO_BUCKET, 76 AmazonS3Endpoint: s3Endpoint, 77 AmazonS3SSL: model.NewBool(false), 78 AmazonS3SSE: model.NewBool(encrypt), 79 }, 80 }) 81 } 82 83 func (s *FileBackendTestSuite) SetupTest() { 84 TranslationsPreInit() 85 86 backend, err := NewFileBackend(&s.settings, true) 87 require.Nil(s.T(), err) 88 s.backend = backend 89 } 90 91 func (s *FileBackendTestSuite) TestConnection() { 92 s.Nil(s.backend.TestConnection()) 93 } 94 95 func (s *FileBackendTestSuite) TestReadWriteFile() { 96 b := []byte("test") 97 path := "tests/" + model.NewId() 98 99 written, err := s.backend.WriteFile(bytes.NewReader(b), path) 100 s.Nil(err) 101 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 102 defer s.backend.RemoveFile(path) 103 104 read, err := s.backend.ReadFile(path) 105 s.Nil(err) 106 107 readString := string(read) 108 s.EqualValues(readString, "test") 109 } 110 111 func (s *FileBackendTestSuite) TestReadWriteFileImage() { 112 b := []byte("testimage") 113 path := "tests/" + model.NewId() + ".png" 114 115 written, err := s.backend.WriteFile(bytes.NewReader(b), path) 116 s.Nil(err) 117 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 118 defer s.backend.RemoveFile(path) 119 120 read, err := s.backend.ReadFile(path) 121 s.Nil(err) 122 123 readString := string(read) 124 s.EqualValues(readString, "testimage") 125 } 126 127 func (s *FileBackendTestSuite) TestFileExists() { 128 b := []byte("testimage") 129 path := "tests/" + model.NewId() + ".png" 130 131 _, err := s.backend.WriteFile(bytes.NewReader(b), path) 132 s.Nil(err) 133 defer s.backend.RemoveFile(path) 134 135 res, err := s.backend.FileExists(path) 136 s.Nil(err) 137 s.True(res) 138 139 res, err = s.backend.FileExists("tests/idontexist.png") 140 s.Nil(err) 141 s.False(res) 142 } 143 144 func (s *FileBackendTestSuite) TestCopyFile() { 145 b := []byte("test") 146 path1 := "tests/" + model.NewId() 147 path2 := "tests/" + model.NewId() 148 149 written, err := s.backend.WriteFile(bytes.NewReader(b), path1) 150 s.Nil(err) 151 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 152 defer s.backend.RemoveFile(path1) 153 154 err = s.backend.CopyFile(path1, path2) 155 s.Nil(err) 156 defer s.backend.RemoveFile(path2) 157 158 _, err = s.backend.ReadFile(path1) 159 s.Nil(err) 160 161 _, err = s.backend.ReadFile(path2) 162 s.Nil(err) 163 } 164 165 func (s *FileBackendTestSuite) TestCopyFileToDirectoryThatDoesntExist() { 166 b := []byte("test") 167 path1 := "tests/" + model.NewId() 168 path2 := "tests/newdirectory/" + model.NewId() 169 170 written, err := s.backend.WriteFile(bytes.NewReader(b), path1) 171 s.Nil(err) 172 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 173 defer s.backend.RemoveFile(path1) 174 175 err = s.backend.CopyFile(path1, path2) 176 s.Nil(err) 177 defer s.backend.RemoveFile(path2) 178 179 _, err = s.backend.ReadFile(path1) 180 s.Nil(err) 181 182 _, err = s.backend.ReadFile(path2) 183 s.Nil(err) 184 } 185 186 func (s *FileBackendTestSuite) TestMoveFile() { 187 b := []byte("test") 188 path1 := "tests/" + model.NewId() 189 path2 := "tests/" + model.NewId() 190 191 written, err := s.backend.WriteFile(bytes.NewReader(b), path1) 192 s.Nil(err) 193 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 194 defer s.backend.RemoveFile(path1) 195 196 s.Nil(s.backend.MoveFile(path1, path2)) 197 defer s.backend.RemoveFile(path2) 198 199 _, err = s.backend.ReadFile(path1) 200 s.Error(err) 201 202 _, err = s.backend.ReadFile(path2) 203 s.Nil(err) 204 } 205 206 func (s *FileBackendTestSuite) TestRemoveFile() { 207 b := []byte("test") 208 path := "tests/" + model.NewId() 209 210 written, err := s.backend.WriteFile(bytes.NewReader(b), path) 211 s.Nil(err) 212 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 213 s.Nil(s.backend.RemoveFile(path)) 214 215 _, err = s.backend.ReadFile(path) 216 s.Error(err) 217 218 written, err = s.backend.WriteFile(bytes.NewReader(b), "tests2/foo") 219 s.Nil(err) 220 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 221 222 written, err = s.backend.WriteFile(bytes.NewReader(b), "tests2/bar") 223 s.Nil(err) 224 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 225 226 written, err = s.backend.WriteFile(bytes.NewReader(b), "tests2/asdf") 227 s.Nil(err) 228 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 229 230 s.Nil(s.backend.RemoveDirectory("tests2")) 231 } 232 233 func (s *FileBackendTestSuite) TestListDirectory() { 234 b := []byte("test") 235 path1 := "19700101/" + model.NewId() 236 path2 := "19800101/" + model.NewId() 237 238 written, err := s.backend.WriteFile(bytes.NewReader(b), path1) 239 s.Nil(err) 240 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 241 defer s.backend.RemoveFile(path1) 242 243 written, err = s.backend.WriteFile(bytes.NewReader(b), path2) 244 s.Nil(err) 245 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 246 defer s.backend.RemoveFile(path2) 247 248 paths, err := s.backend.ListDirectory("") 249 s.Nil(err) 250 251 found1 := false 252 found2 := false 253 for _, path := range *paths { 254 if path == "19700101" { 255 found1 = true 256 } else if path == "19800101" { 257 found2 = true 258 } 259 } 260 s.True(found1) 261 s.True(found2) 262 } 263 264 func (s *FileBackendTestSuite) TestRemoveDirectory() { 265 b := []byte("test") 266 267 written, err := s.backend.WriteFile(bytes.NewReader(b), "tests2/foo") 268 s.Nil(err) 269 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 270 271 written, err = s.backend.WriteFile(bytes.NewReader(b), "tests2/bar") 272 s.Nil(err) 273 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 274 275 written, err = s.backend.WriteFile(bytes.NewReader(b), "tests2/aaa") 276 s.Nil(err) 277 s.EqualValues(len(b), written, "expected given number of bytes to have been written") 278 279 s.Nil(s.backend.RemoveDirectory("tests2")) 280 281 _, err = s.backend.ReadFile("tests2/foo") 282 s.Error(err) 283 _, err = s.backend.ReadFile("tests2/bar") 284 s.Error(err) 285 _, err = s.backend.ReadFile("tests2/asdf") 286 s.Error(err) 287 }