AdlsDotNetSDKUnitTest/FilePropertiesUnitTest.cs (255 lines of code) (raw):
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Microsoft.Azure.DataLake.Store.Acl;
using Microsoft.Azure.DataLake.Store.AclTools;
using Microsoft.Azure.DataLake.Store.FileProperties;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TestDataCreator;
namespace Microsoft.Azure.DataLake.Store.UnitTest
{
/// <summary>
/// Unit test to test recursive Acl change, disk usage dump and Acl dump
/// </summary>
[TestClass]
public class FilePropertiesUnitTest
{
/// <summary>
/// Adls Client
/// </summary>
private static AdlsClient _adlsClient;
private static string BasePath;
private static string RemotePath;
/// <summary>
/// Unittest path
/// </summary>
private static string UnitTestPath;
private static readonly string LocalPath = @"C:\Data1" + SdkUnitTest.TestId;
/// <summary>
/// Semaphore to serialize acl modify and remove
/// </summary>
private static readonly Semaphore SemModifyAcl = new Semaphore(1, 1);
/// <summary>
/// Semaphore to serialize acl modify and remove
/// </summary>
private static readonly Semaphore SemSetAcl = new Semaphore(1, 1);
private static int _oneLevelDirCount;
private static int _oneLevelFileCnt;
private static int _recurseLevel;
private static int _oneFileSize;
private static bool _modifyAclRun;
private static bool _setAclRun;
[ClassInitialize]
public static void SetupClient(TestContext context)
{
BasePath = (string)context.Properties["BasePath"];
RemotePath = "/" + BasePath+ "/Test2" + SdkUnitTest.TestId;
UnitTestPath = $"{RemotePath}/RecursiveAcl/A";
_adlsClient = SdkUnitTest.SetupSuperClient();
_adlsClient.DeleteRecursive(RemotePath);
_oneLevelDirCount = 3;
_oneLevelFileCnt = 2;
_recurseLevel = 3;
_oneFileSize = 100;
DataCreator.CreateDirRecursiveRemote(_adlsClient, UnitTestPath, _recurseLevel, _oneLevelDirCount, _oneLevelFileCnt, _oneLevelFileCnt, _oneFileSize, _oneFileSize);
}
private static void GetExpectedOutput(int oneLevelDirecCnt, int oneLevelFileCnt, int recurseLevel,
int oneFileSize, out int expectedFileCount, out int expectedDirCount, out int expectedFileSize)
{
expectedDirCount = 0;
int power = 1;
for (int i = 1; i <= recurseLevel; i++)
{
power *= oneLevelDirecCnt;
expectedDirCount += power;
}
// last level directory does have files
expectedFileCount = (expectedDirCount+1) * oneLevelFileCnt;
expectedFileSize = expectedFileCount * oneFileSize;
}
/// <summary>
/// Gets a sample Acl entries - For modify and remove
/// </summary>
/// <returns></returns>
internal static List<AclEntry> GetAclEntryForModifyAndRemove()
{
return new List<AclEntry>()
{
new AclEntry(AclType.user, SdkUnitTest.NonOwner1ObjectId, AclScope.Access, AclAction.ReadWrite),
new AclEntry(AclType.user, SdkUnitTest.NonOwner2ObjectId, AclScope.Access, AclAction.WriteOnly),
new AclEntry(AclType.user, SdkUnitTest.Group1Id, AclScope.Default, AclAction.WriteExecute)
};
}
/// <summary>
/// Gets a sample acl entries
/// </summary>
/// <returns></returns>
internal static List<AclEntry> GetAclEntryForSet()
{
return new List<AclEntry>()
{
new AclEntry(AclType.user, SdkUnitTest.NonOwner1ObjectId, AclScope.Access, AclAction.ReadOnly),
new AclEntry(AclType.user, SdkUnitTest.NonOwner1ObjectId, AclScope.Default, AclAction.ReadOnly),
new AclEntry(AclType.user, SdkUnitTest.NonOwner2ObjectId, AclScope.Access, AclAction.ExecuteOnly)
};
}
internal static List<AclEntry> GetAclEntryDefault()
{
return new List<AclEntry>()
{
new AclEntry(AclType.user, SdkUnitTest.NonOwner2ObjectId, AclScope.Default, AclAction.WriteOnly)
};
}
[TestMethod]
public void TestModifyOnlyDefaultAcl()
{
List<AclEntry> aclEntries1 = GetAclEntryDefault();
var aclStats = AclProcessor.RunAclProcessor(UnitTestPath + "/B0", _adlsClient, aclEntries1,
RequestedAclType.ModifyAcl, 25);
var aclVerifyStats =
AclProcessor.RunAclVerifier(UnitTestPath + "/B0", _adlsClient, aclEntries1, RequestedAclType.ModifyAcl, 25);
Assert.IsTrue(aclStats.FilesProcessed == aclVerifyStats.FilesProcessed);
Assert.IsTrue(aclStats.DirectoryProcessed == aclVerifyStats.DirectoryProcessed);
Assert.IsTrue(0 == aclVerifyStats.IncorrectFileCount);
Assert.IsTrue(0 == aclVerifyStats.IncorrectDirectoryCount);
}
/// <summary>
/// Tests Acl modify
/// </summary>
[TestMethod]
public void TestModifyAcl()
{
SemModifyAcl.WaitOne();
if (_modifyAclRun)
{
SemModifyAcl.Release();
return;
}
List<AclEntry> aclEntries1 = GetAclEntryForModifyAndRemove();
var aclStats = AclProcessor.RunAclProcessor(UnitTestPath + "/B0", _adlsClient, aclEntries1,
RequestedAclType.ModifyAcl, 25);
var aclVerifyStats =
AclProcessor.RunAclVerifier(UnitTestPath + "/B0", _adlsClient, aclEntries1, RequestedAclType.ModifyAcl, 25);
Assert.IsTrue(aclStats.FilesProcessed == aclVerifyStats.FilesProcessed);
Assert.IsTrue(aclStats.DirectoryProcessed == aclVerifyStats.DirectoryProcessed);
Assert.IsTrue(0 == aclVerifyStats.IncorrectFileCount);
Assert.IsTrue(0 == aclVerifyStats.IncorrectDirectoryCount);
_modifyAclRun = true;
SemModifyAcl.Release();
}
/// <summary>
/// Tests remove acl
/// </summary>
[TestMethod]
public void RemoveAcl()
{
TestModifyAcl();
List<AclEntry> aclEntries1 = GetAclEntryForModifyAndRemove();
var aclStats = AclProcessor.RunAclProcessor(UnitTestPath + "/B0", _adlsClient, aclEntries1,
RequestedAclType.RemoveAcl, 10);
var aclVerifyStats =
AclProcessor.RunAclVerifier(UnitTestPath + "/B0", _adlsClient, aclEntries1, RequestedAclType.RemoveAcl, 25);
Assert.IsTrue(aclStats.FilesProcessed == aclVerifyStats.FilesProcessed);
Assert.IsTrue(aclStats.DirectoryProcessed == aclVerifyStats.DirectoryProcessed);
Assert.IsTrue(0 == aclVerifyStats.IncorrectFileCount);
Assert.IsTrue(0 == aclVerifyStats.IncorrectDirectoryCount);
}
/// <summary>
/// Tests set acl
/// </summary>
[TestMethod]
public void TestSetAcl()
{
SemSetAcl.WaitOne();
if (_setAclRun)
{
SemSetAcl.Release();
return;
}
List<AclEntry> aclEntries2 = GetAclEntryForSet();
List<AclEntry> aclEntries3 = new List<AclEntry>(aclEntries2)
{
//Add the default permission ACLs
new AclEntry(AclType.user, "", AclScope.Access, AclAction.All),
new AclEntry(AclType.group, "", AclScope.Access, AclAction.All),
new AclEntry(AclType.other, "", AclScope.Access, AclAction.None)
};
var aclStats = AclProcessor.RunAclProcessor(UnitTestPath + "/B1", _adlsClient, aclEntries3,
RequestedAclType.SetAcl, 25);
var aclVerifyStats =
AclProcessor.RunAclVerifier(UnitTestPath + "/B1", _adlsClient, aclEntries2, RequestedAclType.SetAcl, 25);
Assert.IsTrue(aclStats.FilesProcessed == aclVerifyStats.FilesProcessed);
Assert.IsTrue(aclStats.DirectoryProcessed == aclVerifyStats.DirectoryProcessed);
Assert.IsTrue(0 == aclVerifyStats.IncorrectFileCount);
Assert.IsTrue(0 == aclVerifyStats.IncorrectDirectoryCount);
_setAclRun = true;
SemSetAcl.Release();
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void TestFilePropertiesForFileInputWithNoDisplayFiles()
{
PropertyManager.TestGetProperty(UnitTestPath + "/B1/B0File.txt", _adlsClient, true, true, LocalPath + @"\logFileError", true);
}
[TestMethod]
public void TestFilePropertiesForFileInput()
{
var node=PropertyManager.TestGetProperty(UnitTestPath + "/B1/B0File.txt", _adlsClient,true,true, LocalPath + @"\logFile0", true, -1, true);
Assert.IsTrue(node.TotChildDirec == 0);
Assert.IsTrue(node.TotChildFiles == 0);
Assert.IsTrue(node.DirectChildDirec == 0);
Assert.IsTrue(node.DirectChildFiles == 0);
}
/// <summary>
/// Test Acl dump and file properties
/// </summary>
[TestMethod]
public void TestSetAclVerification()
{
string path = UnitTestPath + "/B2";
List<AclEntry> aclEntries1 = GetAclEntryForModifyAndRemove();
GetExpectedOutput(_oneLevelDirCount, _oneLevelFileCnt, _recurseLevel - 1, _oneFileSize, out var expectedFileCount, out var expectedDirCount, out var expectedFileSize);
expectedDirCount += 1;
var status = AclProcessor.RunAclVerifier(path, _adlsClient, aclEntries1, RequestedAclType.ModifyAcl, 25);
Assert.IsTrue(status.FilesProcessed == expectedFileCount);
Assert.IsTrue(status.DirectoryProcessed == expectedDirCount);
Assert.IsTrue(status.IncorrectFileCount == expectedFileCount);
Assert.IsTrue(status.IncorrectDirectoryCount == expectedDirCount);
_adlsClient.ModifyAclEntries(path, aclEntries1);
status = AclProcessor.RunAclVerifier(path, _adlsClient, aclEntries1, RequestedAclType.ModifyAcl, 25);
Assert.IsTrue(status.FilesProcessed == expectedFileCount);
Assert.IsTrue(status.DirectoryProcessed == expectedDirCount);
Assert.IsTrue(status.IncorrectFileCount == expectedFileCount);
Assert.IsTrue(status.IncorrectDirectoryCount == expectedDirCount-1);
var aclStats = AclProcessor.RunAclProcessor(UnitTestPath + "/B2/C0", _adlsClient, aclEntries1, RequestedAclType.ModifyAcl, 25);
GetExpectedOutput(_oneLevelDirCount, _oneLevelFileCnt, _recurseLevel - 2, _oneFileSize, out var expectedFileCountSub, out var expectedDirCountSub, out var expectedFileSizeSub);
expectedDirCountSub += 1;
status = AclProcessor.RunAclVerifier(path, _adlsClient, aclEntries1, RequestedAclType.ModifyAcl, 25, LocalPath + @"\verificationfile");
Assert.IsTrue(status.FilesProcessed == expectedFileCount);
Assert.IsTrue(status.DirectoryProcessed == expectedDirCount);
Assert.IsTrue(status.IncorrectFileCount == expectedFileCount-expectedFileCountSub);
Assert.IsTrue(status.IncorrectDirectoryCount == expectedDirCount - 1 - expectedDirCountSub);
AclProcessor.RunAclProcessor(UnitTestPath + "/B2/C1", _adlsClient, aclEntries1, RequestedAclType.ModifyAcl, 25);
status = AclProcessor.RunAclVerifier(path, _adlsClient, aclEntries1, RequestedAclType.ModifyAcl, 25, LocalPath + @"\verificationfile1");
Assert.IsTrue(status.FilesProcessed == expectedFileCount);
Assert.IsTrue(status.DirectoryProcessed == expectedDirCount);
Assert.IsTrue(status.IncorrectFileCount == expectedFileCount - 2*expectedFileCountSub);
Assert.IsTrue(status.IncorrectDirectoryCount == expectedDirCount - 1 - 2*expectedDirCountSub);
}
/// <summary>
/// Test Acl dump and file properties
/// </summary>
[TestMethod]
public void TestFileProperties()
{
TestSetAcl();
var node = PropertyManager.TestGetProperty(UnitTestPath + "/B1", _adlsClient, true, false, LocalPath + @"\logFile", true, 25, true);
TestTreeNode(node, _recurseLevel - 1);
node = PropertyManager.TestGetProperty(UnitTestPath + "/B1", _adlsClient, false, true, LocalPath + @"\logFile1", true, 25, true);
Assert.IsTrue(node.AllChildSameAcl);
node = PropertyManager.TestGetProperty(UnitTestPath + "/B1", _adlsClient, true, true, LocalPath + @"\logFile2", true, 25);
TestTreeNode(node, _recurseLevel - 1);
node = PropertyManager.TestGetProperty(UnitTestPath + "/B1", _adlsClient, true, true, LocalPath + @"\logFile2", true, 25, true);
TestTreeNode(node, _recurseLevel - 1);
Assert.IsTrue(node.AllChildSameAcl);
var entry = new List<AclEntry>()
{
new AclEntry(AclType.user, SdkUnitTest.Group1Id, AclScope.Access, AclAction.WriteExecute)
};
_adlsClient.ModifyAclEntries(UnitTestPath + "/B1/C0/C0File.txt", entry);
node = PropertyManager.TestGetProperty(UnitTestPath + "/B1", _adlsClient, false, true, LocalPath + @"\logFile3", true, 25);
// This will still be true because we are only getting acl of directories and consistent acl wont take account of the file
Assert.IsTrue(node.AllChildSameAcl);
node = PropertyManager.TestGetProperty(UnitTestPath + "/B1", _adlsClient, false, true, LocalPath + @"\logFile3", true, 25, true);
Assert.IsFalse(node.AllChildSameAcl);
}
private static void TestTreeNode(PropertyTreeNode node, int recurseLevel)
{
GetExpectedOutput(_oneLevelDirCount, _oneLevelFileCnt, recurseLevel, _oneFileSize, out var expectedFileCount, out var expectedDirCount, out var expectedFileSize);
Assert.IsTrue(node.TotChildFiles == expectedFileCount);
Assert.IsTrue(node.TotChildDirec == expectedDirCount);
Assert.IsTrue(node.TotChildSize == expectedFileSize);
if (recurseLevel > 0)
{
Assert.IsTrue(node.DirectChildFiles == _oneLevelFileCnt);
Assert.IsTrue(node.DirectChildDirec == _oneLevelDirCount);
Assert.IsTrue(node.DirectChildSize == _oneLevelFileCnt * _oneFileSize);
}
foreach (var dirNode in node.ChildDirectoryNodes)
{
TestTreeNode(dirNode, recurseLevel - 1);
}
}
/// <summary>
/// Cleans up the test
/// </summary>
[ClassCleanup]
public static void CleanClient()
{
_adlsClient.DeleteRecursive(RemotePath);
if (Directory.Exists(LocalPath))
{
Directory.Delete(LocalPath, true);
}
}
}
}