gitlab.nesad.fit.vutbr.cz/blended/libblended@v0.0.0-20221202124402-2bee159339df/catalog/catalog_test.go (about)

     1  package catalog
     2  
     3  import (
     4  	guuid "github.com/google/uuid"
     5  	shell "github.com/ipfs/go-ipfs-api"
     6  	"github.com/jinzhu/gorm"
     7  	"github.com/stretchr/testify/assert"
     8  	"gitlab.nesad.fit.vutbr.cz/blended/libblended/catalog/models"
     9  	"gitlab.nesad.fit.vutbr.cz/blended/libblended/ipfs"
    10  	"io/ioutil"
    11  	"os"
    12  	"path/filepath"
    13  	"testing"
    14  )
    15  
    16  func guid() string {
    17  	return guuid.New().String()
    18  }
    19  
    20  func setupCatalogClient(t *testing.T) *Catalog {
    21  	dbClient, err := NewSQLiteDatabaseClient("./Catalog.db")
    22  	assert.NotNil(t, dbClient)
    23  	assert.Nil(t, err)
    24  
    25  	ipfsIp, exists := os.LookupEnv("IPFS_IP")
    26  	if !exists {
    27  		ipfsIp = "localhost:5001"
    28  	}
    29  
    30  	ipfsClient, err := ipfs.NewIpfsClient(ipfsIp)
    31  	assert.NotNil(t, ipfsClient)
    32  	assert.Nil(t, err)
    33  
    34  	client := NewCatalogClient(*dbClient, *ipfsClient)
    35  	assert.NotNil(t, client)
    36  	return client
    37  }
    38  
    39  func createFile(t *testing.T, size int) (string, func()) {
    40  	buff := make([]byte, size)
    41  	path := "./testFile_" + guid() + ".txt"
    42  	err := ioutil.WriteFile(path, buff, 0777)
    43  	assert.Nil(t, err)
    44  
    45  	assert.Nil(t, err)
    46  
    47  	fileAbsolutePath, err := filepath.Abs(path)
    48  	assert.Nil(t, err)
    49  	return path, func() {
    50  		err = os.Remove(fileAbsolutePath)
    51  		assert.Nil(t, err)
    52  	}
    53  }
    54  
    55  func createDir(t *testing.T, filesCount int) (string, func()) {
    56  	dirName := "testDir_" + guid()
    57  	err := os.Mkdir(dirName, 0777)
    58  	assert.Nil(t, err)
    59  
    60  	pwd, err := os.Getwd()
    61  	assert.Nil(t, err)
    62  
    63  	err = os.Chdir(dirName)
    64  	assert.Nil(t, err)
    65  	var cleaners []func()
    66  	for i := 0; i < filesCount; i++ {
    67  		_, cleaner := createFile(t, 1000000)
    68  		cleaners = append(cleaners, cleaner)
    69  	}
    70  	err = os.Chdir(pwd)
    71  	assert.Nil(t, err)
    72  
    73  	return dirName, func() {
    74  		for i := 0; i < len(cleaners); i++ {
    75  			cleaners[i]()
    76  		}
    77  		err = os.Remove(dirName)
    78  		assert.Nil(t, err)
    79  	}
    80  }
    81  
    82  func TestCatalog_Add(t *testing.T) {
    83  	client := setupCatalogClient(t)
    84  	file, cleanerFunc := createFile(t, 50000000)
    85  	defer cleanerFunc()
    86  	result, err := client.Add("", file, false, false, nil)
    87  	assert.NotNil(t, result)
    88  	assert.Nil(t, err)
    89  }
    90  
    91  func TestCatalog_AddWithPath(t *testing.T) {
    92  	client := setupCatalogClient(t)
    93  	file, cleanerFunc := createFile(t, 50000000)
    94  	defer cleanerFunc()
    95  	rootName := guid()
    96  	result, err := client.Add(rootName+"/b/c/d", file, false, false, nil)
    97  	assert.NotNil(t, result)
    98  	assert.Nil(t, err)
    99  
   100  	err = client.Download(rootName+"/b/c/d", ".", nil)
   101  	assert.Nil(t, err)
   102  }
   103  
   104  func TestCatalog_AddToExistingPath(t *testing.T) {
   105  	client := setupCatalogClient(t)
   106  	file, cleanerFunc := createFile(t, 50000000)
   107  	defer cleanerFunc()
   108  	rootName := guid()
   109  	result, err := client.Add(rootName+"/b/c/d", file, false, false, nil)
   110  	assert.NotNil(t, result)
   111  	assert.Nil(t, err)
   112  
   113  	err = client.Download(rootName+"/b/c/d", ".", nil)
   114  	assert.Nil(t, err)
   115  
   116  	result, err = client.Add(rootName+"/b/c/e", file, false, false, nil)
   117  	assert.NotNil(t, result)
   118  	assert.Nil(t, err)
   119  
   120  	err = client.Download(rootName+"/b/c/e", ".", nil)
   121  	assert.Nil(t, err)
   122  }
   123  
   124  func TestCatalog_AddWithLock(t *testing.T) {
   125  	client := setupCatalogClient(t)
   126  	file, cleanerFunc := createFile(t, 50000000)
   127  	defer cleanerFunc()
   128  	rootName := guid()
   129  	result, err := client.Add(rootName+"/b/c/d", file, false, false, nil)
   130  	assert.NotNil(t, result)
   131  	assert.Nil(t, err)
   132  
   133  	_, err = client.db.Query(func(db *gorm.DB) *gorm.DB {
   134  		return db.Model(models.Resource{}).Where("name = ?", result.Name).Update(models.Resource{Locked: true})
   135  	})
   136  
   137  	result, err = client.Add(rootName+"/b/c/e", file, false, true, nil)
   138  	assert.NotNil(t, result)
   139  	assert.Nil(t, err)
   140  
   141  	var resource models.Resource
   142  	_, err = client.db.Query(func(db *gorm.DB) *gorm.DB {
   143  		return db.Where("name = ?", result.Name).First(&resource)
   144  	})
   145  
   146  	err = client.Download(rootName+"/b/c/e", ".", nil)
   147  	assert.Nil(t, err)
   148  	assert.False(t, resource.Locked)
   149  }
   150  
   151  func TestCatalog_Download(t *testing.T) {
   152  	client := setupCatalogClient(t)
   153  	file, cleanerFunc := createFile(t, 50000000)
   154  	defer cleanerFunc()
   155  	result, err := client.Add("", file, false, false, nil)
   156  	assert.NotNil(t, result)
   157  	assert.Nil(t, err)
   158  
   159  	fileInfo, err := os.Stat(file)
   160  	assert.NotNil(t, fileInfo)
   161  	assert.Nil(t, err)
   162  
   163  	err = client.Download(fileInfo.Name(), ".", nil)
   164  	assert.Nil(t, err)
   165  }
   166  
   167  func TestCatalog_NotFound(t *testing.T) {
   168  	client := setupCatalogClient(t)
   169  
   170  	err := client.Download("non existing record", ".", nil)
   171  	assert.NotNil(t, err)
   172  }
   173  
   174  func TestCatalog_Ls(t *testing.T) {
   175  	client := setupCatalogClient(t)
   176  	dir, cleanerFunc := createDir(t, 10)
   177  	defer cleanerFunc()
   178  	result, err := client.Add("", dir, false, false, nil)
   179  	assert.NotNil(t, result)
   180  	assert.Nil(t, err)
   181  
   182  	links, err := client.Ls(dir)
   183  	assert.Nil(t, err)
   184  	assert.Len(t, links, 10)
   185  }
   186  
   187  func TestCatalog_LsWithoutPath(t *testing.T) {
   188  	client := setupCatalogClient(t)
   189  	dir, cleanerFunc := createDir(t, 10)
   190  	defer cleanerFunc()
   191  	result, err := client.Add("", dir, false, false, nil)
   192  	assert.NotNil(t, result)
   193  	assert.Nil(t, err)
   194  
   195  	links, err := client.Ls("")
   196  	assert.Nil(t, err)
   197  	assert.NotNil(t, links)
   198  }
   199  
   200  func TestCatalog_Link(t *testing.T) {
   201  	client := setupCatalogClient(t)
   202  	dir, cleanerFunc := createDir(t, 10)
   203  	defer cleanerFunc()
   204  	dirResult, err := client.Add("", dir, false, false, nil)
   205  	assert.NotNil(t, dirResult)
   206  	assert.Nil(t, err)
   207  
   208  	file, cleanerFunc := createFile(t, 50000000)
   209  	defer cleanerFunc()
   210  	fileResult, err := client.Add("", file, false, false, nil)
   211  	assert.NotNil(t, fileResult)
   212  	assert.Nil(t, err)
   213  
   214  	newDirResult, err := client.Link(dirResult.Name+"/linkedFile", fileResult.Hash, false, false)
   215  	assert.NotNil(t, newDirResult)
   216  	assert.Nil(t, err)
   217  
   218  	links, err := client.Ls(dirResult.Name)
   219  	assert.Nil(t, err)
   220  	assert.Len(t, links, 11)
   221  }
   222  
   223  func TestCatalog_LinkInRoot(t *testing.T) {
   224  	client := setupCatalogClient(t)
   225  	file, cleanerFunc := createFile(t, 50000000)
   226  	defer cleanerFunc()
   227  	fileHash, err := client.ipfs.Add(file, nil)
   228  	assert.NotNil(t, fileHash)
   229  	assert.Nil(t, err)
   230  
   231  	linkedFile, err := client.Link("rootLink"+guid(), fileHash.Hash, false, false)
   232  	assert.NotNil(t, linkedFile)
   233  	assert.Nil(t, err)
   234  
   235  	links, err := client.Ls("")
   236  	assert.Nil(t, err)
   237  	assert.Contains(t, links, &shell.LsLink{
   238  		Hash: linkedFile.Hash,
   239  		Name: linkedFile.Name,
   240  		Size: uint64(linkedFile.Size),
   241  		Type: shell.TFile,
   242  	})
   243  }
   244  
   245  func TestCatalog_Link2(t *testing.T) {
   246  	client := setupCatalogClient(t)
   247  
   248  	file, cleanerFunc := createFile(t, 50000000)
   249  	defer cleanerFunc()
   250  	fileResult, err := client.Add("", file, false, false, nil)
   251  	assert.NotNil(t, fileResult)
   252  	assert.Nil(t, err)
   253  
   254  	rootFolder := guid()
   255  	resource, err := client.Link(rootFolder+"/a/b/linkedFile", fileResult.Hash, false, false)
   256  	assert.NotNil(t, resource)
   257  	assert.Equal(t, rootFolder, resource.Name)
   258  	assert.Nil(t, err)
   259  
   260  	err = client.Download(resource.Name+"/a/b/linkedFile", "d", nil)
   261  	assert.Nil(t, err)
   262  }
   263  
   264  func TestCatalog_OverrideRoot(t *testing.T) {
   265  	client := setupCatalogClient(t)
   266  
   267  	file, cleanerFunc := createFile(t, 50000000)
   268  	defer cleanerFunc()
   269  	fileResult, err := client.Add("", file, false, false, nil)
   270  	assert.NotNil(t, fileResult)
   271  	assert.Nil(t, err)
   272  
   273  	fileResult2, err := client.Add("", file, true, false, nil)
   274  	assert.NotNil(t, fileResult2)
   275  	assert.Nil(t, err)
   276  
   277  	assert.Nil(t, err)
   278  }
   279  
   280  func TestCatalog_OverridePath(t *testing.T) {
   281  	client := setupCatalogClient(t)
   282  
   283  	file, cleanerFunc := createFile(t, 50000000)
   284  	defer cleanerFunc()
   285  	fileResult, err := client.Add("a/b", file, true, false, nil)
   286  	assert.NotNil(t, fileResult)
   287  	assert.Nil(t, err)
   288  
   289  	fileResult2, err := client.Add("a/b", file, true, false, nil)
   290  	assert.NotNil(t, fileResult2)
   291  	assert.Nil(t, err)
   292  
   293  	assert.Nil(t, err)
   294  }