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