Example #1
0
        private void DeleteBinaryPropertyTest(string fileContent, int sizeLimit)
        {
            using (new SystemAccount())
                using (new SizeLimitSwindler(this, sizeLimit))
                {
                    var testRoot = CreateTestRoot();

                    var file = new File(testRoot)
                    {
                        Name = "File1.file"
                    };
                    file.Binary.SetStream(RepositoryTools.GetStreamFromString(fileContent));
                    file.Save();
                    var fileId = file.Id;

                    file = Node.Load <File>(fileId);
                    // action
                    file.Binary = null;
                    file.Save();

                    // assert
                    var dbFiles = BlobStoragePlatform.LoadDbFiles(file.VersionId);
                    Assert.AreEqual(0, dbFiles.Length);
                }
        }
Example #2
0
        private DbFile UpdateByChunksTest(string initialContent, string updatedText, int sizeLimit, int chunkSize)
        {
            using (new SystemAccount())
                using (new SizeLimitSwindler(this, sizeLimit))
                {
                    var testRoot = CreateTestRoot();

                    var file = new File(testRoot)
                    {
                        Name = "File1.file"
                    };
                    file.Binary.SetStream(RepositoryTools.GetStreamFromString(initialContent));
                    file.Save();
                    var fileId = file.Id;

                    var chunks = SplitFile(updatedText, chunkSize, out var fullSize);

                    file = Node.Load <File>(fileId);
                    file.Save(SavingMode.StartMultistepSave);
                    var token = BinaryData.StartChunk(fileId, fullSize);

                    var offset = 0;
                    foreach (var chunk in chunks)
                    {
                        BinaryData.WriteChunk(fileId, token, fullSize, chunk, offset);
                        offset += chunkSize;
                    }

                    BinaryData.CommitChunk(fileId, token, fullSize);

                    file = Node.Load <File>(fileId);
                    file.FinalizeContent();


                    // assert
                    var dbFiles = BlobStoragePlatform.LoadDbFiles(file.VersionId);
                    Assert.AreEqual(1, dbFiles.Length);
                    var dbFile = dbFiles[0];
                    if (NeedExternal(BlobStoragePlatform.ExpectedBlobProviderDataType, updatedText, sizeLimit))
                    {
                        Assert.AreEqual(BlobStoragePlatform.ExpectedExternalBlobProviderType.FullName, dbFile.BlobProvider);
                        Assert.IsNotNull(dbFile.BlobProviderData);
                    }
                    else
                    {
                        Assert.IsNull(dbFile.BlobProvider);
                        Assert.IsNull(dbFile.BlobProviderData);
                    }
                    Assert.AreEqual(false, dbFile.IsDeleted);
                    Assert.AreEqual(false, dbFile.Staging);
                    Assert.AreEqual(0, dbFile.StagingVersionId);
                    Assert.AreEqual(0, dbFile.StagingPropertyTypeId);
                    Assert.AreEqual(fullSize, dbFile.Size);

                    return(dbFile);
                }
        }
Example #3
0
        private void DeleteTest(string fileContent, int sizeLimit)
        {
            using (new SystemAccount())
                using (new SizeLimitSwindler(this, sizeLimit))
                {
                    var propertyTypeId = PropertyType.GetByName("Binary").Id;
                    var external       = NeedExternal(BlobStoragePlatform.ExpectedBlobProviderDataType, fileContent, sizeLimit);

                    var testRoot = CreateTestRoot();

                    var file = new File(testRoot)
                    {
                        Name = "File1.file"
                    };
                    file.Binary.SetStream(RepositoryTools.GetStreamFromString(fileContent));
                    file.Save();
                    var fileId = file.Binary.FileId;
                    // memorize blob storage context for further check
                    var ctx = BlobStorage.GetBlobStorageContextAsync(file.Binary.FileId, false,
                                                                     file.VersionId, propertyTypeId, CancellationToken.None).GetAwaiter().GetResult();
                    BlobStoragePlatform.UpdateFileCreationDate(file.Binary.FileId, DateTime.UtcNow.AddDays(-1));

                    // Action #1
                    file.ForceDelete();

                    // Assert #1
                    var dbFile = BlobStoragePlatform.LoadDbFile(fileId);
                    Assert.IsNotNull(dbFile);
                    Assert.AreEqual(false, dbFile.IsDeleted);
                    Assert.IsFalse(IsDeleted(ctx, external));

                    // Action #2
                    BlobStorage.CleanupFilesSetFlagAsync(CancellationToken.None)
                    .GetAwaiter().GetResult();

                    // Assert #2
                    dbFile = BlobStoragePlatform.LoadDbFile(fileId);
                    Assert.IsNotNull(dbFile);
                    Assert.AreEqual(true, dbFile.IsDeleted);
                    Assert.IsFalse(IsDeleted(ctx, external));

                    // Action #3
                    var _ = BlobStorage.CleanupFilesAsync(CancellationToken.None)
                            .GetAwaiter().GetResult();

                    // Assert #3
                    dbFile = BlobStoragePlatform.LoadDbFile(fileId);
                    Assert.IsNull(dbFile);
                    Assert.IsTrue(IsDeleted(ctx, external));
                }
        }
