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  }