Esempio n. 1
0
        public static TestStatistics TestBSP(TestJob job, LoadedBSP bsp, string temporaryDirectory)
        {
            TestStatistics stats = new TestStatistics();

            Directory.CreateDirectory(temporaryDirectory);
            using (var r = new TestResultLogger(Path.Combine(temporaryDirectory, "bsptest.log")))
            {
                LoadedBSP.LoadedMCU[] MCUs;
                if (job.DeviceRegex == null)
                {
                    MCUs = bsp.MCUs.ToArray();
                }
                else
                {
                    var rgFilter = new Regex(job.DeviceRegex);
                    MCUs = bsp.MCUs.Where(mcu => rgFilter.IsMatch(mcu.ExpandedMCU.ID)).ToArray();
                }

                if (job.SkippedDeviceRegex != null)
                {
                    var rg = new Regex(job.SkippedDeviceRegex);
                    MCUs = MCUs.Where(mcu => !rg.IsMatch(mcu.ExpandedMCU.ID)).ToArray();
                }

                var loadedRules   = job.RegisterRenamingRules?.Select(rule => new LoadedRenamingRule(rule))?.ToArray();
                var noValidateReg = job.NonValidatedRegisters;

                foreach (var sample in job.Samples)
                {
                    r.BeginSample(sample.Name);
                    int cnt = 0, failed = 0, succeeded = 0;

                    var effectiveMCUs = MCUs;
                    if (!string.IsNullOrEmpty(sample.DeviceRegex))
                    {
                        Regex rgDevice = new Regex(sample.DeviceRegex);
                        effectiveMCUs = MCUs.Where(mcu => rgDevice.IsMatch(mcu.ExpandedMCU.ID)).ToArray();
                    }

                    if (sample.Name == "ValidateGenerateFramwoks")
                    {
                        var sampleFramwork = XmlTools.LoadObject <EmbeddedProjectSample>(Path.Combine(job.BSPPath, "FramworkSamples", "sample.xml"));
                        LoadedBSP.LoadedSample sampleObj1 = new LoadedBSP.LoadedSample()
                        {
                            Sample = sampleFramwork
                        };
                        effectiveMCUs[0].BSP.Samples.Add(sampleObj1);
                        effectiveMCUs[0].BSP.Samples[effectiveMCUs[0].BSP.Samples.Count - 1].Directory = effectiveMCUs[0].BSP.Samples[effectiveMCUs[0].BSP.Samples.Count - 2].Directory.Remove(effectiveMCUs[0].BSP.Samples[effectiveMCUs[0].BSP.Samples.Count - 2].Directory.LastIndexOf("samples")) + "FramworkSamples";
                    }

                    foreach (var mcu in effectiveMCUs)
                    {
                        if (string.IsNullOrEmpty(mcu.ExpandedMCU.ID))
                        {
                            throw new Exception("Invalid MCU ID!");
                        }

                        var extraParams = job.DeviceParameterSets?.FirstOrDefault(s => s.DeviceRegexObject?.IsMatch(mcu.ExpandedMCU.ID) == true);

                        string   mcuDir = Path.Combine(temporaryDirectory, mcu.ExpandedMCU.ID);
                        DateTime start  = DateTime.Now;

                        var result = TestMCU(mcu, mcuDir + sample.TestDirSuffix, sample, extraParams, loadedRules, noValidateReg, job.UndefinedMacros);
                        Console.WriteLine($"[{(DateTime.Now - start).TotalMilliseconds:f0} msec]");
                        if (result.Result == TestBuildResult.Failed)
                        {
                            failed++;
                        }
                        else if (result.Result == TestBuildResult.Succeeded)
                        {
                            succeeded++;
                        }

                        r.LogTestResult(mcu.ExpandedMCU.ID, result);

                        cnt++;
                        Console.WriteLine("{0}: {1}% done ({2}/{3} devices, {4} failed)", sample.Name, (cnt * 100) / effectiveMCUs.Length, cnt, effectiveMCUs.Length, failed);
                    }

                    if ((succeeded + failed) == 0)
                    {
                        throw new Exception("Not a single MCU supports " + sample.Name);
                    }
                    r.EndSample();

                    stats.Passed += succeeded;
                    stats.Failed += failed;
                }
            }
            return(stats);
        }
