/// THE RETURN VALUE MEANS "PARAMETERS WRE OK"!!!!! BAD!! private static int DoInputGenerationRound( CommandLineArguments args, string outputDir, int round, ref TimeSpan totalTime, string tempDir, string executionLogFileName, int randomseed, Collection <string> methodsToOmit, Collection <string> constructorsToOmit) { // Calculate time for next invocation of Randoop. TimeSpan timeForNextInvocation = CalculateNextTimeLimit(args.TimeLimit, totalTime, new TimeSpan(0, 0, args.restartTimeSeconds)); // Analyze last execution. int lastPlanId; AnalyzeLastExecution(executionLogFileName, out lastPlanId, outputDir); // Create a new randoop configuration. RandoopConfiguration config = ConfigFileCreator.CreateConfigFile(args, outputDir, lastPlanId, timeForNextInvocation, round, executionLogFileName, randomseed); string configFileName = tempDir + "\\config" + round + ".xml"; config.Save(configFileName); FileInfo configFileInfo = new FileInfo(configFileName); // Launch new instance of Randoop. Console.WriteLine(); Console.WriteLine("------------------------------------"); Console.WriteLine("Spawning new input generator process (round " + round + ")"); Process p = new Process(); p.StartInfo.FileName = Common.Enviroment.RandoopBareExe; p.StartInfo.Arguments = ConfigFileName.ToString(configFileInfo); p.StartInfo.UseShellExecute = false; p.StartInfo.ErrorDialog = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = false; p.StartInfo.WorkingDirectory = tempDir; Console.WriteLine("Spawning process: "); Console.WriteLine(Util.PrintProcess(p)); // Give it 30 seconds to load reflection info, etc. int waitTime = (Convert.ToInt32(timeForNextInvocation.TotalSeconds) + 30) * 1000; Console.WriteLine("Will wait " + waitTime + " milliseconds for process to terminate."); p.Start(); if (!p.WaitForExit(waitTime)) { // Process didn't terminate. Kill it forcefully. Console.WriteLine("Killing process " + p.Id); try { p.Kill(); } catch (InvalidOperationException) { // p has already terminated. No problem. } p.WaitForExit(); } // Update total time. totalTime += p.ExitTime - p.StartTime; string err = p.StandardError.ReadToEnd(); // Randoop terminated with error. if (p.ExitCode != 0) { if (err.Contains(Common.Enviroment.RandoopBareInternalErrorMessage)) { Console.WriteLine(err); Console.WriteLine("*** RandoopBare had an internal error. Exiting."); return(p.ExitCode); } if (err.Contains(Common.Enviroment.RandoopBareInvalidUserParametersErrorMessage)) { Console.WriteLine(err); Console.WriteLine("*** RandoopBare terminated normally. Exiting."); return(p.ExitCode); } } return(0); }
public static RandoopConfiguration CreateConfigFile( CommandLineArguments args, string outputDirBase, int lastPlanId, TimeSpan timeForNextInvocation, int round, string executionLogFileName, int randomseed) { RandoopConfiguration config = new RandoopConfiguration(); string statsFileName = outputDirBase + "\\" + Path.GetRandomFileName() + ".stats.txt"; config.statsFile = new FileName(statsFileName); config.singledir = args.SingleDir; config.outputnormalinputs = args.OutputNormal; config.outputdir = outputDirBase; config.planstartid = lastPlanId; config.timelimit = Convert.ToInt32(timeForNextInvocation.TotalSeconds); config.randomseed = round - 1 + randomseed; config.useinternal = args.ExploreInternal; config.usestatic = !args.NoStatic; // TODO fix this twisted logic! config.forbidnull = !args.AllowNull; // TODO fix this twisted logic! config.fairOpt = args.Fair; // execute fair algorithm if (args.TrueRandom) config.randomSource = RandomSource.Crypto; else config.randomSource = RandomSource.SystemRandom; foreach (string s in args.AssemblyNames) { config.assemblies.Add(new FileName(new FileInfo(s).FullName)); } config.executionLog = executionLogFileName; if (args.DontExecute) config.executionmode = ExecutionMode.DontExecute; // Load any configuration files present in the user-specified directory. bool userSpecifiedConfigDir = false; if (args.ConfigFilesDir != null) { if (Directory.Exists(args.ConfigFilesDir)) { userSpecifiedConfigDir = true; } else { Console.WriteLine("*** Warning: randoop could not find directory {0}.", args.ConfigFilesDir); Console.WriteLine(" Will use default configuration files."); } } if (userSpecifiedConfigDir) { string configFile; configFile = args.ConfigFilesDir + @"\seed_sbyte.txt"; if (!File.Exists(configFile)) configFile = Enviroment.SbytesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(sbyte), configFile)); configFile = args.ConfigFilesDir + @"\seed_byte.txt"; if (!File.Exists(configFile)) configFile = Enviroment.BytesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(byte), configFile)); configFile = args.ConfigFilesDir + @"\seed_short.txt"; if (!File.Exists(configFile)) configFile = Enviroment.ShortsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(short), configFile)); configFile = args.ConfigFilesDir + @"\seed_ushort.txt"; if (!File.Exists(configFile)) configFile = Enviroment.UshortsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(ushort), configFile)); configFile = args.ConfigFilesDir + @"\seed_int.txt"; if (!File.Exists(configFile)) configFile = Enviroment.IntsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(int), configFile)); configFile = args.ConfigFilesDir + @"\seed_uint.txt"; if (!File.Exists(configFile)) configFile = Enviroment.UintsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(uint), configFile)); configFile = args.ConfigFilesDir + @"\seed_long.txt"; if (!File.Exists(configFile)) configFile = Enviroment.LongsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(long), configFile)); configFile = args.ConfigFilesDir + @"\seed_ulong.txt"; if (!File.Exists(configFile)) configFile = Enviroment.UlongsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(ulong), configFile)); configFile = args.ConfigFilesDir + @"\seed_char.txt"; if (!File.Exists(configFile)) configFile = Enviroment.CharsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(char), configFile)); configFile = args.ConfigFilesDir + @"\seed_float.txt"; if (!File.Exists(configFile)) configFile = Enviroment.FloatsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(float), configFile)); configFile = args.ConfigFilesDir + @"\seed_double.txt"; if (!File.Exists(configFile)) configFile = Enviroment.DoublesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(double), configFile)); configFile = args.ConfigFilesDir + @"\seed_bool.txt"; if (!File.Exists(configFile)) configFile = Enviroment.BoolsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(bool), configFile)); configFile = args.ConfigFilesDir + @"\seed_decimal.txt"; if (!File.Exists(configFile)) configFile = Enviroment.DecimalsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(decimal), configFile)); configFile = args.ConfigFilesDir + @"\seed_string.txt"; if (!File.Exists(configFile)) configFile = Enviroment.StringsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(string), configFile)); configFile = args.ConfigFilesDir + @"\require_types.txt"; if (!File.Exists(configFile)) configFile = Enviroment.RequiretypesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_typesFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\require_members.txt"; if (!File.Exists(configFile)) configFile = Enviroment.RequiremembersDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_membersFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\require_fields.txt"; if (!File.Exists(configFile)) configFile = Enviroment.RequirefieldsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_fieldsFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\forbid_types.txt"; if (!File.Exists(configFile)) configFile = Enviroment.ForbidtypesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_typesFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\forbid_members.txt"; if (!File.Exists(configFile)) configFile = Enviroment.ForbidmembersDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_membersFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\forbid_fields.txt"; if (!File.Exists(configFile)) configFile = Enviroment.ForbidfieldsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_fieldsFiles.Add(new FileName(new FileInfo(configFile).FullName)); } else { string configFile; configFile = Enviroment.SbytesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(sbyte), configFile)); configFile = Enviroment.BytesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(byte), configFile)); configFile = Enviroment.ShortsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(short), configFile)); configFile = Enviroment.UshortsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(ushort), configFile)); configFile = Enviroment.IntsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(int), configFile)); configFile = Enviroment.UintsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(uint), configFile)); configFile = Enviroment.LongsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(long), configFile)); configFile = Enviroment.UlongsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(ulong), configFile)); configFile = Enviroment.CharsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(char), configFile)); configFile = Enviroment.FloatsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(float), configFile)); configFile = Enviroment.DoublesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(double), configFile)); configFile = Enviroment.BoolsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(bool), configFile)); configFile = Enviroment.DecimalsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(decimal), configFile)); configFile = Enviroment.StringsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(string), configFile)); configFile = Enviroment.RequiretypesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_typesFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.RequiremembersDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_membersFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.RequirefieldsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_fieldsFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.ForbidtypesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_typesFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.ForbidmembersDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_membersFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.ForbidfieldsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_fieldsFiles.Add(new FileName(new FileInfo(configFile).FullName)); } config.CheckRep(); return config; }
/// <summary> /// The "real" main entrypoint into test generation. /// Generates tests by invoking the test generator, potentially multiple times. /// </summary> private static void GenerateTests(string[] argArray) { // Parse command line arguments. string errorMessage; CommandLineArguments args = new CommandLineArguments( argArray, defaultTotalTimeLimit, defaultStartTimeSeconds, out errorMessage); if (errorMessage != null) { Console.WriteLine("Error in command-line arguments: " + errorMessage); System.Environment.Exit(1); } //CheckAssembliesExist(args); int randomseed = 0; if (args.RandomSeed != null) { int.TryParse(args.RandomSeed, out randomseed); } // Invoke the generator, possibly multiple times. // If timeLimit > Randoop.TIME_PER_INVOCATION, then the generator // is invoked multiple times each time with time limit <= TIME_PER_INVOCATION. string tempDir = null; try { // Create temporary directory. tempDir = Common.TempDir.CreateTempDir(); // Determine output directory. string outputDir; if (args.OutputDir == null) { // The output directory's name is calculated based on // the day and time that this invocation of Randoop occurred. outputDir = System.Environment.CurrentDirectory + "\\randoop_output\\" + CalculateOutputDirBase(); } else { outputDir = args.OutputDir; // TODO check legal file name. } // Create output directory, if it doesn't exist. if (!Directory.Exists(outputDir)) { new DirectoryInfo(outputDir).Create(); // TODO resource error checking. } // Determine execution log file name. string executionLog = tempDir + "\\" + "execution.log"; if (args.PageHeap) { PageHeaEnableRandoop(); } if (args.UseDHandler) { DHandlerEnable(); } TimeSpan totalTime = new TimeSpan(0); int round = 0; Collection <string> methodsToOmit = new Collection <string>(); Collection <string> constructorsToOmit = new Collection <string>(); while (Convert.ToInt32(totalTime.TotalSeconds) < Convert.ToInt32(args.TimeLimit.TotalSeconds)) { round++; int exitCode = DoInputGenerationRound(args, outputDir, round, ref totalTime, tempDir, executionLog, randomseed, methodsToOmit, constructorsToOmit); if (exitCode != 0) { break; } } if (args.PageHeap) { PageHeapDisableRandoop(); } if (args.UseDHandler) { DHandlerDisable(); } // Create allstats.txt and index.html. bool testsCreated; if (!PostProcessTests(args, outputDir)) { testsCreated = false; Console.WriteLine("No tests created."); } else { testsCreated = true; } if (!args.KeepStatLogs) { DeleteStatLogs(outputDir); } // The final step invokes IE and displays a summary (file index.html). if (!args.NoExplorer && testsCreated) { OpenExplorer(outputDir + "\\index.html"); } } catch (Exception e) { Console.WriteLine("*** Randoop error. " + "Please report this error to Randoop's developers."); Console.WriteLine(e); System.Environment.Exit(1); } finally { // Delete temp dir. if (tempDir != null) { Console.WriteLine("Removing temporary directory: " + tempDir); try { new DirectoryInfo(tempDir).Delete(true); } catch (Exception e) { Console.WriteLine("Exception raised while deleting temporary directory: " + e.Message); } } } }
public static RandoopConfiguration CreateConfigFile( CommandLineArguments args, string outputDirBase, int lastPlanId, TimeSpan timeForNextInvocation, int round, string executionLogFileName, int randomseed) { RandoopConfiguration config = new RandoopConfiguration(); string statsFileName = outputDirBase + "\\" + Path.GetRandomFileName() + ".stats.txt"; config.statsFile = new FileName(statsFileName); config.singledir = args.SingleDir; config.outputnormalinputs = args.OutputNormal; config.outputdir = outputDirBase; config.planstartid = lastPlanId; config.timelimit = Convert.ToInt32(timeForNextInvocation.TotalSeconds); config.randomseed = round - 1 + randomseed; config.useinternal = args.ExploreInternal; config.usestatic = !args.NoStatic; // TODO fix this twisted logic! config.forbidnull = !args.AllowNull; // TODO fix this twisted logic! config.fairOpt = args.Fair; // execute fair algorithm if (args.TrueRandom) { config.randomSource = RandomSource.Crypto; } else { config.randomSource = RandomSource.SystemRandom; } foreach (string s in args.AssemblyNames) { config.assemblies.Add(new FileName(new FileInfo(s).FullName)); } config.executionLog = executionLogFileName; if (args.DontExecute) { config.executionmode = ExecutionMode.DontExecute; } // Load any configuration files present in the user-specified directory. bool userSpecifiedConfigDir = false; if (args.ConfigFilesDir != null) { if (Directory.Exists(args.ConfigFilesDir)) { userSpecifiedConfigDir = true; } else { Console.WriteLine("*** Warning: randoop could not find directory {0}.", args.ConfigFilesDir); Console.WriteLine(" Will use default configuration files."); } } if (userSpecifiedConfigDir) { string configFile; configFile = args.ConfigFilesDir + @"\seed_sbyte.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.SbytesDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(sbyte), configFile)); configFile = args.ConfigFilesDir + @"\seed_byte.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.BytesDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(byte), configFile)); configFile = args.ConfigFilesDir + @"\seed_short.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.ShortsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(short), configFile)); configFile = args.ConfigFilesDir + @"\seed_ushort.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.UshortsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(ushort), configFile)); configFile = args.ConfigFilesDir + @"\seed_int.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.IntsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(int), configFile)); configFile = args.ConfigFilesDir + @"\seed_uint.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.UintsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(uint), configFile)); configFile = args.ConfigFilesDir + @"\seed_long.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.LongsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(long), configFile)); configFile = args.ConfigFilesDir + @"\seed_ulong.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.UlongsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(ulong), configFile)); configFile = args.ConfigFilesDir + @"\seed_char.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.CharsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(char), configFile)); configFile = args.ConfigFilesDir + @"\seed_float.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.FloatsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(float), configFile)); configFile = args.ConfigFilesDir + @"\seed_double.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.DoublesDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(double), configFile)); configFile = args.ConfigFilesDir + @"\seed_bool.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.BoolsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(bool), configFile)); configFile = args.ConfigFilesDir + @"\seed_decimal.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.DecimalsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(decimal), configFile)); configFile = args.ConfigFilesDir + @"\seed_string.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.StringsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(string), configFile)); configFile = args.ConfigFilesDir + @"\require_types.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.RequiretypesDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.require_typesFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\require_members.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.RequiremembersDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.require_membersFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\require_fields.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.RequirefieldsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.require_fieldsFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\forbid_types.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.ForbidtypesDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_typesFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\forbid_members.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.ForbidmembersDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_membersFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = args.ConfigFilesDir + @"\forbid_fields.txt"; if (!File.Exists(configFile)) { configFile = Enviroment.ForbidfieldsDefaultConfigFile; } Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_fieldsFiles.Add(new FileName(new FileInfo(configFile).FullName)); } else { string configFile; configFile = Enviroment.SbytesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(sbyte), configFile)); configFile = Enviroment.BytesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(byte), configFile)); configFile = Enviroment.ShortsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(short), configFile)); configFile = Enviroment.UshortsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(ushort), configFile)); configFile = Enviroment.IntsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(int), configFile)); configFile = Enviroment.UintsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(uint), configFile)); configFile = Enviroment.LongsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(long), configFile)); configFile = Enviroment.UlongsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(ulong), configFile)); configFile = Enviroment.CharsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(char), configFile)); configFile = Enviroment.FloatsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(float), configFile)); configFile = Enviroment.DoublesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(double), configFile)); configFile = Enviroment.BoolsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(bool), configFile)); configFile = Enviroment.DecimalsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(decimal), configFile)); configFile = Enviroment.StringsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.simpleTypeValues.Add(CreateSimpleValueTypeXmlElement(typeof(string), configFile)); configFile = Enviroment.RequiretypesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_typesFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.RequiremembersDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_membersFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.RequirefieldsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.require_fieldsFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.ForbidtypesDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_typesFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.ForbidmembersDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_membersFiles.Add(new FileName(new FileInfo(configFile).FullName)); configFile = Enviroment.ForbidfieldsDefaultConfigFile; Console.WriteLine("Will use configuration file {0}.", configFile); config.forbid_fieldsFiles.Add(new FileName(new FileInfo(configFile).FullName)); } config.CheckRep(); return(config); }
// false if no tests found. private static bool PostProcessTests(CommandLineArguments args, string outputDir) { ////////////////////////////////////////////////////////////////////// // Determine directory where generated tests were written. DirectoryInfo resultsDir = new DirectoryInfo(outputDir); ////////////////////////////////////////////////////////////////////// // Collect all tests generated. Collection<FileInfo> tests = TestCaseUtils.CollectFilesEndingWith(".cs", resultsDir); if (tests.Count == 0) { return false; } Dictionary<TestCase.ExceptionDescription, Collection<FileInfo>> classifiedTests = TestCaseUtils.ClassifyTestsByMessage(tests); PrintStats(classifiedTests); ////////////////////////////////////////////////////////////////////// // Create stats file. StatsManager.ComputeStats(resultsDir + "\\allstats.txt", TestCaseUtils.CollectFilesEndingWith(".stats.txt", resultsDir)); ////////////////////////////////////////////////////////////////////// // Create HTML index. HtmlSummary.CreateIndexHtml(classifiedTests, resultsDir + "\\index.html", args.ToString()); Console.WriteLine(); Console.WriteLine("Results written to " + resultsDir + "."); Console.WriteLine("You can browse the results by opening the file " + System.Environment.NewLine + " " + resultsDir + "\\index.html"); return true; }
/// THE RETURN VALUE MEANS "PARAMETERS WRE OK"!!!!! BAD!! private static int DoInputGenerationRound( CommandLineArguments args, string outputDir, int round, ref TimeSpan totalTime, string tempDir, string executionLogFileName, int randomseed, Collection<string> methodsToOmit, Collection<string> constructorsToOmit) { // Calculate time for next invocation of Randoop. TimeSpan timeForNextInvocation = CalculateNextTimeLimit(args.TimeLimit, totalTime, new TimeSpan(0, 0, args.restartTimeSeconds)); // Analyze last execution. int lastPlanId; AnalyzeLastExecution(executionLogFileName, out lastPlanId, outputDir); // Create a new randoop configuration. RandoopConfiguration config = ConfigFileCreator.CreateConfigFile(args, outputDir, lastPlanId, timeForNextInvocation, round, executionLogFileName, randomseed); string configFileName = tempDir + "\\config" + round + ".xml"; config.Save(configFileName); FileInfo configFileInfo = new FileInfo(configFileName); // Launch new instance of Randoop. Console.WriteLine(); Console.WriteLine("------------------------------------"); Console.WriteLine("Spawning new input generator process (round " + round + ")"); Process p = new Process(); p.StartInfo.FileName = Common.Enviroment.RandoopBareExe; p.StartInfo.Arguments = ConfigFileName.ToString(configFileInfo); p.StartInfo.UseShellExecute = false; p.StartInfo.ErrorDialog = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = false; p.StartInfo.WorkingDirectory = tempDir; Console.WriteLine("Spawning process: "); Console.WriteLine(Util.PrintProcess(p)); // Give it 30 seconds to load reflection info, etc. int waitTime = (Convert.ToInt32(timeForNextInvocation.TotalSeconds) + 30)*1000; Console.WriteLine("Will wait " + waitTime + " milliseconds for process to terminate."); p.Start(); if (!p.WaitForExit(waitTime)) { // Process didn't terminate. Kill it forcefully. Console.WriteLine("Killing process " + p.Id); try { p.Kill(); } catch (InvalidOperationException) { // p has already terminated. No problem. } p.WaitForExit(); } // Update total time. totalTime += p.ExitTime - p.StartTime; string err = p.StandardError.ReadToEnd(); // Randoop terminated with error. if (p.ExitCode != 0) { if (err.Contains(Common.Enviroment.RandoopBareInternalErrorMessage)) { Console.WriteLine(err); Console.WriteLine("*** RandoopBare had an internal error. Exiting."); return p.ExitCode; } if (err.Contains(Common.Enviroment.RandoopBareInvalidUserParametersErrorMessage)) { Console.WriteLine(err); Console.WriteLine("*** RandoopBare terminated normally. Exiting."); return p.ExitCode; } } return 0; }
private static void CheckAssembliesExist(CommandLineArguments args) { foreach (string s in args.AssemblyNames) { if (!File.Exists(s)) { Console.WriteLine("Assembly file does not exist: " + s); System.Environment.Exit(1); } } }
/// <summary> /// The "real" main entrypoint into test generation. /// Generates tests by invoking the test generator, potentially multiple times. /// </summary> private static void GenerateTests(string[] argArray) { // Parse command line arguments. string errorMessage; CommandLineArguments args = new CommandLineArguments( argArray, defaultTotalTimeLimit, defaultStartTimeSeconds, out errorMessage); if (errorMessage != null) { Console.WriteLine("Error in command-line arguments: " + errorMessage); System.Environment.Exit(1); } //CheckAssembliesExist(args); int randomseed = 0; if (args.RandomSeed != null) { int.TryParse(args.RandomSeed, out randomseed); } // Invoke the generator, possibly multiple times. // If timeLimit > Randoop.TIME_PER_INVOCATION, then the generator // is invoked multiple times each time with time limit <= TIME_PER_INVOCATION. string tempDir = null; try { // Create temporary directory. tempDir = Common.TempDir.CreateTempDir(); // Determine output directory. string outputDir; if (args.OutputDir == null) { // The output directory's name is calculated based on // the day and time that this invocation of Randoop occurred. outputDir = System.Environment.CurrentDirectory + "\\randoop_output\\" + CalculateOutputDirBase(); } else { outputDir = args.OutputDir; // TODO check legal file name. } // Create output directory, if it doesn't exist. if (!Directory.Exists(outputDir)) new DirectoryInfo(outputDir).Create(); // TODO resource error checking. // Determine execution log file name. string executionLog = tempDir + "\\" + "execution.log"; if (args.PageHeap) PageHeaEnableRandoop(); if (args.UseDHandler) DHandlerEnable(); TimeSpan totalTime = new TimeSpan(0); int round = 0; Collection<string> methodsToOmit = new Collection<string>(); Collection<string> constructorsToOmit = new Collection<string>(); while (Convert.ToInt32(totalTime.TotalSeconds) < Convert.ToInt32(args.TimeLimit.TotalSeconds)) { round++; int exitCode = DoInputGenerationRound(args, outputDir, round, ref totalTime, tempDir, executionLog, randomseed, methodsToOmit, constructorsToOmit); if (exitCode != 0) break; } if (args.PageHeap) PageHeapDisableRandoop(); if (args.UseDHandler) DHandlerDisable(); // Create allstats.txt and index.html. bool testsCreated; if (!PostProcessTests(args, outputDir)) { testsCreated = false; Console.WriteLine("No tests created."); } else { testsCreated = true; } if (!args.KeepStatLogs) DeleteStatLogs(outputDir); // The final step invokes IE and displays a summary (file index.html). if (!args.NoExplorer && testsCreated) OpenExplorer(outputDir + "\\index.html"); } catch (Exception e) { Console.WriteLine("*** Randoop error. " + "Please report this error to Randoop's developers."); Console.WriteLine(e); System.Environment.Exit(1); } finally { // Delete temp dir. if (tempDir != null) { Console.WriteLine("Removing temporary directory: " + tempDir); try { new DirectoryInfo(tempDir).Delete(true); } catch (Exception e) { Console.WriteLine("Exception raised while deleting temporary directory: " + e.Message); } } } }