Example #4
0
        private void BinaryCacheEntityTest(string fileContent, int sizeLimit)
        {
            using (new SystemAccount())
                using (new SizeLimitSwindler(this, sizeLimit))
                {
                    var testRoot = CreateTestRoot();

                    var file = new File(testRoot)
                    {
                        Name = "File1.file"
                    };
                    file.Binary.SetStream(RepositoryTools.GetStreamFromString(fileContent));
                    file.Save();
                    var versionId        = file.VersionId;
                    var binaryPropertyId = file.Binary.Id;
                    var fileId           = file.Binary.FileId;
                    var propertyTypeId   = PropertyType.GetByName("Binary").Id;

                    // action
                    var binaryCacheEntity = BlobStorage.LoadBinaryCacheEntityAsync(
                        file.VersionId, propertyTypeId, CancellationToken.None).GetAwaiter().GetResult();

                    // assert
                    Assert.AreEqual(binaryPropertyId, binaryCacheEntity.BinaryPropertyId);
                    Assert.AreEqual(fileId, binaryCacheEntity.FileId);
                    Assert.AreEqual(fileContent.Length + 3, binaryCacheEntity.Length);

                    Assert.AreEqual(versionId, binaryCacheEntity.Context.VersionId);
                    Assert.AreEqual(propertyTypeId, binaryCacheEntity.Context.PropertyTypeId);
                    Assert.AreEqual(fileId, binaryCacheEntity.Context.FileId);
                    Assert.AreEqual(fileContent.Length + 3, binaryCacheEntity.Context.Length);

                    if (NeedExternal(BlobStoragePlatform.ExpectedBlobProviderDataType, fileContent, sizeLimit))
                    {
                        Assert.IsTrue(binaryCacheEntity.Context.Provider.GetType() == BlobStoragePlatform.ExpectedExternalBlobProviderType);
                        Assert.IsTrue(binaryCacheEntity.Context.BlobProviderData.GetType() == BlobStoragePlatform.ExpectedBlobProviderDataType);
                        Assert.AreEqual(fileContent, GetStringFromBytes(BlobStoragePlatform.GetExternalData(binaryCacheEntity.Context)));
                    }
                    else
                    {
                        Assert.AreEqual(fileContent, GetStringFromBytes(binaryCacheEntity.RawData));
                    }
                }
        }
Example #5
0
        public void TestCase_DeletionPolicy_BackgroundImmediately()
        {
            IntegrationTest((sandbox) =>
            {
                var dp           = DataStore.DataProvider;
                var tdp          = Providers.Instance.GetProvider <ITestingDataProvider>();
                var countsBefore = GetDbObjectCountsAsync(null, dp, tdp).ConfigureAwait(false).GetAwaiter().GetResult();

                using (BlobStoragePlatform.SwindleWaitingBetweenCleanupFiles(10))
                {
                    using (new BlobDeletionPolicySwindler(BlobDeletionPolicy.BackgroundImmediately))
                        DeletionPolicy_TheTest();

                    var countsAfter = GetDbObjectCountsAsync(null, dp, tdp).ConfigureAwait(false).GetAwaiter().GetResult();
                    Assert.AreEqual(countsBefore.AllCountsExceptFiles, countsAfter.AllCountsExceptFiles);
                    Assert.AreNotEqual(countsBefore.Files, countsAfter.Files);
                    Thread.Sleep(500);
                    countsAfter = GetDbObjectCountsAsync(null, dp, tdp).ConfigureAwait(false).GetAwaiter().GetResult();
                    Assert.AreEqual(countsBefore.Files, countsAfter.Files);
                }
            });
        }