Esempio n. 2
0
        private List <ConfigurationFixDatabase.SecondaryObjectEntry> ComputeSymbolToFileMap(BSPReportWriter reportWriter)
        {
            var result = new HashSet <ConfigurationFixDatabase.SecondaryObjectEntry>();

            if (_ReverseConditionTable.ConfigurationFixSamples == null)
            {
                return(result.ToList());
            }

            Dictionary <string, bool> fileBuildStatus = new Dictionary <string, bool>();

            foreach (var sample in _ReverseConditionTable.ConfigurationFixSamples)
            {
                var sampleDir = GetFullPath(sample.SamplePath);

                LoadedBSP.LoadedSample sampleObj = new LoadedBSP.LoadedSample
                {
                    BSP       = _BSP,
                    Directory = sampleDir,
                    Sample    = XmlTools.LoadObject <EmbeddedProjectSample>(Path.Combine(sampleDir, "sample.xml"))
                };

                var        mcu   = _BSP.MCUs.First(m => m.ExpandedMCU.ID == sample.MCUID);
                List <int> queue = Enumerable.Range(0, _ReverseConditionTable.FileTable.Count).ToList();

                while (queue.Count > 0)
                {
                    Console.WriteLine($"Analyzing {sampleObj.Sample.Name} ({result.Count} symbols mapped, {queue.Count} files left)...");
                    List <int> rejects           = new List <int>();
                    List <int> handledFiles      = new List <int>();
                    ConstructedConfiguration cfg = new ConstructedConfiguration(_ReverseConditionTable);

                    foreach (var i in queue)
                    {
                        var    file = _ReverseConditionTable.FileTable[i];
                        string ext  = Path.GetExtension(file.ObjectName).ToLower();
                        if (ext != ".c" && ext != ".cpp")
                        {
                            continue;
                        }

                        if (cfg.TryMerge(file))
                        {
                            handledFiles.Add(i);
                        }
                        else
                        {
                            rejects.Add(i);
                        }
                    }

                    var buildResult = Program.TestSingleSample(sampleObj, mcu, _TestDirectory, cfg.ToSampleJobObject(), null, null, BSPValidationFlags.KeepDirectoryAfterSuccessfulTest | BSPValidationFlags.ContinuePastCompilationErrors);
                    BuildSymbolTableFromBuildResults(handledFiles, result, fileBuildStatus);

                    if (rejects.Count == queue.Count)
                    {
                        break;
                    }

                    queue = rejects;
                }
            }

            foreach (var kv in fileBuildStatus)
            {
                if (!kv.Value)
                {
                    reportWriter.ReportMergeableMessage(BSPReportWriter.MessageSeverity.Warning, "Could not obtain symbol list provided by the following files", kv.Key, false);
                }
            }

            return(result.ToList());
        }
