public void Validate_Determinism_Recursion() { string source = @" using Stratis.SmartContracts; public class RecursionTest : SmartContract { public RecursionTest(ISmartContractState smartContractState) : base(smartContractState) { } public void Bid() { Job(5); } public void Job(int index) { if (index > 0) Job(index - 1); } }"; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(source); Assert.True(compilationResult.Success); IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(compilationResult.Compilation); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
public void Validate_Determinism_Async() { string adjustedSource = @"using System; using Stratis.SmartContracts; using System.Threading.Tasks; public class Test : SmartContract { public Test(ISmartContractState state) : base(state) {} public async void Bid() { await Task.Run(job); } public async Task job() { int w = 9; } }"; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_ErrorMessages_Referenced_OneLevel() { string source = @" using Stratis.SmartContracts; public class MessageTest : SmartContract { public MessageTest(ISmartContractState smartContractState) : base(smartContractState) { } public void MessageTestValid() { MessageTestFloat1(); } public void MessageTestFloat1() { float test = (float) 3.5; test = test + 1; } }"; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(source); Assert.True(compilationResult.Success); SmartContractDecompilation decompilation = SmartContractDecompiler.GetModuleDefinition(compilationResult.Compilation); SmartContractValidationResult result = this.validator.Validate(decompilation); Assert.False(result.IsValid); Assert.Single(result.Errors); Assert.Equal("Float usage", result.Errors.First().ValidationType); }
public void Validate_Determinism_ErrorMessages_Simple_DateTime() { string source = @" using Stratis.SmartContracts; using System; public class MessageTest : SmartContract { public MessageTest(ISmartContractState smartContractState) : base(smartContractState) { } public void MessageTestDateTime() { var test = DateTime.Now; } }"; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(source); Assert.True(compilationResult.Success); SmartContractDecompilation decompilation = SmartContractDecompiler.GetModuleDefinition(compilationResult.Compilation); SmartContractValidationResult result = this.validator.Validate(decompilation); Assert.False(result.IsValid); Assert.Single(result.Errors); Assert.Equal(SmartContractDeterminismValidator.NonDeterministicMethodReference, result.Errors.First().ValidationType); }
public void SmartContract_ValidateFormat_TwoTypes() { var adjustedSource = @" using System; using Stratis.SmartContracts; public class Test : SmartContract { public Test(ISmartContractState state) : base(state) {} } public class Test2 { } "; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); var validator = new SmartContractFormatValidator(); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); var result = validator.Validate(decomp.ModuleDefinition); Assert.False(result.IsValid); Assert.Equal(2, result.Errors.Count()); }
public void Validate_Determinism_ErrorMessages_Simple_DateTime() { string source = @" using Stratis.SmartContracts; using System; public class MessageTest : SmartContract { public MessageTest(ISmartContractState smartContractState) : base(smartContractState) { } public void MessageTestDateTime() { var test = DateTime.Now; } }"; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(source); Assert.True(compilationResult.Success); IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(compilationResult.Compilation); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.True(result.Errors.All(e => e is WhitelistValidator.WhitelistValidationResult)); }
public void SmartContract_ValidateFormat_AssemblyReferences() { var adjustedSource = @" using System; using System.Linq; using Stratis.SmartContracts; public class Test : SmartContract { public Test(ISmartContractState state) : base(state) { IQueryable q = null; } } "; SmartContractCompilationResult compilationResult = Compile(adjustedSource, new [] { typeof(IQueryable).Assembly.Location }); Assert.True(compilationResult.Success); var validator = new SmartContractFormatValidator(); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); var result = validator.Validate(decomp.ModuleDefinition); Assert.False(result.IsValid); Assert.Single(result.Errors); }
public void Validate_Determinism_ErrorMessages_TwoMethods() { string source = @" using Stratis.SmartContracts; public class MessageTest : SmartContract { public MessageTest(ISmartContractState smartContractState) : base(smartContractState) { } public void MessageTestFloat1() { float test = (float) 3.5; } public void MessageTestFloat2() { float test = (float) 3.5; } }"; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(source); Assert.True(compilationResult.Success); IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(compilationResult.Compilation); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Equal(2, result.Errors.Count()); Assert.Equal("Float usage", result.Errors.First().ValidationType); Assert.Equal("Float usage", result.Errors.Skip(1).Take(1).First().ValidationType); }
public void SmartContract_ValidateFormat_One_CustomStruct() { var adjustedSource = @" using System; using Stratis.SmartContracts; public class StructTest : SmartContract { public struct Item { public int Number; public string Name; } public StructTest(ISmartContractState state) : base(state) { } } "; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); var validator = new NestedTypeValidator(); byte[] assemblyBytes = compilationResult.Compilation; SmartContractDecompilation decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); IEnumerable <ValidationResult> result = validator.Validate(decomp.ContractType); Assert.Empty(result); }
public void Validate_Determinism_DisallowedMethodParams() { string adjustedSource = @"using System; using Stratis.SmartContracts; public class Test : SmartContract { public Test(ISmartContractState state) : base(state) {} public void DateTime1(DateTime param) { } public void F(float param) { } }"; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Equal(2, result.Errors.Count()); Assert.True(result.Errors.All(e => e is MethodParamValidator.MethodParamValidationResult)); Assert.Contains(result.Errors, e => e.Message.Contains("System.DateTime")); Assert.Contains(result.Errors, e => e.Message.Contains("System.Single")); }
public void SmartContract_ValidateFormat_InitializedReadonlyField_Fails() { var adjustedSource = @" using System; using Stratis.SmartContracts; public class FieldTest : SmartContract { private readonly int field1 = 1234567; public FieldTest(ISmartContractState state) : base(state) { } } "; SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); var validator = new FieldDefinitionValidator(); byte[] assemblyBytes = compilationResult.Compilation; SmartContractDecompilation decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); IEnumerable <ValidationResult> result = validator.Validate(decomp.ContractType); Assert.NotEmpty(result); }
public void Validate_Determinism_Passes_ArrayConstruction_LessThan2() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = new int[]{10167};").Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = SmartContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
private static void BuildModuleDefinition(IConsole console, ValidationServiceResult validationServiceResult, out byte[] compilation, out SmartContractDecompilation decompilation) { console.WriteLine("Building ModuleDefinition..."); compilation = validationServiceResult.CompilationResult.Compilation; decompilation = SmartContractDecompiler.GetModuleDefinition(compilation, new DotNetCoreAssemblyResolver()); console.WriteLine("ModuleDefinition built successfully."); console.WriteLine(); }
public void SmartContract_Compiler_CanCompileMultipleFiles() { SmartContractCompilationResult result = SmartContractCompiler.CompileDirectory("SmartContracts", "MultipleFiles"); Assert.True(result.Success); SmartContractDecompilation decomp = SmartContractDecompiler.GetModuleDefinition(result.Compilation); Assert.Contains(decomp.ModuleDefinition.Types, x => x.Name == "MultipleFiles1"); Assert.Contains(decomp.ModuleDefinition.Types, x => x.Name == "MultipleFiles2"); }
public void Validate_Determinism_Fails_MultiDimensional_Arrays() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = new int[50,50];").Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = SmartContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public SmartContractDecompilation CompileToModuleDef(string source) { SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(source); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; SmartContractDecompilation decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); return(decomp); }
public SmartContractDecompilation CompileFileToModuleDef(FileInfo file) { SmartContractCompilationResult compilationResult = SmartContractCompiler.CompileFile(file.FullName); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; SmartContractDecompilation decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); return(decomp); }
public void Validate_ByteArray_Conversion() { SmartContractCompilationResult compilationResult = SmartContractCompiler.CompileFile("SmartContracts/ByteArrayConversion.cs"); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
public void Validate_Determinism_TryCatch() { SmartContractCompilationResult compilationResult = SmartContractCompiler.CompileFile("SmartContracts/TryCatch.cs"); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_AnonymousClassFloats() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = new { Prop1 = 6.8 };").Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = SmartContractCompiler.Compile(adjustedSource).Compilation; SmartContractDecompilation decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(decomp); Assert.False(result.IsValid); }
public void ValidateAnonymousClassesDisallowed() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = new { Test = ""Stratis"" };").Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = SmartContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_DynamicTypeAllowed() { string adjustedSource = TestString.Replace(ReplaceCodeString, "dynamic test = 56; test = \"aString\"; ").Replace(ReplaceReferencesString, ""); SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
public void Validate_Determinism_Decimal() { string adjustedSource = TestString.Replace(ReplaceCodeString, "decimal test = (decimal) 3.5; test = test / 2;").Replace(ReplaceReferencesString, ""); SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; SmartContractDecompilation decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(decomp); Assert.False(result.IsValid); }
public void Validate_Determinism_ActivatorNotAllowed() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"Address ts = System.Activator.CreateInstance<Address>();").Replace(ReplaceReferencesString, ""); SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; SmartContractDecompilation decomp = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(decomp); Assert.False(result.IsValid); }
public void Validate_Determinism_Fails_Array_Clone() { string code = @" var test = new int[25]; var ret = test.Clone();"; string adjustedSource = TestString.Replace(ReplaceCodeString, code).Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = SmartContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_KnownBadMethodCall() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var floor = System.Math.Floor(12D);").Replace(ReplaceReferencesString, ""); SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_GetHashCode() { string adjustedSource = TestString.Replace(ReplaceCodeString, "int hashCode = GetHashCode();").Replace(ReplaceReferencesString, ""); SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_Floats() { string adjustedSource = TestString.Replace(ReplaceCodeString, "float test = (float) 3.5; test = test + 1;").Replace(ReplaceReferencesString, ""); SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Contains(result.Errors, e => e is FloatValidator.FloatValidationResult); }
public void Validate_Determinism_Decimal() { string adjustedSource = TestString.Replace(ReplaceCodeString, "decimal test = (decimal) 3.5; test = test / 2;").Replace(ReplaceReferencesString, ""); SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.True(result.Errors.All(e => e is WhitelistValidator.WhitelistValidationResult)); Assert.True(result.Errors.All(e => e.Message.Contains("Decimal"))); }
public void Validate_Determinism_BitConverter() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = BitConverter.IsLittleEndian;").Replace(ReplaceReferencesString, ""); SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = SmartContractDecompiler.GetModuleDefinition(assemblyBytes); SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Single(result.Errors); Assert.IsAssignableFrom <WhitelistValidator.WhitelistValidationResult>(result.Errors.Single()); }