public void Resolve_Property_On_Nonexistent_Type() { var readResult = ContractDecompiler.GetModuleDefinition(this.contractCode); var contractModule = readResult.Value; var methodName = contractModule.GetPropertyGetterMethodName("DoesntExist", "Owner"); Assert.Null(methodName); }
public void Resolve_Property_Name_Success() { var readResult = ContractDecompiler.GetModuleDefinition(this.contractCode); var contractModule = readResult.Value; var methodName = contractModule.GetPropertyGetterMethodName("ModuleDefinitionTest", "Owner"); Assert.Equal("get_Owner", methodName); }
public void Resolve_Property_Doesnt_Exist() { var readResult = ContractDecompiler.GetModuleDefinition(this.contractCode); var contractModule = readResult.Value; var methodName = contractModule.GetPropertyGetterMethodName("Auction", "DoesntExist"); Assert.Null(methodName); }
private static IContractModuleDefinition BuildModuleDefinition(IConsole console, byte[] compilation) { console.WriteLine("Building ModuleDefinition..."); IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(compilation, new DotNetCoreAssemblyResolver()).Value; console.WriteLine("ModuleDefinition built successfully."); console.WriteLine(); return(moduleDefinition); }
public void SmartContract_Compiler_CanCompileMultipleFiles() { ContractCompilationResult result = ContractCompiler.CompileDirectory("SmartContracts", "MultipleFiles"); Assert.True(result.Success); IContractModuleDefinition decomp = ContractDecompiler.GetModuleDefinition(result.Compilation).Value; Assert.Contains(decomp.ModuleDefinition.Types, x => x.Name == "MultipleFiles1"); Assert.Contains(decomp.ModuleDefinition.Types, x => x.Name == "MultipleFiles2"); }
private static void BuildModuleDefinition(IConsole console, ValidationServiceResult validationServiceResult, out byte[] compilation, out IContractModuleDefinition moduleDefinition) { console.WriteLine("Building ModuleDefinition..."); compilation = validationServiceResult.CompilationResult.Compilation; moduleDefinition = ContractDecompiler.GetModuleDefinition(compilation, new DotNetCoreAssemblyResolver()).Value; console.WriteLine("ModuleDefinition built successfully."); console.WriteLine(); }
public void Validate_Determinism_Fails_MultiDimensional_Arrays() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = new int[50,50];").Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = ContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_Passes_ArrayConstruction_LessThan2() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = new int[]{10167};").Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = ContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
public IContractModuleDefinition CompileFileToModuleDef(FileInfo file) { ContractCompilationResult compilationResult = ContractCompiler.CompileFile(file.FullName); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; return(decomp); }
public IContractModuleDefinition CompileToModuleDef(string source) { ContractCompilationResult compilationResult = ContractCompiler.Compile(source, OptimizationLevel.Debug); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; return(decomp); }
public void Validate_Determinism_TryCatch() { ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/TryCatch.cs"); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_ByteArray_Conversion() { ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/ByteArrayConversion.cs"); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
public void Validate_Determinism_DynamicTypeAllowed() { string adjustedSource = TestString.Replace(ReplaceCodeString, "dynamic test = 56; test = \"aString\"; ").Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
public void ValidateAnonymousClassesDisallowed() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = new { Test = ""Stratis"" };").Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = ContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; 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, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_Nullable_Fails() { string adjustedSource = TestString.Replace(ReplaceCodeString, "int? test = null;").Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource, OptimizationLevel.Debug); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); 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 = ContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; 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, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_MethodParams_Private() { string adjustedSource = @"using System; using Stratis.SmartContracts; public class Test : SmartContract { public Test(ISmartContractState state) : base(state) {} private void PrivateStruct(TestStruct test) { } private void PrivateIntArray(int[] test) { } public void PublicIntArray(int[] test) { } public void PublicStruct(TestStruct test) { } internal void InternalStruct(TestStruct test) { } public struct TestStruct { public int TestInt; } }"; ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource, OptimizationLevel.Debug); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Equal(2, result.Errors.Count()); Assert.Contains("PublicIntArray", result.Errors.ElementAt(0).Message); Assert.Contains("PublicStruct", result.Errors.ElementAt(1).Message); }
public void Validate_Determinism_Floats() { string adjustedSource = TestString.Replace(ReplaceCodeString, "float test = (float) 3.5; test = test + 1;").Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Contains(result.Errors, e => e is FloatValidator.FloatValidationResult); }
public void Validate_Determinism_BitConverter() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = BitConverter.IsLittleEndian;").Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Single(result.Errors); Assert.IsAssignableFrom <WhitelistValidator.WhitelistValidationResult>(result.Errors.Single()); }
public void Validate_Determinism_Decimal() { string adjustedSource = TestString.Replace(ReplaceCodeString, "decimal test = (decimal) 3.5; test = test / 2;").Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; 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_TaskAwaiter() { string adjustedSource = TestString.Replace(ReplaceCodeString, "var r = new System.Runtime.CompilerServices.TaskAwaiter();") .Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource, OptimizationLevel.Debug); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void Validate_Determinism_ActivatorNotAllowed() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"Address ts = System.Activator.CreateInstance<Address>();").Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Single(result.Errors); Assert.IsAssignableFrom <WhitelistValidator.WhitelistValidationResult>(result.Errors.Single()); }
public void Validate_Determinism_ValidateActionDisallowed() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"var test = new Action(() => { var insideAction = DateTime.Now; }); test();").Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); }
public void SmartContractValidator_Should_Validate_Internal_Types() { var adjustedSource = @" using System; using Stratis.SmartContracts; [Deploy] public class Test : SmartContract { public Test(ISmartContractState state): base(state) { Create<Test2>(); } } public class Test2 : SmartContract { public Test2(ISmartContractState state): base(state) { PersistentState.SetString(""dt"", DateTime.Now.ToString()); } } "; ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decompilation = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; var moduleDefinition = decompilation.ModuleDefinition; var moduleType = moduleDefinition.GetType("<Module>"); moduleDefinition.Types.Remove(moduleType); var internalType = moduleDefinition.GetType("Test2"); internalType.Name = "<Module>"; SmartContractValidationResult result = new SmartContractValidator().Validate(moduleDefinition); Assert.False(result.IsValid); Assert.NotEmpty(result.Errors); Assert.True(result.Errors.All(e => e is WhitelistValidator.WhitelistValidationResult)); }
public void Validate_Determinism_ErrorMessages_Referenced_ThreeLevels() { string source = @" using Stratis.SmartContracts; public class MessageTest : SmartContract { public MessageTest(ISmartContractState smartContractState) : base(smartContractState) { } public void MessageTestValid() { MessageTestValid1(); } public void MessageTestValid1() { MessageTestValid2(); } public void MessageTestValid2() { MessageTestFloat1(); } public void MessageTestFloat1() { float test = (float) 3.5; } }"; ContractCompilationResult compilationResult = ContractCompiler.Compile(source, OptimizationLevel.Debug); Assert.True(compilationResult.Success); IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(compilationResult.Compilation).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.False(result.IsValid); Assert.Single(result.Errors); Assert.Equal(FloatValidator.FloatValidationType, result.Errors.First().ValidationType); }
public void Validate_Determinism_StringIteration() { string adjustedSource = TestString.Replace(ReplaceCodeString, @"int randomNumber = 0; foreach (byte c in ""Abcdefgh"") { randomNumber += c; }").Replace(ReplaceReferencesString, ""); ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
public void Validate_Determinism_Passes_Array_AllowedMembers() { string code = @" var test = new int[25]; var test2 = new int[25]; test[0] = 123; int ret = test[0]; int len = test.Length; Array.Resize(ref test, 50); Array.Copy(test, test2, len);"; string adjustedSource = TestString.Replace(ReplaceCodeString, code).Replace(ReplaceReferencesString, ""); byte[] assemblyBytes = ContractCompiler.Compile(adjustedSource).Compilation; IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; SmartContractValidationResult result = this.validator.Validate(moduleDefinition.ModuleDefinition); Assert.True(result.IsValid); }
public void Validate_Determinism_ErrorMessages_ThreeMethods_OneValid() { 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() { var test2 = 5; } public void MessageTestFloat3() { float test = (float) 3.5; } }"; ContractCompilationResult compilationResult = ContractCompiler.Compile(source, OptimizationLevel.Debug); Assert.True(compilationResult.Success); IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(compilationResult.Compilation).Value; 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); }