public void TestGasInjector_OutOfGasFails() { SmartContractCompilationResult compilationResult = SmartContractCompiler.CompileFile("SmartContracts/OutOfGasTest.cs"); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; var callData = new MethodCall("UseAllGas"); IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes); module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null); IContractInvocationResult result = contract.Invoke(callData); Assert.False(result.IsSuccess); Assert.Equal((Gas)0, this.gasMeter.GasAvailable); Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed); Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed); }
public void TestGasInjector_ContractMethodWithRecursion_GasInjectionSucceeds() { ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/Recursion.cs"); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; var callData = new MethodCall(nameof(Recursion.DoRecursion)); IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value; module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); assembly.Value.SetObserver(new Observer(this.gasMeter, new MemoryMeter(ReflectionVirtualMachine.MemoryUnitLimit))); IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null); IContractInvocationResult result = contract.Invoke(callData); Assert.True(result.IsSuccess); Assert.True(this.gasMeter.GasConsumed > 0); }
public Result Handle(StudentInviteCommand command) { command.Student.AddInvite(new Data.Entities.Invite(command.Student.Id, command.Token, false, command.Student.Email)); _context.Students.Update(command.Student); _context.SaveChanges(); return(Result.Ok()); }
public void TestGasInjector_OutOfGasFails() { ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/OutOfGasTest.cs"); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; var callData = new MethodCall("UseAllGas"); IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value; module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null); // Because our contract contains an infinite loop, we want to kill our test after // some amount of time without achieving a result. 3 seconds is an arbitrarily high enough timeout // for the method body to have finished execution while minimising the amount of time we spend // running tests // If you're running with the debugger on this will obviously be a source of failures IContractInvocationResult result = TimeoutHelper.RunCodeWithTimeout(5, () => contract.Invoke(callData)); Assert.False(result.IsSuccess); Assert.Equal((RuntimeObserver.Gas) 0, this.gasMeter.GasAvailable); Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed); Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed); }
public void SmartContracts_GasInjector_SingleParamConstructorGasInjectedSuccess() { ContractCompilationResult compilationResult = ContractCompiler.Compile(TestSingleConstructorSource); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value; module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null); IContractInvocationResult result = contract.InvokeConstructor(null); // TODO: Un-hard-code this. // Constructor: 15 // Property setter: 12 // Storage: 150 // "string newString = this.Owner + 1;": 36 Assert.Equal((Gas)213, this.gasMeter.GasConsumed); }
public Result Handle(AddUnitCommand command) { var unit = Unit.CreateTimeUnit(command.Name); _context.Units.Add(unit); _context.SaveChanges(); return(Result.Ok()); }
public Result Handle(TeacherRegistrationCommand command) { var registration = new TeacherRegistration(command.Token, false, command.Email); _context.Registrations.Add(registration); _context.SaveChanges(); return(Result.Ok(value: registration.Id)); }
public Result Handle(AddExerciseCommand command) { var exercise = new Exercise(command.Name, command.UnitId, command.Comment); _context.Exercises.Add(exercise); _context.SaveChanges(); return(Result.Ok()); }
public Result Handle(AddClassCommand command) { var schoolClass = new SchoolClass(command.Name); _context.Classes.Add(schoolClass); _context.SaveChanges(); return(Result.Ok()); }
public Result Handle(UserRegisteredCommand command) { var student = command.Student; student.MarkInviteUsed(); _context.Students.Update(command.Student); _context.SaveChanges(); return(Result.Ok()); }
public Result Handle(EditAppUserCommand command) { var user = command.User; command.User.HideResults = command.HideResults; _context.Persons.Update(user); _context.SaveChanges(); return(Result.Ok()); }
public void ContractAssemblyLoaderIsForwardCompatibleWithSmartContractAndStandardsUpdates() { // Create the byte code of a contract that contains new data types that are not (normally) supported by the current node. ContractCompilationResult result = ContractCompiler.Compile(this.testContract); byte[] bytes = result.Compilation; // Test that the node is able to load the futuristic contract. ContractAssemblyLoader loader = new ContractAssemblyLoader(); CSharpFunctionalExtensions.Result <IContractAssembly> result2 = loader.Load(new ContractByteCode(bytes)); IContractAssembly assembly = result2.Value; Assert.Equal("FruitVendor", assembly.Assembly.GetTypes().First().Name); }
private IContract GetContractAfterRewrite(string filename) { ContractCompilationResult compilationResult = ContractCompiler.CompileFile(filename); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value; module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); return(Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null)); }
public CSharpFunctionalExtensions.Result Handle(EditAddStudentCommand command) { var student = _context.Students.Find(command.Id); if (student == null) { student = new Data.Entities.Student(); _context.Students.Add(student); _context.SaveChanges(); } if (!string.IsNullOrWhiteSpace(command.StudentCardNumber)) { student.StudentCardNumber = command.StudentCardNumber; } if (command.Gender.HasValue) { student.Gender = command.Gender.Value; } if (!string.IsNullOrWhiteSpace(command.Email)) { student.Email = command.Email; } if (!string.IsNullOrWhiteSpace(command.Name)) { student.Name = command.Name; } if (command.SchoolClassId.HasValue) { student.SchoolClassId = command.SchoolClassId.Value; } if (command.ShouldResultsBeHidden.HasValue) { student.HiddenResults = command.ShouldResultsBeHidden.Value; } _context.Students.Update(student); _context.SaveChanges(); return(Result.Ok()); }
public void TestGasInjector_NestedType_GasInjectionSucceeds() { ContractCompilationResult compilationResult = ContractCompiler.Compile(@" using System; using Stratis.SmartContracts; public class Test : SmartContract { public Test(ISmartContractState state): base(state) { var other = new Other.NestedOther(); other.Loop(); } } public static class Other { public struct NestedOther { public void Loop() { while(true) {}} } } "); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value; module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); assembly.Value.SetObserver(new Observer(this.gasMeter, new MemoryMeter(ReflectionVirtualMachine.MemoryUnitLimit))); IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null); IContractInvocationResult result = contract.InvokeConstructor(null); Assert.False(result.IsSuccess); Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed); }
public void SmartContracts_GasInjector_MultipleParamConstructorGasInjectedSuccess() { ContractCompilationResult compilationResult = ContractCompiler.Compile(TestMultipleConstructorSource); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value; module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null); IContractInvocationResult result = contract.InvokeConstructor(new[] { "Test Owner" }); // Number here shouldn't be hardcoded - note this is really only to let us know of consensus failure Assert.Equal((RuntimeObserver.Gas) 328, this.gasMeter.GasConsumed); }
public void TestGasInjector() { SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(TestSource); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; var resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(AppContext.BaseDirectory); int aimGasAmount; using (ModuleDefinition moduleDefinition = ModuleDefinition.ReadModule( new MemoryStream(originalAssemblyBytes), new ReaderParameters { AssemblyResolver = resolver })) { TypeDefinition contractType = moduleDefinition.GetType(ContractName); MethodDefinition testMethod = contractType.Methods.FirstOrDefault(x => x.Name == MethodName); aimGasAmount = testMethod?.Body?.Instructions? .Count ?? 10000000; } var callData = new MethodCall("TestMethod", new object[] { 1 }); IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes); module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null); IContractInvocationResult result = contract.Invoke(callData); Assert.Equal((ulong)aimGasAmount, this.state.GasMeter.GasConsumed); }
public void TestGasInjector() { ContractCompilationResult compilationResult = ContractCompiler.Compile(TestSource); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; var resolver = new DefaultAssemblyResolver(); resolver.AddSearchDirectory(AppContext.BaseDirectory); using (ModuleDefinition moduleDefinition = ModuleDefinition.ReadModule( new MemoryStream(originalAssemblyBytes), new ReaderParameters { AssemblyResolver = resolver })) { TypeDefinition contractType = moduleDefinition.GetType(ContractName); MethodDefinition testMethod = contractType.Methods.FirstOrDefault(x => x.Name == MethodName); } var callData = new MethodCall("TestMethod", new object[] { 1 }); IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value; module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode()); assembly.Value.SetObserver(new Observer(this.gasMeter, new MemoryMeter(ReflectionVirtualMachine.MemoryUnitLimit))); IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null); IContractInvocationResult result = contract.Invoke(callData); // Number here shouldn't be hardcoded - note this is really only to let us know of consensus failure Assert.Equal(22uL, this.gasMeter.GasConsumed); }
public void Separate_Threads_Have_Different_Observer_Instances() { // Create a contract assembly. ContractCompilationResult compilationResult = ContractCompiler.Compile(TestSource); Assert.True(compilationResult.Success); byte[] originalAssemblyBytes = compilationResult.Compilation; IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value; module.Rewrite(this.rewriter); CSharpFunctionalExtensions.Result <IContractAssembly> assemblyLoadResult = this.assemblyLoader.Load(module.ToByteCode()); IContractAssembly assembly = assemblyLoadResult.Value; var threadCount = 10; var observers = new Observer[threadCount]; var countdown = new CountdownEvent(threadCount); var threads = new Thread[threadCount]; for (var i = 0; i < threadCount; i++) { // Create a fake observer with a counter. var observer = new Observer(new GasMeter((Gas)1000000), new MemoryMeter(1000000)); observers[i] = observer; // Set a different observer on each thread. // Invoke the same method on each thread. Thread newThread = new Thread(() => { assembly.SetObserver(observer); Assert.Same(observer, assembly.GetObserver()); var callData = new MethodCall("TestMethod", new object[] { 1 }); IContract contract = Contract.CreateUninitialized(assembly.GetType(module.ContractType.Name), this.state, null); IContractInvocationResult result = contract.Invoke(callData); countdown.Signal(); }); newThread.Name = i.ToString(); threads[i] = newThread; } // Start the threads on a separate loop to ensure all time is spent on processing. foreach (Thread thread in threads) { thread.Start(); } countdown.Wait(); foreach (Observer observer in observers) { Assert.Equal(observers[0].GasMeter.GasConsumed, observer.GasMeter.GasConsumed); Assert.Equal(observers[0].MemoryMeter.MemoryConsumed, observer.MemoryMeter.MemoryConsumed); } }