Example #6
0
        private void AssertRawData(DbFile dbFile, bool useChunk, string expectedText)
        {
            byte[][] data = BlobStoragePlatform.GetRawData(dbFile.FileId);

            if (dbFile.Size == 0L)
            {
                Assert.AreEqual(0, data.Length);
            }
            else if (useChunk && dbFile.BlobProvider == null)
            {
                Assert.AreEqual(1, data.Length);
            }
            else if (useChunk && dbFile.BlobProvider != null)
            {
                Assert.AreNotEqual(1, data.Length);
            }
            else
            {
                Assert.AreEqual(1, data.Length);
            }

            var length = data.Select(d => d.Length).Sum();
            var buffer = new byte[length];
            var offset = 0;

            foreach (var item in data)
            {
                Array.Copy(item, 0, buffer, offset, item.Length);
                offset += item.Length;
            }

            string actualText;

            using (var stream = new IO.MemoryStream(buffer))
                actualText = RepositoryTools.GetStreamString(stream);

            Assert.AreEqual(expectedText, actualText);
        }
Example #7
0
        private DbFile CreateFileTest(Node testRoot, string fileContent, int sizeLimit)
        {
            using (new SystemAccount())
                using (new SizeLimitSwindler(this, sizeLimit))
                {
                    var file = new File(testRoot)
                    {
                        Name = "File1.file"
                    };
                    file.Binary.SetStream(RepositoryTools.GetStreamFromString(fileContent));

                    // action
                    file.Save();

                    // assert
                    var dbFiles = BlobStoragePlatform.LoadDbFiles(file.VersionId);
                    Assert.AreEqual(1, dbFiles.Length);
                    var dbFile = dbFiles[0];
                    if (NeedExternal(BlobStoragePlatform.ExpectedExternalBlobProviderType, fileContent, sizeLimit))
                    {
                        Assert.AreEqual(BlobStoragePlatform.ExpectedExternalBlobProviderType.FullName, dbFile.BlobProvider);
                        Assert.IsNotNull(dbFile.BlobProviderData);
                    }
                    else
                    {
                        Assert.IsNull(dbFile.BlobProvider);
                        Assert.IsNull(dbFile.BlobProviderData);
                    }
                    Assert.AreEqual(false, dbFile.IsDeleted);
                    Assert.AreEqual(false, dbFile.Staging);
                    Assert.AreEqual(0, dbFile.StagingVersionId);
                    Assert.AreEqual(0, dbFile.StagingPropertyTypeId);
                    Assert.AreEqual(fileContent.Length + 3, dbFile.Size);

                    return(dbFile);
                }
        }
Example #8
0
 private bool IsDeleted(BlobStorageContext context, bool external)
 {
     return(external
         ? BlobStoragePlatform.GetExternalData(context) == null
         : BlobStoragePlatform.LoadDbFile(context.FileId) == null);
 }
