public void SmartContract_ValidateFormat_NewShortArray_Succeeds() { var adjustedSource = @" using System; using Stratis.SmartContracts; public class Test : SmartContract { public Test(ISmartContractState state) : base(state) {} public void CreateNewStruct() { var item = new [] { 1 }; } } "; ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); var validator = new SmartContractFormatValidator(); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; var result = validator.Validate(decomp.ModuleDefinition); Assert.True(result.IsValid); }
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) { } } "; ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); var validator = new SmartContractFormatValidator(); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; var result = validator.Validate(decomp.ModuleDefinition); Assert.True(result.IsValid); }
public void SmartContract_ValidateFormat_NewObj_Fails() { var adjustedSource = @" using System; using Stratis.SmartContracts; public class Test : SmartContract { public Test(ISmartContractState state) : base(state) {} public void CreateNewObject() { var obj = new object(); } } "; ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); var validator = new SmartContractFormatValidator(); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; var result = validator.Validate(decomp.ModuleDefinition); Assert.False(result.IsValid); Assert.Single(result.Errors); Assert.IsType <NewObjValidator.NewObjValidationResult>(result.Errors.First()); }
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; } } "; ContractCompilationResult compilationResult = Compile(adjustedSource, new [] { typeof(IQueryable).Assembly.Location }); Assert.True(compilationResult.Success); var validator = new SmartContractFormatValidator(); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; var result = validator.Validate(decomp.ModuleDefinition); Assert.False(result.IsValid); Assert.Single(result.Errors); }
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 { } "; ContractCompilationResult compilationResult = ContractCompiler.Compile(adjustedSource); Assert.True(compilationResult.Success); var validator = new SmartContractFormatValidator(); byte[] assemblyBytes = compilationResult.Compilation; IContractModuleDefinition decomp = ContractDecompiler.GetModuleDefinition(assemblyBytes).Value; var result = validator.Validate(decomp.ModuleDefinition); Assert.False(result.IsValid); Assert.Equal(2, result.Errors.Count()); }
public void SmartContract_ValidateFormat_FormatValidatorChecksConstructor() { var validator = new SmartContractFormatValidator(ReferencedAssemblyResolver.AllowedAssemblies); var validationResult = validator.Validate(MultipleConstructorDecompilation); Assert.Single(validationResult.Errors); Assert.False(validationResult.IsValid); }
public void SmartContract_ValidateFormat_FormatValidatorChecksConstructor() { var validator = new SmartContractFormatValidator(); var validationResult = validator.Validate(MultipleConstructorModuleDefinition.ModuleDefinition); Assert.Single(validationResult.Errors); Assert.False(validationResult.IsValid); }
private int OnExecute(CommandLineApplication app) { if (!this.InputFiles.Any()) { app.ShowHelp(); return(1); } Console.WriteLine(); Console.WriteLine("Smart Contract Validator"); Console.WriteLine(); var determinismValidator = new SctDeterminismValidator(); var formatValidator = new SmartContractFormatValidator(); var warningValidator = new SmartContractWarningValidator(); var reportData = new List <ValidationReportData>(); foreach (string file in this.InputFiles) { if (!File.Exists(file)) { Console.WriteLine($"{file} does not exist"); continue; } string source; Console.WriteLine($"Reading {file}"); using (var sr = new StreamReader(File.OpenRead(file))) { source = sr.ReadToEnd(); } Console.WriteLine($"Read {file} OK"); Console.WriteLine(); if (string.IsNullOrWhiteSpace(source)) { Console.WriteLine($"Empty file at {file}"); Console.WriteLine(); continue; } var validationData = new ValidationReportData { FileName = file, CompilationErrors = new List <CompilationError>(), DeterminismValidationErrors = new List <ValidationResult>(), FormatValidationErrors = new List <ValidationError>(), Warnings = new List <Warning>() }; reportData.Add(validationData); Console.WriteLine($"Compiling..."); ContractCompilationResult compilationResult = ContractCompiler.Compile(source); validationData.CompilationSuccess = compilationResult.Success; if (!compilationResult.Success) { Console.WriteLine("Compilation failed!"); Console.WriteLine(); validationData.CompilationErrors .AddRange(compilationResult .Diagnostics .Select(d => new CompilationError { Message = d.ToString() })); continue; } validationData.CompilationBytes = compilationResult.Compilation; Console.WriteLine($"Compilation OK"); Console.WriteLine(); byte[] compilation = compilationResult.Compilation; Console.WriteLine("Building ModuleDefinition"); IContractModuleDefinition moduleDefinition = ContractDecompiler.GetModuleDefinition(compilation, new DotNetCoreAssemblyResolver()).Value; Console.WriteLine("ModuleDefinition built successfully"); Console.WriteLine(); Console.WriteLine($"Validating file {file}..."); Console.WriteLine(); SmartContractValidationResult formatValidationResult = formatValidator.Validate(moduleDefinition.ModuleDefinition); validationData.FormatValid = formatValidationResult.IsValid; validationData .FormatValidationErrors .AddRange(formatValidationResult .Errors .Select(e => new ValidationError { Message = e.Message })); SmartContractValidationResult determinismValidationResult = determinismValidator.Validate(moduleDefinition); validationData.DeterminismValid = determinismValidationResult.IsValid; validationData .DeterminismValidationErrors .AddRange(determinismValidationResult.Errors); SmartContractValidationResult warningResult = warningValidator.Validate(moduleDefinition.ModuleDefinition); validationData .Warnings .AddRange(warningResult .Errors .Select(e => new Warning { Message = e.Message })); } List <IReportSection> reportStructure = new List <IReportSection>(); reportStructure.Add(new HeaderSection()); reportStructure.Add(new CompilationSection()); reportStructure.Add(new FormatSection()); reportStructure.Add(new DeterminismSection()); reportStructure.Add(new WarningsSection()); if (this.ShowBytes) { reportStructure.Add(new ByteCodeSection()); } reportStructure.Add(new FooterSection()); var renderer = new StreamTextRenderer(Console.Out); foreach (ValidationReportData data in reportData) { renderer.Render(reportStructure, data); } return(1); }