github.com/keys-pub/mattermost-server@v4.10.10+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  	"fmt"
     8  	"io/ioutil"
     9  	"os"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  	"github.com/stretchr/testify/suite"
    14  
    15  	"github.com/mattermost/mattermost-server/mlog"
    16  	"github.com/mattermost/mattermost-server/model"
    17  )
    18  
    19  type FileBackendTestSuite struct {
    20  	suite.Suite
    21  
    22  	settings model.FileSettings
    23  	backend  FileBackend
    24  }
    25  
    26  func TestLocalFileBackendTestSuite(t *testing.T) {
    27  	// Setup a global logger to catch tests logging outside of app context
    28  	// The global logger will be stomped by apps initalizing but that's fine for testing. Ideally this won't happen.
    29  	mlog.InitGlobalLogger(mlog.NewLogger(&mlog.LoggerConfiguration{
    30  		EnableConsole: true,
    31  		ConsoleJson:   true,
    32  		ConsoleLevel:  "error",
    33  		EnableFile:    false,
    34  	}))
    35  
    36  	dir, err := ioutil.TempDir("", "")
    37  	require.NoError(t, err)
    38  	defer os.RemoveAll(dir)
    39  
    40  	suite.Run(t, &FileBackendTestSuite{
    41  		settings: model.FileSettings{
    42  			DriverName: model.NewString(model.IMAGE_DRIVER_LOCAL),
    43  			Directory:  dir,
    44  		},
    45  	})
    46  }
    47  
    48  func TestS3FileBackendTestSuite(t *testing.T) {
    49  	runBackendTest(t, false)
    50  }
    51  
    52  func TestS3FileBackendTestSuiteWithEncryption(t *testing.T) {
    53  	runBackendTest(t, true)
    54  }
    55  
    56  func runBackendTest(t *testing.T, encrypt bool) {
    57  	s3Host := os.Getenv("CI_HOST")
    58  	if s3Host == "" {
    59  		s3Host = "dockerhost"
    60  	}
    61  
    62  	s3Port := os.Getenv("CI_MINIO_PORT")
    63  	if s3Port == "" {
    64  		s3Port = "9001"
    65  	}
    66  
    67  	s3Endpoint := fmt.Sprintf("%s:%s", s3Host, s3Port)
    68  
    69  	suite.Run(t, &FileBackendTestSuite{
    70  		settings: model.FileSettings{
    71  			DriverName:              model.NewString(model.IMAGE_DRIVER_S3),
    72  			AmazonS3AccessKeyId:     model.MINIO_ACCESS_KEY,
    73  			AmazonS3SecretAccessKey: model.MINIO_SECRET_KEY,
    74  			AmazonS3Bucket:          model.MINIO_BUCKET,
    75  			AmazonS3Endpoint:        s3Endpoint,
    76  			AmazonS3SSL:             model.NewBool(false),
    77  			AmazonS3SSE:             model.NewBool(encrypt),
    78  		},
    79  	})
    80  }
    81  
    82  func (s *FileBackendTestSuite) SetupTest() {
    83  	TranslationsPreInit()
    84  
    85  	backend, err := NewFileBackend(&s.settings, true)
    86  	require.Nil(s.T(), err)
    87  	s.backend = backend
    88  }
    89  
    90  func (s *FileBackendTestSuite) TestConnection() {
    91  	s.Nil(s.backend.TestConnection())
    92  }
    93  
    94  func (s *FileBackendTestSuite) TestReadWriteFile() {
    95  	b := []byte("test")
    96  	path := "tests/" + model.NewId()
    97  
    98  	s.Nil(s.backend.WriteFile(b, path))
    99  	defer s.backend.RemoveFile(path)
   100  
   101  	read, err := s.backend.ReadFile(path)
   102  	s.Nil(err)
   103  
   104  	readString := string(read)
   105  	s.EqualValues(readString, "test")
   106  }
   107  
   108  func (s *FileBackendTestSuite) TestReadWriteFileImage() {
   109  	b := []byte("testimage")
   110  	path := "tests/" + model.NewId() + ".png"
   111  
   112  	s.Nil(s.backend.WriteFile(b, path))
   113  	defer s.backend.RemoveFile(path)
   114  
   115  	read, err := s.backend.ReadFile(path)
   116  	s.Nil(err)
   117  
   118  	readString := string(read)
   119  	s.EqualValues(readString, "testimage")
   120  }
   121  
   122  func (s *FileBackendTestSuite) TestCopyFile() {
   123  	b := []byte("test")
   124  	path1 := "tests/" + model.NewId()
   125  	path2 := "tests/" + model.NewId()
   126  
   127  	err := s.backend.WriteFile(b, path1)
   128  	s.Nil(err)
   129  	defer s.backend.RemoveFile(path1)
   130  
   131  	err = s.backend.CopyFile(path1, path2)
   132  	s.Nil(err)
   133  	defer s.backend.RemoveFile(path2)
   134  
   135  	_, err = s.backend.ReadFile(path1)
   136  	s.Nil(err)
   137  
   138  	_, err = s.backend.ReadFile(path2)
   139  	s.Nil(err)
   140  }
   141  
   142  func (s *FileBackendTestSuite) TestCopyFileToDirectoryThatDoesntExist() {
   143  	b := []byte("test")
   144  	path1 := "tests/" + model.NewId()
   145  	path2 := "tests/newdirectory/" + model.NewId()
   146  
   147  	err := s.backend.WriteFile(b, path1)
   148  	s.Nil(err)
   149  	defer s.backend.RemoveFile(path1)
   150  
   151  	err = s.backend.CopyFile(path1, path2)
   152  	s.Nil(err)
   153  	defer s.backend.RemoveFile(path2)
   154  
   155  	_, err = s.backend.ReadFile(path1)
   156  	s.Nil(err)
   157  
   158  	_, err = s.backend.ReadFile(path2)
   159  	s.Nil(err)
   160  }
   161  
   162  func (s *FileBackendTestSuite) TestMoveFile() {
   163  	b := []byte("test")
   164  	path1 := "tests/" + model.NewId()
   165  	path2 := "tests/" + model.NewId()
   166  
   167  	s.Nil(s.backend.WriteFile(b, path1))
   168  	defer s.backend.RemoveFile(path1)
   169  
   170  	s.Nil(s.backend.MoveFile(path1, path2))
   171  	defer s.backend.RemoveFile(path2)
   172  
   173  	_, err := s.backend.ReadFile(path1)
   174  	s.Error(err)
   175  
   176  	_, err = s.backend.ReadFile(path2)
   177  	s.Nil(err)
   178  }
   179  
   180  func (s *FileBackendTestSuite) TestRemoveFile() {
   181  	b := []byte("test")
   182  	path := "tests/" + model.NewId()
   183  
   184  	s.Nil(s.backend.WriteFile(b, path))
   185  	s.Nil(s.backend.RemoveFile(path))
   186  
   187  	_, err := s.backend.ReadFile(path)
   188  	s.Error(err)
   189  
   190  	s.Nil(s.backend.WriteFile(b, "tests2/foo"))
   191  	s.Nil(s.backend.WriteFile(b, "tests2/bar"))
   192  	s.Nil(s.backend.WriteFile(b, "tests2/asdf"))
   193  	s.Nil(s.backend.RemoveDirectory("tests2"))
   194  }
   195  
   196  func (s *FileBackendTestSuite) TestListDirectory() {
   197  	b := []byte("test")
   198  	path1 := "19700101/" + model.NewId()
   199  	path2 := "19800101/" + model.NewId()
   200  
   201  	s.Nil(s.backend.WriteFile(b, path1))
   202  	defer s.backend.RemoveFile(path1)
   203  	s.Nil(s.backend.WriteFile(b, path2))
   204  	defer s.backend.RemoveFile(path2)
   205  
   206  	paths, err := s.backend.ListDirectory("")
   207  	s.Nil(err)
   208  
   209  	found1 := false
   210  	found2 := false
   211  	for _, path := range *paths {
   212  		if path == "19700101" {
   213  			found1 = true
   214  		} else if path == "19800101" {
   215  			found2 = true
   216  		}
   217  	}
   218  	s.True(found1)
   219  	s.True(found2)
   220  }
   221  
   222  func (s *FileBackendTestSuite) TestRemoveDirectory() {
   223  	b := []byte("test")
   224  
   225  	s.Nil(s.backend.WriteFile(b, "tests2/foo"))
   226  	s.Nil(s.backend.WriteFile(b, "tests2/bar"))
   227  	s.Nil(s.backend.WriteFile(b, "tests2/aaa"))
   228  
   229  	s.Nil(s.backend.RemoveDirectory("tests2"))
   230  
   231  	_, err := s.backend.ReadFile("tests2/foo")
   232  	s.Error(err)
   233  	_, err = s.backend.ReadFile("tests2/bar")
   234  	s.Error(err)
   235  	_, err = s.backend.ReadFile("tests2/asdf")
   236  	s.Error(err)
   237  }