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 }