Beispiel #1
0
        /// <summary>
        /// Dumps static database
        /// </summary>
        public void DumpStaticDatabase(PexMeStaticDatabase psd)
        {
            SafeDebug.AssumeNotNull(psd, "psd");

            if (!Directory.Exists(PexMeConstants.PexMeStorageDirectory))
            {
                Directory.CreateDirectory(PexMeConstants.PexMeStorageDirectory);
            }

            //Dump the dynamic field store that includes information of which method modify which fields
            try
            {
                var             filename           = Path.Combine(PexMeConstants.PexMeStorageDirectory, PexMeConstants.PexMeStaticFieldStore);
                Stream          streamWrite        = File.Create(filename);
                BinaryFormatter binaryWrite        = new BinaryFormatter();
                var             persistentFieldDic = this.GetPersistentFieldDictionary(psd.FieldDictionary);
                binaryWrite.Serialize(streamWrite, persistentFieldDic);
                streamWrite.Close();
            }
            catch (Exception ex)
            {
                psd.Log.LogErrorFromException(ex, WikiTopics.MissingWikiTopic, "dumpwriter",
                                              "Failed to dump field store of static database");
            }

            //Dump the dynamic method store that includes information of which method calls other methods and field they modify
            try
            {
                var             filename            = Path.Combine(PexMeConstants.PexMeStorageDirectory, PexMeConstants.PexMeStaticMethodStore);
                Stream          streamWrite         = File.Create(filename);
                BinaryFormatter binaryWrite         = new BinaryFormatter();
                var             persistentMethodDic = this.GetPersistentMethodDictionary(psd.MethodDictionary);
                binaryWrite.Serialize(streamWrite, persistentMethodDic);
                streamWrite.Close();
            }
            catch (Exception ex)
            {
                psd.Log.LogErrorFromException(ex, WikiTopics.MissingWikiTopic, "dumpwriter",
                                              "Failed to dump method store of static database");
            }

            /******************** DEBUGGING INFO *************************/
            //Writing method information
            var methodDic = psd.MethodDictionary;

            var methodAccessFileName = Path.Combine(PexMeConstants.PexMeStorageDirectory, psd.AssemblyName + ".static.methodAccess.txt");

            using (StreamWriter sw = new StreamWriter(methodAccessFileName))
            {
                foreach (var methodEntry in methodDic.Values)
                {
                    //Printing write fields
                    sw.WriteLine("Methodname: " + methodEntry.methodName);

                    if (methodEntry.WriteFields.Count > 0)
                    {
                        sw.WriteLine("Write fields: ");
                        foreach (var writeField in methodEntry.WriteFields)
                        {
                            sw.WriteLine("\tField: " + writeField);
                        }
                    }

                    if (methodEntry.CalledMethods.Count > 0)
                    {
                        sw.WriteLine("Called Methods: ");
                        foreach (var calledMethod in methodEntry.CalledMethods)
                        {
                            sw.WriteLine("\t" + calledMethod);
                        }
                    }

                    if (methodEntry.CallingMethods.Count > 0)
                    {
                        sw.WriteLine("Calling Methods: ");
                        foreach (var callingMethod in methodEntry.CallingMethods)
                        {
                            sw.WriteLine("\t" + callingMethod);
                        }
                    }

                    //TODO: Print read fields
                }
            }

            //Writing field information
            var fieldDic = psd.FieldDictionary;

            var fieldAccessFileName = Path.Combine(PexMeConstants.PexMeStorageDirectory, psd.AssemblyName + ".static.fieldAccess.txt");

            using (StreamWriter sw = new StreamWriter(fieldAccessFileName))
            {
                foreach (var fieldEntry in fieldDic.Values)
                {
                    //Printing write methods
                    sw.WriteLine("Fieldname: " + fieldEntry.FieldName);
                    sw.WriteLine("Write methods: ");
                    foreach (var writeMethodSet in fieldEntry.WriteMethods.Values)
                    {
                        foreach (var writeMethod in writeMethodSet)
                        {
                            sw.WriteLine("\tMethod: " + writeMethod + ", ModificationType: " + FieldStore.GetModificationType(fieldEntry, writeMethod));
                        }
                    }

                    sw.WriteLine("Field values: ");
                    foreach (var fieldValue in fieldEntry.FieldValues)
                    {
                        sw.WriteLine("\tValue: " + fieldValue);
                    }

                    //TODO: Print read methods
                }
            }
            /******************** DEBUGGING INFO *************************/
        }
