Skip to content

Commit

Permalink
Add Orleans.Transaction.Testkit
Browse files Browse the repository at this point in the history
  • Loading branch information
xiazen committed Oct 17, 2018
1 parent b0fa540 commit 55c13b9
Show file tree
Hide file tree
Showing 17 changed files with 441 additions and 5 deletions.
35 changes: 34 additions & 1 deletion Orleans.sln
Expand Up @@ -218,6 +218,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CodeGenerator.Tests", "test
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Orleans.CodeGenerator.MSBuild.Tasks", "src\Orleans.CodeGenerator.MSBuild.Tasks\Orleans.CodeGenerator.MSBuild.Tasks.csproj", "{5EAE884A-52BE-4AA6-9FCB-AD1C45A9BB7C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Transactions", "Transactions", "{3189037B-208D-40A1-A561-169D77D9BB5A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orleans.Transactions.TestkitBase", "src\Orleans.Transactions.TestkitBase\Orleans.Transactions.TestkitBase.csproj", "{531A89F5-DD05-4D14-A330-6548359A231A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orleans.Transactions.Testkit.Xunit", "src\Orleans.Transactions.Testkit.Xunit\Orleans.Transactions.Testkit.Xunit.csproj", "{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -1332,6 +1338,30 @@ Global
{5EAE884A-52BE-4AA6-9FCB-AD1C45A9BB7C}.Release|x64.Build.0 = Release|Any CPU
{5EAE884A-52BE-4AA6-9FCB-AD1C45A9BB7C}.Release|x86.ActiveCfg = Release|Any CPU
{5EAE884A-52BE-4AA6-9FCB-AD1C45A9BB7C}.Release|x86.Build.0 = Release|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Debug|x64.ActiveCfg = Debug|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Debug|x64.Build.0 = Debug|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Debug|x86.ActiveCfg = Debug|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Debug|x86.Build.0 = Debug|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Release|Any CPU.Build.0 = Release|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Release|x64.ActiveCfg = Release|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Release|x64.Build.0 = Release|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Release|x86.ActiveCfg = Release|Any CPU
{531A89F5-DD05-4D14-A330-6548359A231A}.Release|x86.Build.0 = Release|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Debug|x64.ActiveCfg = Debug|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Debug|x64.Build.0 = Debug|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Debug|x86.ActiveCfg = Debug|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Debug|x86.Build.0 = Debug|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Release|Any CPU.Build.0 = Release|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Release|x64.ActiveCfg = Release|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Release|x64.Build.0 = Release|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Release|x86.ActiveCfg = Release|Any CPU
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -1398,7 +1428,7 @@ Global
{0CCA4C5C-1D31-4AA9-A7AF-90DD63C16F5B} = {DA143BBE-5D97-4792-8E36-44A3FA727C74}
{F7D70028-7E3B-48E3-92B9-DB889AE5ABD1} = {DA143BBE-5D97-4792-8E36-44A3FA727C74}
{9B07237D-651C-497D-9E8D-EADC8FAF26FF} = {DA143BBE-5D97-4792-8E36-44A3FA727C74}
{072B1B88-FE98-4354-86FA-AB6EF80EB9C4} = {4CD3AA9E-D937-48CA-BB6C-158E12257D23}
{072B1B88-FE98-4354-86FA-AB6EF80EB9C4} = {3189037B-208D-40A1-A561-169D77D9BB5A}
{CFD22413-CB67-40D6-B389-F038C8C38365} = {E4550469-BCFB-4F3E-B778-3769DE18F45A}
{BE7FB595-FA25-4D88-8504-E9D4F9D8183D} = {4C5D66BF-EE1C-4DD8-8551-D1B7F3768A34}
{651C7B8E-6EEB-4A6B-84A3-B5D7E4554B99} = {E4550469-BCFB-4F3E-B778-3769DE18F45A}
Expand Down Expand Up @@ -1442,6 +1472,9 @@ Global
{D9F12BF9-55AD-4BA3-B850-9A410C287733} = {A6573187-FD0D-4DF7-91D1-03E07E470C0A}
{C831C17D-EB49-4237-B86F-638C9A8E9708} = {D9F12BF9-55AD-4BA3-B850-9A410C287733}
{5EAE884A-52BE-4AA6-9FCB-AD1C45A9BB7C} = {4CD3AA9E-D937-48CA-BB6C-158E12257D23}
{3189037B-208D-40A1-A561-169D77D9BB5A} = {4CD3AA9E-D937-48CA-BB6C-158E12257D23}
{531A89F5-DD05-4D14-A330-6548359A231A} = {3189037B-208D-40A1-A561-169D77D9BB5A}
{B8ABE746-C76F-4E0E-86A5-744E85A55CE8} = {3189037B-208D-40A1-A561-169D77D9BB5A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7BFB3429-B5BB-4DB1-95B4-67D77A864952}
Expand Down
Expand Up @@ -14,18 +14,16 @@ public class AzureTableTransactionalStateStorage<TState> : ITransactionalStateSt
{
private readonly CloudTable table;
private readonly string partition;
private readonly string stateName;
private readonly JsonSerializerSettings jsonSettings;
private readonly ILogger logger;

private KeyEntity key;
private List<KeyValuePair<long, StateEntity>> states;

public AzureTableTransactionalStateStorage(CloudTable table, string partition, string stateName, JsonSerializerSettings JsonSettings, ILogger<AzureTableTransactionalStateStorage<TState>> logger)
public AzureTableTransactionalStateStorage(CloudTable table, string partition, JsonSerializerSettings JsonSettings, ILogger<AzureTableTransactionalStateStorage<TState>> logger)
{
this.table = table;
this.partition = partition;
this.stateName = stateName;
this.jsonSettings = JsonSettings;
this.logger = logger;
}
Expand Down
2 changes: 2 additions & 0 deletions src/Azure/Shared/Storage/AzureStorageUtils.cs
Expand Up @@ -24,6 +24,8 @@ namespace Orleans.Reminders.AzureStorage
namespace Orleans.Streaming.AzureStorage
#elif ORLEANS_EVENTHUBS
namespace Orleans.Streaming.EventHubs
#elif AZURETRANSACTION_TESTS
namespace Orleans.Transactions.Azure.Tests
#elif TESTER_AZUREUTILS
namespace Orleans.Tests.AzureUtils
#elif ORLEANS_TRANSACTIONS
Expand Down
2 changes: 2 additions & 0 deletions src/Azure/Shared/Storage/AzureTableDataManager.cs
Expand Up @@ -25,6 +25,8 @@ namespace Orleans.Streaming.AzureStorage
namespace Orleans.Streaming.EventHubs
#elif TESTER_AZUREUTILS
namespace Orleans.Tests.AzureUtils
#elif AZURETRANSACTION_TESTS
namespace Orleans.Transactions.Azure.Tests
#elif ORLEANS_TRANSACTIONS
namespace Orleans.Transactions.AzureStorage
#else
Expand Down
2 changes: 2 additions & 0 deletions src/Azure/Shared/Storage/AzureTableDefaultPolicies.cs
Expand Up @@ -17,6 +17,8 @@ namespace Orleans.Reminders.AzureStorage
namespace Orleans.Streaming.AzureStorage
#elif ORLEANS_EVENTHUBS
namespace Orleans.Streaming.EventHubs
#elif AZURETRANSACTION_TESTS
namespace Orleans.Transactions.Azure.Tests
#elif TESTER_AZUREUTILS
namespace Orleans.Tests.AzureUtils
#elif ORLEANS_HOSTING_CLOUDSERVICES // Temporary until azure silo/client is refactored
Expand Down
2 changes: 2 additions & 0 deletions src/Azure/Shared/Utilities/ErrorCode.cs
Expand Up @@ -14,6 +14,8 @@ namespace Orleans.Reminders.AzureStorage.Utilities
namespace Orleans.Streaming.AzureStorage.Utilities
#elif ORLEANS_EVENTHUBS
namespace Orleans.Streaming.EventHubs.Utilities
#elif AZURETRANSACTION_TESTS
namespace Orleans.Transactions.Azure.Utilities
#elif TESTER_AZUREUTILS
namespace Orleans.Tests.AzureUtils.Utilities
#elif ORLEANS_TRANSACTIONS
Expand Down
2 changes: 1 addition & 1 deletion src/Orleans.Core/Properties/AssemblyInfo.cs
Expand Up @@ -31,7 +31,7 @@
[assembly: InternalsVisibleTo("NonSilo.Tests")]
[assembly: InternalsVisibleTo("OrleansBenchmarks")]
[assembly: InternalsVisibleTo("Tester")]
[assembly: InternalsVisibleTo("Tester.AzureUtils")]
[assembly: InternalsVisibleTo("Orleans.Transactions.Azure.Tests")]
[assembly: InternalsVisibleTo("Tester.AdoNet")]
[assembly: InternalsVisibleTo("Tester.ZooKeeperUtils")]
[assembly: InternalsVisibleTo("TesterInternal")]
Expand Down
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Orleans.Transactions.TestkitBase\Orleans.Transactions.TestkitBase.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="xunit" Version="$(xUnitVersion)" />
<PackageReference Include="Xunit.SkippableFact" Version="$(XunitSkippableFactVersion)" />
<DotNetCliToolReference Include="dotnet-xunit" Version="$(xUnitVersion)" />
</ItemGroup>

</Project>
@@ -0,0 +1,24 @@
using System;
using System.Threading.Tasks;
using Orleans.Transaction.Testkit;
using Orleans.Transactions.Abstractions;
using Xunit;

namespace Orleans.Transactions.Testkit.Xunit
{
public abstract class TransactionalStateStorageTestRunnerXunit<TState> : TransactionalStateStorageTestRunner<TState>
where TState: class, new()
{
public TransactionalStateStorageTestRunnerXunit(Func<Task<ITransactionalStateStorage<TState>>> stateStorageFactory,
Func<TState> stateFactory, IGrainFactory grainFactory)
: base(stateStorageFactory, stateFactory, grainFactory)
{
}

[Fact]
public override Task FirstTime_Load_ShouldReturnEmptyLoadResponse()
{
return base.FirstTime_Load_ShouldReturnEmptyLoadResponse();
}
}
}
@@ -0,0 +1,36 @@
using System.Threading.Tasks;

namespace Orleans.Transactions.Testkit
{
public interface ITransactionTestGrain : IGrainWithGuidKey
{

/// <summary>
/// apply set operation to every transaction state
/// </summary>
/// <param name="newValue"></param>
/// <returns></returns>
[Transaction(TransactionOption.CreateOrJoin)]
Task Set(int newValue);

/// <summary>
/// apply add operation to every transaction state
/// </summary>
/// <param name="numberToAdd"></param>
/// <returns></returns>
[Transaction(TransactionOption.CreateOrJoin)]
Task<int[]> Add(int numberToAdd);

/// <summary>
/// apply get operation to every transaction state
/// </summary>
/// <returns></returns>
[Transaction(TransactionOption.CreateOrJoin)]
Task<int[]> Get();

[Transaction(TransactionOption.CreateOrJoin)]
Task AddAndThrow(int numberToAdd);

Task Deactivate();
}
}
@@ -0,0 +1,151 @@
using Microsoft.Extensions.Logging;
using Orleans.Transactions.Abstractions;
using System;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading.Tasks;

namespace Orleans.Transactions.Testkit
{
[Serializable]
public class GrainData
{
public int Value { get; set; }
}

public class MaxStateTransactionalGrain : MultiStateTransactionalGrainBaseClass
{
public MaxStateTransactionalGrain(ITransactionalStateFactory stateFactory,
ILoggerFactory loggerFactory)
: base(Enumerable.Range(0, TransactionTestConstants.MaxCoordinatedTransactions)
.Select(i => stateFactory.Create<GrainData>(new TransactionalStateAttribute($"data{i}", TransactionTestConstants.TransactionStore)))
.ToArray(),
loggerFactory)
{
}
}

public class DoubleStateTransactionalGrain : MultiStateTransactionalGrainBaseClass
{
public DoubleStateTransactionalGrain(
[TransactionalState("data1", TransactionTestConstants.TransactionStore)]
ITransactionalState<GrainData> data1,
[TransactionalState("data2", TransactionTestConstants.TransactionStore)]
ITransactionalState<GrainData> data2,
ILoggerFactory loggerFactory)
: base(new ITransactionalState<GrainData>[2] { data1, data2 }, loggerFactory)
{
}
}

public class SingleStateTransactionalGrain : MultiStateTransactionalGrainBaseClass
{
public SingleStateTransactionalGrain(
[TransactionalState("data", TransactionTestConstants.TransactionStore)]
ITransactionalState<GrainData> data,
ILoggerFactory loggerFactory)
: base(new ITransactionalState<GrainData>[1] { data }, loggerFactory)
{
}
}

public class NoStateTransactionalGrain : MultiStateTransactionalGrainBaseClass
{
public NoStateTransactionalGrain(
ILoggerFactory loggerFactory)
: base(Array.Empty<ITransactionalState<GrainData>>(), loggerFactory)
{
}
}

public class MultiStateTransactionalGrainBaseClass : Grain, ITransactionTestGrain
{
protected ITransactionalState<GrainData>[] dataArray;
private readonly ILoggerFactory loggerFactory;
protected ILogger logger;

public MultiStateTransactionalGrainBaseClass(
ITransactionalState<GrainData>[] dataArray,
ILoggerFactory loggerFactory)
{
this.dataArray = dataArray;
this.loggerFactory = loggerFactory;
}

public override Task OnActivateAsync()
{
this.logger = this.loggerFactory.CreateLogger(this.GetGrainIdentity().ToString());
return base.OnActivateAsync();
}

public async Task Set(int newValue)
{
foreach(var data in this.dataArray)
{
await data.PerformUpdate(state =>
{
this.logger.LogInformation($"Setting from {state.Value} to {newValue}.");
state.Value = newValue;
this.logger.LogInformation($"Set to {state.Value}.");
});
}
}

public async Task<int[]> Add(int numberToAdd)
{
var result = new int[dataArray.Length];
for(int i = 0; i < dataArray.Length; i++)
{
result[i] = await dataArray[i].PerformUpdate(state =>
{
this.logger.LogInformation($"Adding {numberToAdd} to {state.Value}.");
state.Value += numberToAdd;
this.logger.LogInformation($"Value after Adding {numberToAdd} is {state.Value}.");
return state.Value;
});
}
return result;
}

public async Task<int[]> Get()
{
var result = new int[dataArray.Length];
for (int i = 0; i < dataArray.Length; i++)
{
result[i] = await dataArray[i].PerformRead(state =>
{
this.logger.LogInformation($"Get {state.Value}.");
return state.Value;
});
}
return result;
}

public async Task AddAndThrow(int numberToAdd)
{
await Add(numberToAdd);
throw new AddAndThrowException($"{GetType().Name} test exception");
}

public Task Deactivate()
{
DeactivateOnIdle();
return Task.CompletedTask;
}
}

[Serializable]
public class AddAndThrowException : Exception
{
public AddAndThrowException() : base("Unexpected error.") { }

public AddAndThrowException(string message) : base(message) { }

public AddAndThrowException(string message, Exception innerException) : base(message, innerException) { }

protected AddAndThrowException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
}
@@ -0,0 +1,26 @@

using Microsoft.Extensions.Logging;
using Orleans.Hosting;

namespace Orleans.Transactions.Testkit
{
public static class TransactionTestConstants
{
/// <summary>
/// Max number of grains to include in a transaction for test purposes. Not a hard limit of the transaction system.
/// </summary>
public const int MaxCoordinatedTransactions = 8;

// storage providers
public const string TransactionStore = "TransactionStore";

// committer service
public const string RemoteCommitService = "RemoteCommitService";

// grain implementations
public const string NoStateTransactionalGrain = "NoStateTransactionalGrain";
public const string SingleStateTransactionalGrain = "SingleStateTransactionalGrain";
public const string DoubleStateTransactionalGrain = "DoubleStateTransactionalGrain";
public const string MaxStateTransactionalGrain = "MaxStateTransactionalGrain";
}
}

0 comments on commit 55c13b9

Please sign in to comment.