public async Task Generates_sequential_values <TValue>(bool async) { const int blockSize = 4; var sequence = new Model().Oracle().GetOrAddSequence("Foo"); sequence.IncrementBy = blockSize; var state = new OracleSequenceValueGeneratorState(sequence); var generator = new OracleSequenceHiLoValueGenerator <TValue>( new FakeRawSqlCommandBuilder(blockSize), new OracleUpdateSqlGenerator( new UpdateSqlGeneratorDependencies( new OracleSqlGenerationHelper( new RelationalSqlGenerationHelperDependencies())), new OracleTypeMapper( new RelationalTypeMapperDependencies())), state, CreateConnection()); for (var i = 1; i <= 27; i++) { var value = async ? await generator.NextAsync(null) : generator.Next(null); Assert.Equal(i, (int)Convert.ChangeType(value, typeof(int), CultureInfo.InvariantCulture)); } }
private async Task <IEnumerable <List <long> > > GenerateValuesInMultipleThreads(int threadCount, int valueCount) { const int blockSize = 10; var serviceProvider = OracleTestHelpers.Instance.CreateServiceProvider(); var sequence = new Model().Oracle().GetOrAddSequence("Foo"); sequence.IncrementBy = blockSize; var state = new OracleSequenceValueGeneratorState(sequence); var executor = new FakeRawSqlCommandBuilder(blockSize); var sqlGenerator = new OracleUpdateSqlGenerator( new UpdateSqlGeneratorDependencies( new OracleSqlGenerationHelper( new RelationalSqlGenerationHelperDependencies())), new OracleTypeMapper( new RelationalTypeMapperDependencies())); var tests = new Func <Task> [threadCount]; var generatedValues = new List <long> [threadCount]; for (var i = 0; i < tests.Length; i++) { var testNumber = i; generatedValues[testNumber] = new List <long>(); tests[testNumber] = async() => { for (var j = 0; j < valueCount; j++) { var connection = CreateConnection(serviceProvider); var generator = new OracleSequenceHiLoValueGenerator <long>(executor, sqlGenerator, state, connection); var value = j % 2 == 0 ? await generator.NextAsync(null) : generator.Next(null); generatedValues[testNumber].Add(value); } }; } var tasks = tests.Select(Task.Run).ToArray(); foreach (var t in tasks) { await t; } return(generatedValues); }