Beispiel #2
0
        /// <summary>
        /// Dumps entire database into different persistent stores (files)
        /// </summary>
        /// <param name="pmd"></param>
        public void DumpDynamicDatabase(PexMeDynamicDatabase pmd)
        {
            if (!Directory.Exists(PexMeConstants.PexMeStorageDirectory))
            {
                Directory.CreateDirectory(PexMeConstants.PexMeStorageDirectory);
            }

            //Dumping only the contents of factory suggestion store for time being
            //as the classes in extended reflection are not serializable
            try
            {
                DumpFactorySuggestionStore(pmd);
            }
            catch (Exception ex)
            {
                pmd.Log.LogErrorFromException(ex, WikiTopics.MissingWikiTopic, "dumpwriter",
                                              "Failed to dump dynamic factory suggestion store");
            }

            if (PexMeConstants.ENABLE_DYNAMICDB_STORAGE)
            {
                //Dump the dynamic field store that includes information of which method modify which fields
                try
                {
                    var             filename           = Path.Combine(PexMeConstants.PexMeStorageDirectory, PexMeConstants.PexMeDynamicFieldStore);
                    Stream          streamWrite        = File.Create(filename);
                    BinaryFormatter binaryWrite        = new BinaryFormatter();
                    var             persistentFieldDic = this.GetPersistentFieldDictionary(pmd.FieldDictionary);
                    binaryWrite.Serialize(streamWrite, persistentFieldDic);
                    streamWrite.Close();
                }
                catch (Exception ex)
                {
                    pmd.Log.LogErrorFromException(ex, WikiTopics.MissingWikiTopic, "dumpwriter",
                                                  "Failed to dump dynamic field store");
                }
            }

            if (PexMeConstants.ENABLE_DYNAMICDB_STORAGE)
            {
                //Dump the dynamic method store that includes information of which method calls other methods and field they modify
                try
                {
                    var             filename            = Path.Combine(PexMeConstants.PexMeStorageDirectory, PexMeConstants.PexMeDynamicMethodStore);
                    Stream          streamWrite         = File.Create(filename);
                    BinaryFormatter binaryWrite         = new BinaryFormatter();
                    var             persistentMethodDic = this.GetPersistentMethodDictionary(pmd.MethodDictionary);
                    binaryWrite.Serialize(streamWrite, persistentMethodDic);
                    streamWrite.Close();
                }
                catch (Exception ex)
                {
                    pmd.Log.LogErrorFromException(ex, WikiTopics.MissingWikiTopic, "dumpwriter",
                                                  "Failed to dynamic dump method store");
                }
            }

            //Dump the all explored methods
            try
            {
                var             filename    = Path.Combine(PexMeConstants.PexMeStorageDirectory, PexMeConstants.PexMeDynamicExploredMethods);
                Stream          streamWrite = File.Create(filename);
                BinaryFormatter binaryWrite = new BinaryFormatter();
                binaryWrite.Serialize(streamWrite, pmd.AllExploredMethods);
                streamWrite.Close();
            }
            catch (Exception ex)
            {
                pmd.Log.LogErrorFromException(ex, WikiTopics.MissingWikiTopic, "dumpwriter",
                                              "Failed to dump all explored methods");
            }

            //Dump the all explored methods
            try
            {
                var             filename    = Path.Combine(PexMeConstants.PexMeStorageDirectory, PexMeConstants.PexMePendingExplorationMethods);
                Stream          streamWrite = File.Create(filename);
                BinaryFormatter binaryWrite = new BinaryFormatter();
                binaryWrite.Serialize(streamWrite, pmd.PendingExplorationMethods);
                streamWrite.Close();
            }
            catch (Exception ex)
            {
                pmd.Log.LogErrorFromException(ex, WikiTopics.MissingWikiTopic, "dumpwriter",
                                              "Failed to dump pending explored methods");
            }

            /******************** BEGIN OF DEBUGGING INFO ***********************/
            //Writing monitored methods
            if (PexMeConstants.ENABLE_DYNAMICDB_STORAGE)
            {
                var monitoredMethods         = pmd.MonitoredMethods;
                var monitoredMethodsFileName = Path.Combine(PexMeConstants.PexMeStorageDirectory, pmd.AssemblyName + ".dynamic.monitoredmethods.txt");
                using (StreamWriter sw = new StreamWriter(monitoredMethodsFileName))
                {
                    //Printing all monitored methods
                    sw.WriteLine("All monitored methods");
                    foreach (var methodName in pmd.MonitoredMethods)
                    {
                        sw.WriteLine(methodName);
                    }

                    //Printing all controllable types
                    sw.WriteLine();
                    sw.WriteLine("Controllable types");
                    foreach (var typeName in pmd.ControllableTypes)
                    {
                        sw.WriteLine(typeName);
                    }

                    //Printing all types for which factory methods are requested
                    sw.WriteLine();
                    sw.WriteLine("Factory requested types");
                    foreach (var typeName in pmd.PexGeneratedFactories.Values)
                    {
                        sw.WriteLine(typeName);
                    }
                }
            }

            //Writing method information
            if (PexMeConstants.ENABLE_DYNAMICDB_STORAGE)
            {
                var methodDic            = pmd.MethodDictionary;
                var methodAccessFileName = Path.Combine(PexMeConstants.PexMeStorageDirectory, pmd.AssemblyName + ".dynamic.methodAccess.txt");
                using (StreamWriter sw = new StreamWriter(methodAccessFileName))
                {
                    foreach (var methodEntry in methodDic.Values)
                    {
                        //Printing write fields
                        sw.WriteLine("Methodname: " + methodEntry.methodName);

                        if (methodEntry.WriteFields.Count > 0)
                        {
                            sw.WriteLine("Write fields: ");
                            foreach (var writeField in methodEntry.WriteFields)
                            {
                                sw.WriteLine("\tField: " + writeField);
                            }
                        }

                        if (methodEntry.CalledMethods.Count > 0)
                        {
                            sw.WriteLine("Called Methods: ");
                            foreach (var calledMethod in methodEntry.CalledMethods)
                            {
                                sw.WriteLine("\t" + calledMethod);
                            }
                        }

                        if (methodEntry.CallingMethods.Count > 0)
                        {
                            sw.WriteLine("Calling Methods: ");
                            foreach (var callingMethod in methodEntry.CallingMethods)
                            {
                                sw.WriteLine("\t" + callingMethod);
                            }
                        }

                        //TODO: Print read fields
                    }
                }
            }

            //Writing field information
            if (PexMeConstants.ENABLE_DYNAMICDB_STORAGE)
            {
                var fieldDic            = pmd.FieldDictionary;
                var fieldAccessFileName = Path.Combine(PexMeConstants.PexMeStorageDirectory, pmd.AssemblyName + ".dynamic.fieldAccess.txt");
                using (StreamWriter sw = new StreamWriter(fieldAccessFileName))
                {
                    foreach (var fieldEntry in fieldDic.Values)
                    {
                        //Printing write methods
                        sw.WriteLine("Fieldname: " + fieldEntry.FieldName);
                        sw.WriteLine("Write methods: ");
                        foreach (var writeMethodSet in fieldEntry.WriteMethods.Values)
                        {
                            foreach (var writeMethod in writeMethodSet)
                            {
                                sw.WriteLine("\tMethod: " + writeMethod + ", ModificationType: " + FieldStore.GetModificationType(fieldEntry, writeMethod)
                                             + " PreciseModificationType: " + FieldStore.GetPreciseModificationType(fieldEntry, writeMethod));
                            }
                        }

                        sw.WriteLine("Field values: ");
                        foreach (var fieldValue in fieldEntry.FieldValues)
                        {
                            sw.WriteLine("\tValue: " + fieldValue);
                        }

                        //TODO: Print read methods
                    }
                }
            }

            //Writing uncovered code locations information
            var uncoveredCLDic      = pmd.UncoveredLocationDictionary;
            var uncoveredCLFileName = Path.Combine(PexMeConstants.PexMeStorageDirectory, pmd.AssemblyName + ".uncoveredloc.txt");

            using (StreamWriter sw = new StreamWriter(uncoveredCLFileName))
            {
                foreach (var ucstorelist in uncoveredCLDic.Values)
                {
                    var ucstore = ucstorelist.StoreList[0];
                    sw.WriteLine("CodeLocation: " + ucstore.Location);
                    sw.WriteLine("Relevant Fields: ");
                    //Writing associated fields
                    foreach (var field in ucstore.AllFields)
                    {
                        sw.WriteLine("\t" + field);
                    }

                    sw.WriteLine("Code Locations and Associated conditions: ");
                    sw.WriteLine("==========================================");
                    //Writing associated terms
                    foreach (var term in ucstore.TextualTerms)
                    {
                        sw.WriteLine(term);
                    }
                    sw.WriteLine("==========================================");

                    sw.WriteLine("Suggested target method for covering the branch location: ");
                    sw.WriteLine("==========================================================");
                    sw.WriteLine(ucstore.SuggestedMethodsforFactory);
                    sw.WriteLine("==========================================================");
                }

                sw.WriteLine("Generted factory methods for this type: ");
                sw.WriteLine("========================================");
                foreach (var facMethodList in pmd.PexGeneratedFactories.Values)
                {
                    foreach (string factoryMethod in facMethodList)
                    {
                        sw.WriteLine(factoryMethod);
                    }
                }
            }

            //Dumping the contents of factory suggestion store
            var fssdebugstore = Path.Combine(PexMeConstants.PexMeStorageDirectory, pmd.AssemblyName + ".fssdebug.txt");

            using (StreamWriter sw = new StreamWriter(fssdebugstore))
            {
                foreach (var fss in pmd.FactorySuggestionsDictionary.Values)
                {
                    sw.WriteLine("==================================================");
                    sw.WriteLine("Records of explorable type: \"" + fss.DeclaringType + "\"");
                    foreach (var codelockey in fss.locationStoreSpecificSequences.Keys)
                    {
                        sw.WriteLine("Key: \"" + codelockey + "\"");
                        var pucls = fss.locationStoreSpecificSequences[codelockey];
                        sw.WriteLine("Dormant status: " + pucls.IsDormat());
                        if (pucls.IsDormat())
                        {
                            sw.WriteLine("Associated PUT: " + pucls.AssociatedPUTName);
                        }
                        sw.WriteLine("Suggested Sequences........");
                        foreach (var seq in pucls.SuggestedMethodSequences)
                        {
                            sw.WriteLine(seq);
                            sw.WriteLine();
                        }
                    }

                    sw.WriteLine("==================================================");
                    sw.WriteLine("Final suggested sequences");
                    foreach (var mkey in fss.FinalSuggestedMethodSequences.Keys)
                    {
                        sw.WriteLine("Suggested sequences for the method " + mkey + ":");
                        var value = fss.FinalSuggestedMethodSequences[mkey];
                        sw.WriteLine(value.ToString());
                        sw.WriteLine();
                    }

                    sw.WriteLine("==================================================");
                    sw.WriteLine("PUT specific sequences");
                    foreach (var mkey in fss.FinalPUTSequences.Keys)
                    {
                        sw.WriteLine("Suggested sequences for the PUT " + mkey + ":");
                        var value = fss.FinalPUTSequences[mkey];
                        sw.WriteLine(value.ToString());
                        sw.WriteLine();
                    }

                    sw.WriteLine("==================================================");
                    sw.WriteLine("Defect detecting sequences");
                    foreach (var seq in fss.DefectDetectingSequences)
                    {
                        sw.WriteLine(seq);
                    }

                    sw.WriteLine("==================================================");
                    sw.WriteLine("All given up locations (Permanent)");
                    foreach (var loc in fss.PermanentFailedUncoveredLocations)
                    {
                        sw.Write(loc.ToString());
                        if (fss.UncoveredSystemLibLocations.Contains(loc))
                        {
                            sw.Write(" ( SystemLib )");
                        }
                        sw.WriteLine();
                    }

                    sw.WriteLine("All given up locations (Temporary)");
                    foreach (var loc in fss.TemporaryFailedUncoveredLocations.Keys)
                    {
                        sw.WriteLine(loc.ToString() + ", Attempt: " + fss.TemporaryFailedUncoveredLocations[loc]);
                    }

                    sw.WriteLine("==================================================");
                    sw.WriteLine("All successful locations");
                    foreach (var loc in fss.SuccessfulCoveredLocations)
                    {
                        sw.WriteLine(loc.ToString());
                    }
                }
            }
            /******************** END OF DEBUGGING INFO ***********************/
        }