Exemple #1
0
        /// 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;
        }
Exemple #3
0
        /// <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);
        }
Exemple #5
0
        // 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;
        }
Exemple #6
0
        /// 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;
        }
Exemple #7
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);
         }
     }
 }
Exemple #8
0
        /// <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);
                    }
                }
            }
        }