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  }