Skip to content

Commit

Permalink
feat: Move functions from Casbin.Util to Casbin.Functions
Browse files Browse the repository at this point in the history
Signed-off-by: sagilio <sagilio@outlook.com>
  • Loading branch information
sagilio committed Jul 25, 2023
1 parent 04b5605 commit 285003b
Show file tree
Hide file tree
Showing 16 changed files with 179 additions and 158 deletions.
2 changes: 1 addition & 1 deletion Casbin.Benchmark/BuildInFunctionsBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Jobs;
using Casbin.Util;
using Casbin.Functions;

namespace Casbin.Benchmark
{
Expand Down
2 changes: 1 addition & 1 deletion Casbin.Benchmark/DefaultRoleManagerBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Jobs;
using Casbin.Functions;
using Casbin.Model;
using Casbin.Rbac;
using Casbin.Util;
using static Casbin.Benchmark.TestHelper;

namespace Casbin.Benchmark
Expand Down
Original file line number Diff line number Diff line change
@@ -1,35 +1,40 @@
using System;
using System.Collections.Generic;
using Casbin.Model;
using Casbin.UnitTests.Extensions;

namespace Casbin.UnitTests.ParallelTest
{
public class DefaultRandomEntropyPool<TRequest> : IEntropyPool<TRequest> where TRequest : IRequestValues
{
private readonly string _randomStringSource = "abcdefghijklmnopqrstuvwxyz0123456789";
private readonly int _defaultRandomStringLength = 3;
private readonly string _randomStringSource = "abcdefghijklmnopqrstuvwxyz0123456789";
private Func<List<string>, TRequest> _convertFunc;

/// <summary>
/// A dictionary to save the random element pools for each category.
/// </summary>
public Dictionary<string, List<string>> _elementPools;
private Func<List<string>, TRequest> _convertFunc;

public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc)
{
_convertFunc = list2RequestFunc;
_elementPools = new Dictionary<string, List<string>>();
}
public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc, Dictionary<string, List<string>> elementPools)

public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc,
Dictionary<string, List<string>> elementPools)
{
_convertFunc = list2RequestFunc;
_elementPools = elementPools;
}

/// <summary>
///
///
/// </summary>
/// <param name="categoryAndCount"> The first element is the category, the second is the count
/// of elements you want to put in the element pool.</param>
public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc, params KeyValuePair<string, int>[] categoryAndCount)
public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc,
params KeyValuePair<string, int>[] categoryAndCount)
{
_convertFunc = list2RequestFunc;
_elementPools = new Dictionary<string, List<string>>();
Expand All @@ -40,140 +45,178 @@ public DefaultRandomEntropyPool(Func<List<string>, TRequest> list2RequestFunc, p
{
values.Add(GetRandomString(_defaultRandomStringLength));
}

_elementPools.Add(categoryAndCount[i].Key, values);
}
}

public TRequest Get()
{
List<string> res = new List<string>();
foreach (var keyValue in _elementPools)
{
Random rd = new Random();
res.Add(keyValue.Value[rd.Next(0, keyValue.Value.Count)]);
}

return _convertFunc(res);
}

public void Add(TRequest request)
{
var enumerator = _elementPools.GetEnumerator();
for (int i = 0; i < request.Count; i++)
{
enumerator.MoveNext();
enumerator.Current.Value.Add(request[i]);
}
}

public DefaultRandomEntropyPool<TRequest> Add(string key, int count)
{
List<string> values = new List<string>();
while(count-- > 0)
while (count-- > 0)
{
values.Add(GetRandomString(_defaultRandomStringLength));
}

_elementPools.Add(key, values);
return this;
}

public DefaultRandomEntropyPool<TRequest> Add(string key, string value)
{
if(_elementPools.ContainsKey(key))
if (_elementPools.ContainsKey(key))
{
_elementPools[key].Add(value);
}
else
{
_elementPools.Add(key, new List<string>() { value });
}

return this;
}
public TRequest Get()
{
List<string> res = new List<string>();
foreach(var keyValue in _elementPools)
{
Random rd = new Random();
res.Add(keyValue.Value[rd.Next(0, keyValue.Value.Count)]);
}
return _convertFunc(res);
}
public void Add(TRequest request)
{
var enumerator = _elementPools.GetEnumerator();
for (int i = 0; i < request.Count; i++)
{
enumerator.MoveNext();
enumerator.Current.Value.Add(request[i]);
}
}

