github.com/space0122/mattermost-server@v5.11.1+incompatible/testlib/resources.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package testlib
     5  
     6  import (
     7  	"fmt"
     8  	"io/ioutil"
     9  	"os"
    10  	"path"
    11  	"path/filepath"
    12  
    13  	"github.com/mattermost/mattermost-server/model"
    14  	"github.com/pkg/errors"
    15  
    16  	"github.com/mattermost/mattermost-server/utils"
    17  	"github.com/mattermost/mattermost-server/utils/fileutils"
    18  )
    19  
    20  const (
    21  	resourceTypeFile = iota
    22  	resourceTypeFolder
    23  )
    24  
    25  const (
    26  	actionCopy = iota
    27  	actionSymlink
    28  )
    29  
    30  type testResourceDetails struct {
    31  	src     string
    32  	dest    string
    33  	resType int8
    34  	action  int8
    35  }
    36  
    37  func getTestResourcesToSetup() []testResourceDetails {
    38  	var srcPath string
    39  	var found bool
    40  
    41  	var testResourcesToSetup = []testResourceDetails{
    42  		{"i18n", "i18n", resourceTypeFolder, actionSymlink},
    43  		{"templates", "templates", resourceTypeFolder, actionSymlink},
    44  		{"tests", "tests", resourceTypeFolder, actionSymlink},
    45  		{"fonts", "fonts", resourceTypeFolder, actionSymlink},
    46  		{"utils/policies-roles-mapping.json", "utils/policies-roles-mapping.json", resourceTypeFile, actionSymlink},
    47  	}
    48  
    49  	// Finding resources and setting full path to source to be used for further processing
    50  	for i, testResource := range testResourcesToSetup {
    51  		if testResource.resType == resourceTypeFile {
    52  			srcPath = fileutils.FindFile(testResource.src)
    53  			if srcPath == "" {
    54  				panic(fmt.Sprintf("Failed to find file %s", testResource.src))
    55  			}
    56  
    57  			testResourcesToSetup[i].src = srcPath
    58  		} else if testResource.resType == resourceTypeFolder {
    59  			srcPath, found = fileutils.FindDir(testResource.src)
    60  			if found == false {
    61  				panic(fmt.Sprintf("Failed to find folder %s", testResource.src))
    62  			}
    63  
    64  			testResourcesToSetup[i].src = srcPath
    65  		} else {
    66  			panic(fmt.Sprintf("Invalid resource type: %d", testResource.resType))
    67  		}
    68  	}
    69  
    70  	return testResourcesToSetup
    71  }
    72  
    73  func SetupTestResources() (string, error) {
    74  	testResourcesToSetup := getTestResourcesToSetup()
    75  
    76  	tempDir, err := ioutil.TempDir("", "testlib")
    77  	if err != nil {
    78  		return "", errors.Wrap(err, "failed to create temporary directory")
    79  	}
    80  
    81  	pluginsDir := path.Join(tempDir, "plugins")
    82  	err = os.Mkdir(pluginsDir, 0700)
    83  	if err != nil {
    84  		return "", errors.Wrapf(err, "failed to create plugins directory %s", pluginsDir)
    85  	}
    86  
    87  	err = setupConfig(path.Join(tempDir, "config"))
    88  	if err != nil {
    89  		return "", errors.Wrap(err, "failed to setup config")
    90  	}
    91  
    92  	var resourceDestInTemp string
    93  
    94  	// Setting up test resources in temp.
    95  	// Action in each resource tells whether it needs to be copied or just symlinked
    96  	for _, testResource := range testResourcesToSetup {
    97  		resourceDestInTemp = filepath.Join(tempDir, testResource.dest)
    98  
    99  		if testResource.action == actionCopy {
   100  			if testResource.resType == resourceTypeFile {
   101  				err = utils.CopyFile(testResource.src, resourceDestInTemp)
   102  				if err != nil {
   103  					return "", errors.Wrapf(err, "failed to copy file %s to %s", testResource.src, resourceDestInTemp)
   104  				}
   105  			} else if testResource.resType == resourceTypeFolder {
   106  				err = utils.CopyDir(testResource.src, resourceDestInTemp)
   107  				if err != nil {
   108  					return "", errors.Wrapf(err, "failed to copy folder %s to %s", testResource.src, resourceDestInTemp)
   109  				}
   110  			}
   111  		} else if testResource.action == actionSymlink {
   112  			destDir := path.Dir(resourceDestInTemp)
   113  			if destDir != "." {
   114  				err = os.MkdirAll(destDir, os.ModePerm)
   115  				if err != nil {
   116  					return "", errors.Wrapf(err, "failed to make dir %s", destDir)
   117  				}
   118  			}
   119  
   120  			err = os.Symlink(testResource.src, resourceDestInTemp)
   121  			if err != nil {
   122  				return "", errors.Wrapf(err, "failed to symlink %s to %s", testResource.src, resourceDestInTemp)
   123  			}
   124  		} else {
   125  			return "", errors.Wrapf(err, "Invalid action: %d", testResource.action)
   126  		}
   127  
   128  	}
   129  
   130  	return tempDir, nil
   131  }
   132  
   133  func setupConfig(configDir string) error {
   134  	var err error
   135  	var config model.Config
   136  
   137  	config.SetDefaults()
   138  
   139  	err = os.Mkdir(configDir, 0700)
   140  	if err != nil {
   141  		return errors.Wrapf(err, "failed to create config directory %s", configDir)
   142  	}
   143  
   144  	defaultJson := path.Join(configDir, "default.json")
   145  	err = ioutil.WriteFile(defaultJson, []byte(config.ToJson()), 0644)
   146  	if err != nil {
   147  		return errors.Wrapf(err, "failed to write config to %s", defaultJson)
   148  	}
   149  
   150  	configJson := path.Join(configDir, "config.json")
   151  	err = utils.CopyFile(defaultJson, configJson)
   152  	if err != nil {
   153  		return errors.Wrapf(err, "failed to copy file %s to %s", defaultJson, configJson)
   154  	}
   155  
   156  	return nil
   157  }