Esempio n. 3
0
        public static TestResult TestSingleSample(LoadedBSP.LoadedSample sampleObj,
                                                  LoadedBSP.LoadedMCU mcu,
                                                  string testDirectory,
                                                  TestedSample sample,
                                                  DeviceParameterSet extraParameters,
                                                  RegisterValidationParameters registerValidationParameters,
                                                  BSPValidationFlags validationFlags = BSPValidationFlags.None)
        {
            CreateEmptyDirectoryForTestingMCU(testDirectory);

            var configuredMCU = new LoadedBSP.ConfiguredMCU(mcu, GetDefaultPropertyValues(mcu.ExpandedMCU.ConfigurableProperties));

            if (configuredMCU.ExpandedMCU.FLASHSize == 0)
            {
                configuredMCU.Configuration["com.sysprogs.bspoptions.primary_memory"] = "sram";
            }

            var configuredSample = new ConfiguredSample
            {
                Sample     = sampleObj,
                Parameters = GetDefaultPropertyValues(sampleObj.Sample.ConfigurableProperties),
                Frameworks = (sampleObj.Sample.RequiredFrameworks == null) ? null :
                             sampleObj.Sample.RequiredFrameworks.Select(fwId =>
                {
                    return(configuredMCU.BSP.BSP.Frameworks.First(fwO => fwO.ID == fwId || fwO.ClassID == fwId && fwO.IsCompatibleWithMCU(configuredMCU.ExpandedMCU.ID)));
                }).ToList(),
                FrameworkParameters = new Dictionary <string, string>(),
            };

            ApplyConfiguration(configuredMCU.Configuration, extraParameters?.MCUConfiguration, sample.MCUConfiguration);

            var bspDict = configuredMCU.BuildSystemDictionary(default(SystemDirectories));

            bspDict["PROJECTNAME"] = "test";

            if (configuredSample.Frameworks != null)
            {
                foreach (var fw in configuredSample.Frameworks)
                {
                    if (fw.AdditionalSystemVars != null)
                    {
                        foreach (var kv in fw.AdditionalSystemVars)
                        {
                            bspDict[kv.Key] = kv.Value;
                        }
                    }
                    if (fw.ConfigurableProperties != null)
                    {
                        var defaultFwConfig = GetDefaultPropertyValues(fw.ConfigurableProperties);
                        if (defaultFwConfig != null)
                        {
                            foreach (var kv in defaultFwConfig)
                            {
                                configuredSample.FrameworkParameters[kv.Key] = kv.Value;
                            }
                        }
                    }
                }
            }

            if (sampleObj.Sample?.DefaultConfiguration?.Entries != null)
            {
                foreach (var kv in sampleObj.Sample.DefaultConfiguration.Entries)
                {
                    configuredSample.FrameworkParameters[kv.Key] = kv.Value;
                }
            }

            ApplyConfiguration(configuredSample.FrameworkParameters, extraParameters?.FrameworkConfiguration, sample.FrameworkConfiguration);
            ApplyConfiguration(configuredSample.Parameters, extraParameters?.SampleConfiguration, sample.SampleConfiguration);

            Dictionary <string, bool> frameworkIDs = new Dictionary <string, bool>();

            foreach (var fw in sampleObj.Sample.RequiredFrameworks ?? new string[0])
            {
                frameworkIDs[fw] = true;
            }
            foreach (var fw in sample.AdditionalFrameworks ?? new string[0])
            {
                frameworkIDs[fw] = true;
            }

            var prj = new GeneratedProject(testDirectory, configuredMCU, frameworkIDs.Keys.ToArray())
            {
                DataSections = sample.DataSections
            };

            prj.DoGenerateProjectFromEmbeddedSample(configuredSample, false, bspDict);

            prj.AddBSPFilesToProject(bspDict, configuredSample.FrameworkParameters, frameworkIDs);
            var flags = prj.GetToolFlags(bspDict, configuredSample.FrameworkParameters, frameworkIDs);

            //  if(sampleObj.Sample.LinkerScript!=null)
            //     flags.LinkerScript = sampleObj.Sample.LinkerScript;

            if (!string.IsNullOrEmpty(configuredSample.Sample.Sample.LinkerScript))
            {
                flags.LinkerScript = VariableHelper.ExpandVariables(configuredSample.Sample.Sample.LinkerScript, bspDict, configuredSample.FrameworkParameters);
            }

            if (!string.IsNullOrEmpty(configuredSample.Sample.Sample.CLanguageStandard))
            {
                flags.CFLAGS += $" -std={configuredSample.Sample.Sample.CLanguageStandard}";
            }
            if (!string.IsNullOrEmpty(configuredSample.Sample.Sample.CPPLanguageStandard))
            {
                flags.CXXFLAGS += $" -std={configuredSample.Sample.Sample.CPPLanguageStandard}";
            }

            flags.COMMONFLAGS += " -save-temps ";
            Dictionary <string, bool> sourceExtensions = new Dictionary <string, bool>(StringComparer.InvariantCultureIgnoreCase);

            foreach (var ext in sample.SourceFileExtensions.Split(';'))
            {
                sourceExtensions[ext] = true;
            }

            Console.WriteLine("Building {0}...", Path.GetFileName(testDirectory));
            return(BuildAndRunValidationJob(mcu, testDirectory, prj, flags, sourceExtensions, null, sample.ValidateRegisters ? registerValidationParameters : null, validationFlags));
        }