Example #9
0
        private DbFile[] CopyFileRowTest(string initialContent, string updatedText, int sizeLimit)
        {
            using (new SystemAccount())
                using (new SizeLimitSwindler(this, sizeLimit))
                {
                    var testRoot = CreateTestRoot();
                    var target   = new SystemFolder(testRoot)
                    {
                        Name = "Target"
                    };
                    target.Save();

                    var file = new File(testRoot)
                    {
                        Name = "File1.file"
                    };
                    file.Binary.SetStream(RepositoryTools.GetStreamFromString(initialContent));
                    file.Save();

                    // action
                    file.CopyTo(target);

                    // assert
                    var copy = Node.Load <File>(RepositoryPath.Combine(target.Path, file.Name));
                    Assert.AreNotEqual(file.Id, copy.Id);
                    Assert.AreNotEqual(file.VersionId, copy.VersionId);
                    Assert.AreEqual(file.Binary.FileId, copy.Binary.FileId);

                    // action 2
                    copy.Binary.SetStream(RepositoryTools.GetStreamFromString(updatedText));
                    copy.Save();

                    // assert 2
                    Assert.AreNotEqual(file.Binary.FileId, copy.Binary.FileId);

                    var dbFiles = new DbFile[2];

                    var loadedDbFiles = BlobStoragePlatform.LoadDbFiles(file.VersionId);
                    Assert.AreEqual(1, loadedDbFiles.Length);
                    dbFiles[0] = loadedDbFiles[0];

                    loadedDbFiles = BlobStoragePlatform.LoadDbFiles(copy.VersionId);
                    Assert.AreEqual(1, loadedDbFiles.Length);
                    dbFiles[1] = loadedDbFiles[0];

                    if (NeedExternal(BlobStoragePlatform.ExpectedBlobProviderDataType, initialContent, sizeLimit))
                    {
                        Assert.AreEqual(BlobStoragePlatform.ExpectedExternalBlobProviderType.FullName, dbFiles[0].BlobProvider);
                        Assert.IsNotNull(dbFiles[0].BlobProviderData);
                    }
                    else
                    {
                        Assert.IsNull(dbFiles[0].BlobProvider);
                        Assert.IsNull(dbFiles[0].BlobProviderData);
                    }
                    Assert.AreEqual(false, dbFiles[0].IsDeleted);
                    Assert.AreEqual(false, dbFiles[0].Staging);
                    Assert.AreEqual(0, dbFiles[0].StagingVersionId);
                    Assert.AreEqual(0, dbFiles[0].StagingPropertyTypeId);
                    Assert.AreEqual(initialContent.Length + 3, dbFiles[0].Size);

                    if (NeedExternal(BlobStoragePlatform.ExpectedBlobProviderDataType, updatedText, sizeLimit))
                    {
                        Assert.AreEqual(BlobStoragePlatform.ExpectedExternalBlobProviderType.FullName, dbFiles[1].BlobProvider);
                        Assert.IsNotNull(dbFiles[1].BlobProviderData);
                    }
                    else
                    {
                        Assert.IsNull(dbFiles[1].BlobProvider);
                        Assert.IsNull(dbFiles[1].BlobProviderData);
                    }
                    Assert.AreEqual(false, dbFiles[1].IsDeleted);
                    Assert.AreEqual(false, dbFiles[1].Staging);
                    Assert.AreEqual(0, dbFiles[1].StagingVersionId);
                    Assert.AreEqual(0, dbFiles[1].StagingPropertyTypeId);
                    Assert.AreEqual(updatedText.Length + 3, dbFiles[1].Size);

                    return(dbFiles);
                }
        }
Example #10
0
        private DbFile UpdateFileTest(Node testRoot, string initialContent, string updatedContent, int sizeLimit)
        {
            using (new SystemAccount())
                using (new SizeLimitSwindler(this, sizeLimit))
                {
                    var file = new File(testRoot)
                    {
                        Name = "File1.file"
                    };
                    file.Binary.SetStream(RepositoryTools.GetStreamFromString(initialContent));
                    file.Save();
                    var fileId             = file.Id;
                    var blobProviderBefore = file.Binary.BlobProvider;
                    var fileRowIdBefore    = file.Binary.FileId;

                    file = Node.Load <File>(fileId);
                    file.Binary.SetStream(RepositoryTools.GetStreamFromString(updatedContent));

                    // action
                    file.Save();

                    // assert
                    var blobProviderAfter = file.Binary.BlobProvider;
                    var fileRowIdAfter    = file.Binary.FileId;
                    // if blob provider before and after is built-in, the existing file row is updated, else re-created.
                    if (blobProviderAfter == null && blobProviderBefore == null)
                    {
                        Assert.AreEqual(fileRowIdBefore, fileRowIdAfter);
                    }
                    else
                    {
                        Assert.AreNotEqual(fileRowIdBefore, fileRowIdAfter);
                    }

                    var dbFiles = BlobStoragePlatform.LoadDbFiles(file.VersionId);
                    Assert.AreEqual(1, dbFiles.Length);
                    var dbFile = dbFiles[0];
                    //Assert.AreNotEqual(initialBlobId, file.Binary.FileId);
                    if (NeedExternal(BlobStoragePlatform.ExpectedBlobProviderDataType, updatedContent, sizeLimit))
                    {
                        Assert.AreEqual(BlobStoragePlatform.ExpectedExternalBlobProviderType.FullName, dbFile.BlobProvider);
                        Assert.IsNotNull(dbFile.BlobProviderData);
                    }
                    else
                    {
                        Assert.IsNull(dbFile.BlobProvider);
                        Assert.IsNull(dbFile.BlobProviderData);
                    }
                    Assert.AreEqual(false, dbFile.IsDeleted);
                    Assert.AreEqual(false, dbFile.Staging);
                    Assert.AreEqual(0, dbFile.StagingVersionId);
                    Assert.AreEqual(0, dbFile.StagingPropertyTypeId);
                    if (updatedContent.Length == 0)
                    {
                        Assert.AreEqual(0, dbFile.Size);
                    }
                    else
                    {
                        Assert.AreEqual(updatedContent.Length + 3, dbFile.Size);
                    }

                    return(dbFile);
                }
        }