Index: experimental/visual_studio_plugin/src/NaClVsx.Package/NaClVsx.Package_UnitTestProject/SymbolDatabaseTest.cs |
diff --git a/experimental/visual_studio_plugin/src/NaClVsx.Package/NaClVsx.Package_UnitTestProject/SymbolDatabaseTest.cs b/experimental/visual_studio_plugin/src/NaClVsx.Package/NaClVsx.Package_UnitTestProject/SymbolDatabaseTest.cs |
deleted file mode 100644 |
index 8d6486945cb1a1ec87980c7d292037734ffa27a8..0000000000000000000000000000000000000000 |
--- a/experimental/visual_studio_plugin/src/NaClVsx.Package/NaClVsx.Package_UnitTestProject/SymbolDatabaseTest.cs |
+++ /dev/null |
@@ -1,747 +0,0 @@ |
-// Copyright (c) 2011 The Native Client Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#region |
- |
-using System; |
-using System.Collections.Generic; |
-using System.Linq; |
-using Google.NaClVsx.DebugSupport.DWARF; |
-using Microsoft.VisualStudio.TestTools.UnitTesting; |
- |
-#endregion |
- |
-namespace NaClVsx.Package_UnitTestProject { |
- ///<summary> |
- /// This is a test class for SymbolDatabaseTest and is intended to contain all |
- /// SymbolDatabaseTest Unit Tests. Note that it is not possible to build these tests on a |
- /// compiled nexe, like the NaClSymbolProvider test suite because these all deal in |
- /// addresses and we can't predict how address information might change on a recompilation |
- /// of loop.cc or a change in the toolchain. |
- /// In order to make this test stable, all the addresses and constants in the test are made |
- /// up to test particular characteristics of the SymbolDatabase without interfering with each |
- /// other. When modifying these tests, care must be taken to choose offsets and values that |
- /// are not already in use. |
- ///</summary> |
- [TestClass] |
- public class SymbolDatabaseTest { |
- ///<summary> |
- /// Gets or sets the test context which provides information about and functionality for the |
- /// current test run. |
- ///</summary> |
- public TestContext TestContext { get; set; } |
- |
- #region Additional test attributes |
- |
- //Use TestInitialize to run code before running each test |
- [TestInitialize] |
- public void MyTestInitialize() { |
- target_ = null; |
- } |
- |
- #endregion |
- |
- ///<summary> |
- /// A test for SourceFilesByFilename |
- ///</summary> |
- [TestMethod] |
- public void SourceFilesByFilenameTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestFiles(); |
- target_.BuildIndices(); |
- Assert.AreEqual(3, target_.SourceFilesByFilename.Count); |
- // File names are not enough to disambiguate between files. Path should |
- // be considered as well. Once that is the case, the count below should |
- // be 2, not 3. |
- var fileEntries = target_.SourceFilesByFilename[kRecurringName]; |
- Assert.AreEqual(3, fileEntries.Count); |
- } |
- |
- ///<summary> |
- /// A test for ScopeTransitions |
- ///</summary> |
- [TestMethod] |
- public void ScopeTransitionsTest() { |
- SymbolDatabaseConstructorTest(); |
- var scopeTransition = new SymbolDatabase.ScopeTransition { |
- Address = 123456, |
- Entry = null |
- }; |
- TestDictionaryAccessor( |
- scopeTransition.Address, |
- scopeTransition, |
- "ScopeTransitions"); |
- } |
- |
- ///<summary> |
- /// A test for LocLists |
- ///</summary> |
- [TestMethod] |
- public void LocListsTest() { |
- SymbolDatabaseConstructorTest(); |
- var locListEntry = new SymbolDatabase.LocListEntry { |
- Data = null, |
- StartAddress = 123456, |
- EndAddress = 234567 |
- }; |
- var locList = new List<SymbolDatabase.LocListEntry> {locListEntry}; |
- TestDictionaryAccessor(locListEntry.StartAddress, locList, "LocLists"); |
- } |
- |
- /// <summary> |
- /// A simple test for the RangeLists accessor. |
- /// </summary> |
- [TestMethod] |
- public void RangeListsTest() { |
- SymbolDatabaseConstructorTest(); |
- var rangeListEntry = new RangeListEntry { |
- BaseAddress = 123456, |
- HighPC = 456, |
- LowPC = 123, |
- Offset = 12 |
- }; |
- var rangeList = new Dictionary<ulong, RangeListEntry> {{123, rangeListEntry}}; |
- TestDictionaryAccessor(rangeListEntry.Offset, rangeList, "RangeLists"); |
- } |
- |
- /// <summary> |
- /// A simple test of the RangeListsByDIE accessor. |
- /// </summary> |
- [TestMethod] |
- public void RangeListsByDIETest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestDIEs(); |
- AddTestAttributes(); |
- AddTestRangeLists(); |
- AddTestScopeTransitions(); |
- target_.BuildIndices(); |
- Assert.AreEqual(2, target_.RangeListsByDIE.Count); |
- } |
- |
- ///<summary> |
- /// A test for LocationsByFile |
- ///</summary> |
- [TestMethod] |
- public void LocationsByFileTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestLocations(); |
- // If you add locations to the DB, you also need to add scope transitions |
- // or BuildIndices will fail. |
- AddTestScopeTransitions(); |
- target_.BuildIndices(); |
- Assert.AreEqual(2, target_.LocationsByFile.Count); |
- var locationEntries = target_.LocationsByFile[kRecurringLocationKey]; |
- Assert.AreEqual(3, locationEntries.Count); |
- } |
- |
- ///<summary> |
- /// A test for Locations |
- ///</summary> |
- [TestMethod] |
- public void LocationsTest() { |
- SymbolDatabaseConstructorTest(); |
- var location = new SymbolDatabase.SourceLocation { |
- StartAddress = 123456, |
- Length = 1, |
- SourceFileKey = 2, |
- Line = 3, |
- Column = 4 |
- }; |
- TestDictionaryAccessor(location.StartAddress, location, "Locations"); |
- } |
- |
- ///<summary> |
- /// A test for Files |
- ///</summary> |
- [TestMethod] |
- public void FilesTest() { |
- SymbolDatabaseConstructorTest(); |
- var file = new SymbolDatabase.SourceFile { |
- Key = 1, |
- Filename = "name", |
- RelativePath = "/path", |
- CurrentAbsolutePath = "drive:/long/path" |
- }; |
- TestDictionaryAccessor(file.Key, file, "Files"); |
- } |
- |
- ///<summary> |
- /// A test for EntriesByParent |
- ///</summary> |
- [TestMethod] |
- public void EntriesByParentTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestDIEs(); |
- target_.BuildIndices(); |
- Assert.AreEqual(4, target_.EntriesByParent.Count); |
- var childEntries = target_.EntriesByParent[parentDIE_.Key]; |
- Assert.AreEqual(9, childEntries.Count); |
- } |
- |
- ///<summary> |
- /// A test for Entries |
- ///</summary> |
- [TestMethod] |
- public void EntriesTest() { |
- SymbolDatabaseConstructorTest(); |
- var entry = new DebugInfoEntry { |
- Key = 1, |
- OuterScope = null, |
- ParentKey = 0, |
- Tag = DwarfTag.DW_TAG_with_stmt |
- }; |
- TestDictionaryAccessor(entry.Key, entry, "Entries"); |
- } |
- |
- ///<summary> |
- /// A test for CallFrames |
- ///</summary> |
- [TestMethod] |
- public void CallFramesTest() { |
- SymbolDatabaseConstructorTest(); |
- var callFrame = new SymbolDatabase.CallFrame { |
- Address = 123456, |
- }; |
- TestDictionaryAccessor(callFrame.Address, callFrame, "CallFrames"); |
- } |
- |
- ///<summary> |
- /// A test for Attributes. Simple test to ensure we can modify attributes. |
- ///</summary> |
- [TestMethod] |
- public void AttributesTest() { |
- SymbolDatabaseConstructorTest(); |
- var attribute = new SymbolDatabase.DebugInfoAttribute { |
- Key = 1, |
- ParentKey = 1, |
- Tag = DwarfAttribute.DW_AT_trampoline, |
- Value = null |
- }; |
- TestDictionaryAccessor(1, attribute, "Attributes"); |
- } |
- |
- /// <summary> |
- /// A test for GetScopeAddress |
- /// </summary> |
- [TestMethod] |
- public void GetScopeAddressTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestScopeTransitions(); |
- target_.BuildIndices(); |
- // A small offset is added here to make sure that the function will find the address for |
- // our scope, even if it does not fall on an exact scope entry point. |
- var scopeAddress = target_.GetScopeAddress(kRecurringScopeKey + 5); |
- Assert.AreEqual(kEncapsulatingScopeAddress, scopeAddress); |
- } |
- |
- ///<summary> |
- /// A test for GetScopeForAddress |
- ///</summary> |
- [TestMethod] |
- public void GetScopeForAddressTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestScopeTransitions(); |
- target_.BuildIndices(); |
- // A small offset is added here to make sure that the function will find the address for |
- // our scope, even if it does not fall on an exact scope entry point. |
- var scopeForAddress = target_.GetScopeForAddress(kRecurringScopeKey + 5); |
- Assert.AreEqual( |
- kEncapsulatingScopeAddress, |
- scopeForAddress.Attributes[DwarfAttribute.DW_AT_low_pc]); |
- } |
- |
- ///<summary> |
- /// A test for GetLocationsByLine |
- ///</summary> |
- [TestMethod] |
- public void GetLocationsByLineTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestDIEs(); |
- AddTestLocations(); |
- AddTestScopeTransitions(); |
- target_.BuildIndices(); |
- var sourceLocationsForScope = target_.GetLocationsByLine(parentDIE_, 0); |
- Assert.AreEqual(4, sourceLocationsForScope.Count()); |
- } |
- |
- [TestMethod] |
- public void GetRangeForAddressTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestDIEs(); |
- AddTestAttributes(); |
- AddTestLocations(); |
- AddTestRangeLists(); |
- AddTestScopeTransitions(); |
- |
- target_.BuildIndices(); |
- var testAddress = kFirstRangeListLowPC + firstRangeListEntry_.BaseAddress; |
- // A small offset is added here to make sure that the function will find the address for |
- // our scope, even if it does not fall on an exact scope entry point. |
- var result = target_.GetRangeForAddress( |
- testAddress + 4, rangeListDie0_); |
- Assert.IsNotNull(result); |
- Assert.AreEqual(kFirstRangeListLowPC, result.LowPC); |
- } |
- |
- /// <summary> |
- /// This test checks to ensure that the GetLocationsByLine function |
- /// works for DIEs with ranges instead of loclists. |
- /// </summary> |
- [TestMethod] |
- public void GetLocationsByLineRangesTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestDIEs(); |
- AddTestAttributes(); |
- AddTestLocations(); |
- AddTestRangeLists(); |
- AddTestScopeTransitions(); |
- |
- target_.BuildIndices(); |
- var rangeListBaseAddress = target_.RangeLists[0][kFirstRangeListLowPC].BaseAddress + |
- kFirstRangeListLowPC; |
- var sourceLocationsForScope = target_.GetLocationsByLine |
- (rangeListDie0_, rangeListBaseAddress); |
- Assert.AreEqual(2, sourceLocationsForScope.Count()); |
- } |
- |
- ///<summary> |
- /// A test for GetLocationForAddress |
- ///</summary> |
- [TestMethod] |
- public void GetLocationForAddressTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestLocations(); |
- // If you add locations to the DB, you also need to add scope transitions |
- // or BuildIndices will fail. |
- AddTestScopeTransitions(); |
- target_.BuildIndices(); |
- var locationForAddress = |
- target_.GetLocationForAddress(kRecurringLocationKey + 5); |
- Assert.AreEqual(kRecurringLocationKey, locationForAddress.StartAddress); |
- } |
- |
- /// <summary> |
- /// A test for GetChildrenForEntry |
- /// </summary> |
- [TestMethod] |
- public void GetChildrenForEntryTest() { |
- SymbolDatabaseConstructorTest(); |
- AddTestDIEs(); |
- target_.BuildIndices(); |
- var children = target_.GetChildrenForEntry(parentDIE_.Key); |
- Assert.AreEqual(9, children.Count()); |
- } |
- |
- /// <summary> |
- /// A test for GetCallFrameForAddress |
- /// </summary> |
- [TestMethod] |
- public void GetCallFrameForAddressTest() { |
- SymbolDatabaseConstructorTest(); |
- var callFrameKeys = new List<ulong> { |
- kRecurringCallFrameKey, |
- kHigherRecurringCallFrameKey, |
- 1000 |
- }; |
- |
- AddTestCallFrames(callFrameKeys); |
- |
- target_.BuildIndices(); |
- |
- var frameForAddress = target_.GetCallFrameForAddress(5); |
- Assert.AreEqual(kRecurringCallFrameKey, frameForAddress.Address); |
- frameForAddress = target_.GetCallFrameForAddress(50); |
- Assert.AreEqual(kHigherRecurringCallFrameKey, frameForAddress.Address); |
- } |
- |
- ///<summary> |
- /// A test for BuildIndices, This test makes some fairly simple |
- /// collections and then validates that BuildIndices creates the |
- /// expected associations between them. |
- ///</summary> |
- [TestMethod] |
- public void BuildIndicesTest() { |
- SymbolDatabaseConstructorTest(); |
- |
- AddTestDIEs(); |
- AddTestFiles(); |
- AddTestAttributes(); |
- AddTestLocations(); |
- AddTestRangeLists(); |
- AddTestScopeTransitions(); |
- var callFrameKeys = new List<ulong> { |
- kRecurringCallFrameKey, |
- kHigherRecurringCallFrameKey, |
- 1000 |
- }; |
- |
- AddTestCallFrames(callFrameKeys); |
- |
- target_.BuildIndices(); |
- ValidateIndices(); |
- } |
- |
- /// <summary> |
- /// A test for SymbolDatabase Constructor. It creates a sample database |
- /// loading loop.nexe. |
- /// </summary> |
- [TestMethod] |
- public void SymbolDatabaseConstructorTest() { |
- if (null == target_) { |
- target_ = new SymbolDatabase(); |
- } |
- |
- Assert.IsNotNull(target_); |
- } |
- |
- // Constants that are used in more than one place for validation purposes |
- // are declared here. |
- |
- #region Private Implementation |
- |
- const ulong kEncapsulatingScopeAddress = 123400; |
- const ulong kFirstRangeListLowPC = 10; |
- const ulong kHigherRecurringCallFrameKey = 10; |
- const ulong kRecurringCallFrameKey = 1; |
- const uint kRecurringLocationKey = 123456; |
- const string kRecurringName = "name_1"; |
- const ulong kRecurringScopeKey = 123450; |
- |
- #endregion |
- |
- #region Private Implementation |
- |
- private readonly RangeListEntry firstRangeListEntry_ = new RangeListEntry { |
- BaseAddress = 123456, |
- HighPC = 20, |
- LowPC = kFirstRangeListLowPC, |
- Offset = 0 |
- }; |
- |
- private readonly DebugInfoEntry parentDIE_ = GenerateDIE( |
- 290, null, 279, DwarfTag.DW_TAG_compile_unit); |
- |
- private readonly DebugInfoEntry rangeListDie0_ = GenerateDIE( |
- 400, null, 290, DwarfTag.DW_TAG_lexical_block); |
- |
- private readonly DebugInfoEntry rangeListDie1_ = GenerateDIE( |
- 420, null, 290, DwarfTag.DW_TAG_lexical_block); |
- |
- private SymbolDatabase target_; |
- |
- #endregion |
- |
- #region Private Implementation |
- |
- /// <summary> |
- /// Simple wrapper for creating a DebugInfoAttribute since the type lacks |
- /// a constructor. |
- /// </summary> |
- /// <param name = "key">A unique integer ID.</param> |
- /// <param name = "parentKey">The parent's ID.</param> |
- /// <param name = "tag">The tag, describing the purpose of the attribute. |
- /// </param> |
- /// <param name = "value">The attribute's value.</param> |
- /// <returns>An instance of a DebugInfoAttribute</returns> |
- private static SymbolDatabase.DebugInfoAttribute GenerateAttribute( |
- ulong key, |
- ulong parentKey, |
- DwarfAttribute tag, |
- Object value) { |
- return new SymbolDatabase.DebugInfoAttribute { |
- Key = key, |
- ParentKey = parentKey, |
- Tag = tag, |
- Value = value |
- }; |
- } |
- |
- /// <summary> |
- /// Simple wrapper for creating a CallFrame since the type lacks a |
- /// constructor. |
- /// </summary> |
- /// <param name = "address">The CallFrame's address.</param> |
- /// <param name = "rules">The rules for generating a CallFrame on the current |
- /// platform.</param> |
- /// <returns>An instance of a CallFrame.</returns> |
- private static SymbolDatabase.CallFrame GenerateCallFrame( |
- ulong address, |
- List<SymbolDatabase.CallFrame.Rule> rules) { |
- return new SymbolDatabase.CallFrame { |
- Address = address, |
- Rules = rules |
- }; |
- } |
- |
- /// <summary> |
- /// Simple wrapper for creating a debug info entry since the aforementioned |
- /// lacks a constructor. |
- /// </summary> |
- /// <returns>An instance of a debug info entry.</returns> |
- private static DebugInfoEntry GenerateDIE( |
- ulong key, |
- DebugInfoEntry scope, |
- ulong parentKey, |
- DwarfTag tag) { |
- return new DebugInfoEntry { |
- Key = key, |
- OuterScope = scope, |
- ParentKey = parentKey, |
- Tag = tag |
- }; |
- } |
- |
- /// <summary> |
- /// Simple wrapper for creating a SourceLocation since the type lacks a |
- /// constructor. |
- /// </summary> |
- /// <param name = "column">Column in the source file.</param> |
- /// <param name = "length">Length of the thing being referenced in |
- /// number of characters.</param> |
- /// <param name = "line">The line the file entry is on.</param> |
- /// <param name = "sourceFileKey">The unique ID of the file.</param> |
- /// <param name = "startAddress">The address in memory associated with the |
- /// source location</param> |
- /// <returns></returns> |
- private static SymbolDatabase.SourceLocation GenerateLocation( |
- uint column, |
- ulong length, |
- uint line, |
- ulong sourceFileKey, |
- ulong startAddress) { |
- return new SymbolDatabase.SourceLocation { |
- Column = column, |
- Length = length, |
- Line = line, |
- SourceFileKey = sourceFileKey, |
- StartAddress = startAddress |
- }; |
- } |
- |
- /// <summary> |
- /// Simple wrapper for creating a ScopeTransition since the type lacks a |
- /// constructor. |
- /// </summary> |
- /// <param name = "address">The address in memory associated with the scope |
- /// transition</param> |
- /// <param name = "entry">The debug information entry that describes the |
- /// scope transition.</param> |
- /// <returns></returns> |
- private static SymbolDatabase.ScopeTransition GenerateScopeTransition( |
- ulong address, |
- DebugInfoEntry entry) { |
- return new SymbolDatabase.ScopeTransition { |
- Address = address, |
- Entry = entry |
- }; |
- } |
- |
- |
- /// <summary> |
- /// Simple wrapper for creating a file entry since the type lacks a |
- /// constructor. |
- /// </summary> |
- /// <param name = "path">The path.</param> |
- /// <param name = "fileName">The file name.</param> |
- /// <param name = "key">The key.</param> |
- /// <param name = "relativePath">The relative path.</param> |
- /// <returns>An instance of a file entry</returns> |
- private static SymbolDatabase.SourceFile GenerateSourceFile( |
- string path, |
- string fileName, |
- ulong key, |
- string relativePath) { |
- return new SymbolDatabase.SourceFile { |
- CurrentAbsolutePath = path, |
- Filename = fileName, |
- Key = key, |
- RelativePath = relativePath |
- }; |
- } |
- |
- /// <summary> |
- /// Validates an individual index to ensure that it is not empty. Used to |
- /// ensure that BuildIndices() created all the secondary indices that it |
- /// was supposed to create. |
- /// </summary> |
- /// <typeparam name = "TValueType"></typeparam> |
- /// <param name = "index"></param> |
- private static void ValidateIndex<TValueType>(IEnumerable<TValueType> index) { |
- Assert.IsNotNull(index); |
- Assert.AreNotEqual(0, index.Count()); |
- } |
- |
- /// <summary> |
- /// Populates the "Attributes" list on the target_ SymbolDatabase. |
- /// </summary> |
- private void AddTestAttributes() { |
- // Here we expect BuildIndices to build 4 lists of attributes grouped |
- // by DwarfAttribute and 3 lists of attributes grouped by Parent Key. |
- var attributeList = new List<SymbolDatabase.DebugInfoAttribute> { |
- GenerateAttribute(1, 0, DwarfAttribute.DW_AT_start_scope, null), |
- GenerateAttribute(2, 1, DwarfAttribute.DW_AT_stmt_list, null), |
- GenerateAttribute(3, 1, DwarfAttribute.DW_AT_low_pc, null), |
- GenerateAttribute(4, 1, DwarfAttribute.DW_AT_high_pc, null), |
- GenerateAttribute(5, 0, DwarfAttribute.DW_AT_start_scope, null), |
- GenerateAttribute(6, 5, DwarfAttribute.DW_AT_low_pc, null), |
- GenerateAttribute(7, 5, DwarfAttribute.DW_AT_high_pc, null), |
- GenerateAttribute(8, rangeListDie0_.Key, DwarfAttribute.DW_AT_ranges, (ulong) 0), |
- GenerateAttribute(9, rangeListDie1_.Key, DwarfAttribute.DW_AT_ranges, (ulong) 12) |
- }; |
- foreach (var attribute in attributeList) { |
- if (target_.Entries.ContainsKey(attribute.ParentKey)) { |
- target_.Entries[attribute.ParentKey].Attributes.Add(attribute.Tag, attribute.Value); |
- } |
- TestDictionaryAccessor(attribute.Key, attribute, "Attributes"); |
- } |
- } |
- |
- /// <summary> |
- /// Populates the "CallFrames" list on the target_ SymbolDatabase. |
- /// </summary> |
- private void AddTestCallFrames(IEnumerable<ulong> callFrameKeys) { |
- var callFrameList = |
- callFrameKeys.Select(key => GenerateCallFrame(key, null)).ToList(); |
- foreach (var frame in callFrameList) { |
- TestDictionaryAccessor(frame.Address, frame, "CallFrames"); |
- } |
- } |
- |
- /// <summary> |
- /// Populates the "Entries" list on the target_ SymbolDatabase. |
- /// </summary> |
- private void AddTestDIEs() { |
- // Add DIEs to be indexed by parent (these are a few values captured from a test run with a |
- // lot of output enabled.) The address values in this test are chosen to create a |
- // parent-child relationship between die 290 and all the DIE's that follow it. Like in real |
- // life, DIE address occur in ascending order. The specific numbers are unimportant. |
- var dieList = new List<DebugInfoEntry> { |
- GenerateDIE(11, null, 0, DwarfTag.DW_TAG_compile_unit), |
- GenerateDIE(155, null, 144, DwarfTag.DW_TAG_compile_unit), |
- parentDIE_, |
- GenerateDIE(324, parentDIE_, 290, DwarfTag.DW_TAG_base_type), |
- GenerateDIE(331, parentDIE_, 290, DwarfTag.DW_TAG_base_type), |
- GenerateDIE(334, parentDIE_, 290, DwarfTag.DW_TAG_pointer_type), |
- GenerateDIE(336, parentDIE_, 290, DwarfTag.DW_TAG_base_type), |
- GenerateDIE(343, parentDIE_, 290, DwarfTag.DW_TAG_base_type), |
- GenerateDIE(350, parentDIE_, 290, DwarfTag.DW_TAG_base_type), |
- GenerateDIE(357, parentDIE_, 290, DwarfTag.DW_TAG_base_type), |
- rangeListDie0_, |
- rangeListDie1_, |
- }; |
- foreach (var debugInfoEntry in dieList) { |
- TestDictionaryAccessor(debugInfoEntry.Key, debugInfoEntry, "Entries"); |
- } |
- } |
- |
- /// <summary> |
- /// Populates the "Files" list on the target_ SymbolDatabase. |
- /// </summary> |
- private void AddTestFiles() { |
- // Add Files to be indexed by filename. |
- // Filelist entries that are identical often ahve different IDs which is |
- // why buildIndices checks the file names. |
- // The last entry added illustrates that path is currently not |
- // disambiguated when files are stored. |
- var fileList = new List<SymbolDatabase.SourceFile> { |
- GenerateSourceFile("path/1/", kRecurringName, 1111, "."), |
- GenerateSourceFile("path/1/", "name_2", 1112, "."), |
- GenerateSourceFile("path/1/", "name_3", 1113, "."), |
- GenerateSourceFile("path/1/", kRecurringName, 1114, "."), |
- GenerateSourceFile("path/2/", kRecurringName, 1115, ".") |
- }; |
- foreach (var file in fileList) { |
- TestDictionaryAccessor(file.Key, file, "Files"); |
- } |
- } |
- |
- /// <summary> |
- /// Populates the "Locations" list on the target SymbolDatabase. |
- /// </summary> |
- private void AddTestLocations() { |
- var locationList = new List<SymbolDatabase.SourceLocation> { |
- GenerateLocation(1, 10, 1, kRecurringLocationKey, 123456), |
- GenerateLocation(12, 1, 1, kRecurringLocationKey, 123466), |
- GenerateLocation(13, 1, 1, kRecurringLocationKey, 123470), |
- GenerateLocation(1, 4, 2, 123457, 123654) |
- }; |
- foreach (var location in locationList) { |
- TestDictionaryAccessor(location.StartAddress, location, "Locations"); |
- } |
- } |
- |
- /// <summary> |
- /// Populates the "RangeLists" list on the target SymbolDatabase. |
- /// </summary> |
- private void AddTestRangeLists() { |
- var rangeList0 = new Dictionary<ulong, RangeListEntry> { |
- {kFirstRangeListLowPC, firstRangeListEntry_}, |
- {20, new RangeListEntry {BaseAddress = 123456, HighPC = 40, LowPC = 20, Offset = 0}}, |
- {40, new RangeListEntry {BaseAddress = 123456, HighPC = 80, LowPC = 40, Offset = 0}} |
- }; |
- var rangeList1 = new Dictionary<ulong, RangeListEntry> { |
- {81, new RangeListEntry {BaseAddress = 123456, HighPC = 102, LowPC = 81, Offset = 12}}, |
- {102, new RangeListEntry {BaseAddress = 123456, HighPC = 112, LowPC = 102, Offset = 12}}, |
- {112, new RangeListEntry {BaseAddress = 123456, HighPC = 132, LowPC = 112, Offset = 12}} |
- }; |
- TestDictionaryAccessor(0, rangeList0, "RangeLists"); |
- TestDictionaryAccessor(12, rangeList1, "RangeLists"); |
- } |
- |
- /// <summary> |
- /// Populates the "ScopeTransitions" list on the target SymbolDatabase. These are designed |
- /// to bracket the CodeLocations added by AddTestLocations. |
- /// </summary> |
- private void AddTestScopeTransitions() { |
- parentDIE_.Attributes.Add( |
- DwarfAttribute.DW_AT_low_pc, |
- kEncapsulatingScopeAddress); |
- var scopeTransitionList = new List<SymbolDatabase.ScopeTransition> { |
- GenerateScopeTransition(kEncapsulatingScopeAddress, parentDIE_), |
- GenerateScopeTransition( |
- 234567, |
- GenerateDIE(234567, null, 0, DwarfTag.DW_TAG_compile_unit)) |
- }; |
- foreach (var scopeTransition in scopeTransitionList) { |
- TestDictionaryAccessor( |
- scopeTransition.Address, |
- scopeTransition, |
- "ScopeTransitions"); |
- } |
- } |
- |
- /// <summary> |
- /// This function can be used to ensure that modifying the item returned |
- /// by a symbol database accessor actually changes the state of the |
- /// database. |
- /// </summary> |
- private void TestDictionaryAccessor<TEntryType>(ulong keyValue, |
- TEntryType testEntry, |
- String accessorName) { |
- // We use PrivateObject to get call by name semantics. |
- var privates = new PrivateObject(target_); |
- var dictionary = |
- privates.GetProperty(accessorName) as Dictionary<ulong, TEntryType>; |
- Assert.IsNotNull(dictionary); |
- var firstCount = dictionary.Count; |
- dictionary.Add(keyValue, testEntry); |
- var dictionaryRef2 = |
- privates.GetProperty(accessorName) as Dictionary<ulong, TEntryType>; |
- Assert.IsNotNull(dictionaryRef2); |
- Assert.AreEqual(firstCount + 1, dictionaryRef2.Count); |
- } |
- |
- /// <summary> |
- /// Runs a set of validations to ensure all that indices were built. |
- /// </summary> |
- private void ValidateIndices() { |
- ValidateIndex(target_.SourceFilesByFilename); |
- ValidateIndex(target_.LocationsByFile); |
- ValidateIndex(target_.EntriesByParent); |
- ValidateIndex(target_.RangeListsByDIE); |
- } |
- |
- #endregion |
- } |
-} |