private string GetRandomString(int length)
{
string res = "";
while(length-- > 0)
while (length-- > 0)
{
Random rd = new Random();
res += _randomStringSource[rd.Next(0, _randomStringSource.Length)];
}

return res;
}
}

public static class DefaultRandomEntropyPool
{
public static DefaultRandomEntropyPool<RequestValues<string>> Create(params KeyValuePair<string, int>[] categoryAndCount)
public static DefaultRandomEntropyPool<RequestValues<string>> Create(
params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string>>(x => Request.CreateValues(x[0]), categoryAndCount);
return new DefaultRandomEntropyPool<RequestValues<string>>(x => Request.CreateValues(x[0]),
categoryAndCount);
}
public static DefaultRandomEntropyPool<RequestValues<string, string>> Create2(params KeyValuePair<string, int>[] categoryAndCount)

public static DefaultRandomEntropyPool<RequestValues<string, string>> Create2(
params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string>>(x => Request.CreateValues(x[0], x[1]), categoryAndCount);
return new DefaultRandomEntropyPool<RequestValues<string, string>>(x => Request.CreateValues(x[0], x[1]),
categoryAndCount);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string>> Create3(params KeyValuePair<string, int>[] categoryAndCount)

public static DefaultRandomEntropyPool<RequestValues<string, string, string>> Create3(
params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2]), categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string>>

public static DefaultRandomEntropyPool<RequestValues<string, string, string, string>>
Create4(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3]), categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string>>

public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string>>
Create5(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4]), categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string>>

public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string>>
Create6(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5]), categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string>>

public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string>>
Create7(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6]), categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string>>

public static DefaultRandomEntropyPool<
RequestValues<string, string, string, string, string, string, string, string>>
Create8(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string>>(
return new DefaultRandomEntropyPool<
RequestValues<string, string, string, string, string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]), categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string, string>>

public static DefaultRandomEntropyPool<
RequestValues<string, string, string, string, string, string, string, string, string>>
Create9(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string, string>>(
return new DefaultRandomEntropyPool<
RequestValues<string, string, string, string, string, string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8]), categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string, string, string>>

public static DefaultRandomEntropyPool<
RequestValues<string, string, string, string, string, string, string, string, string, string>>
Create10(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string, string, string>>(
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string,
string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9]), categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string, string, string, string>>

public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string,
string, string, string, string>>
Create11(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10]), categoryAndCount
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string,
string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10]),
categoryAndCount
);
}
public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string, string, string, string, string>>

public static DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string,
string, string, string, string, string>>
Create12(params KeyValuePair<string, int>[] categoryAndCount)
{
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string, string, string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10], x[11]), categoryAndCount
return new DefaultRandomEntropyPool<RequestValues<string, string, string, string, string, string, string,
string, string, string, string, string>>(
x => Request.CreateValues(x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10], x[11]),
categoryAndCount
);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,32 +1,40 @@
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Casbin.Model;
using Casbin.UnitTests.Extensions;

namespace Casbin.UnitTests.ParallelTest
{
public class DefaultGetAccessTransaction<TRequest> : ITransaction<TRequest> where TRequest : IRequestValues
{
private List<TRequest> _requests = new List<TRequest>();
public bool ExpectedResult { get; private set; } = false;
public bool ActualResult { get; private set; } = true;
public bool HasCompleted { get; private set; } = false;

public DefaultGetAccessTransaction(TRequest request)
{
_requests.Add(request);
}

public bool ExpectedResult { get; private set; } = false;
public bool ActualResult { get; private set; } = true;
public bool HasCompleted { get; private set; } = false;

public async Task<bool> ExecuteAsync(IConsumer<TRequest> consumer)
{
ActualResult = await consumer.GetAccessAsync(Request.First());
HasCompleted = true;
return true;
}

public void SetTruth(IEnforcer enforcer)
{
ExpectedResult = enforcer.Enforce(enforcer.CreateContext(), Request.First());
}
public IEnumerable<TRequest> Request { get { return _requests; } }

public IEnumerable<TRequest> Request
{
get { return _requests; }
}

public TransactionType TransactionType { get; } = TransactionType.GetAccess;
}
}
}
2 changes: 1 addition & 1 deletion Casbin.UnitTests/RbacTests/RoleManagerTest.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using Casbin.Functions;
using Casbin.Rbac;
using Casbin.Util;
using Xunit;
using static Casbin.UnitTests.Util.TestUtil;

Expand Down
Loading

0 comments on commit 285003b

Please sign in to comment.