예제 #1
0
        private static void ComputeAndTestDeltas(string folderPath, string latestVersionPath)
        {
            using (new TraceWatch("Verifying latest file '{0}' loads...", latestVersionPath, folderPath))
            {
                AddReferenceDatabase latest = new AddReferenceDatabase(ArdbVersion.Current);
                Read.FromFile(latest.ReadText, latestVersionPath);
            }

            byte[] latestBytes = File.ReadAllBytes(latestVersionPath);

            using (new TraceWatch("Computing Deltas from '{0}' for all files in '{1}'...", latestVersionPath, folderPath))
            {
                foreach (string filePath in Directory.GetFiles(folderPath, "*.txt", SearchOption.AllDirectories))
                {
                    if (String.Equals(filePath, latestVersionPath, StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    Trace.WriteLine(filePath);
                    byte[] currentBytes = File.ReadAllBytes(filePath);

                    byte[] delta = null;
                    using (new TraceWatch("Computing ARDB text delta..."))
                    {
                        byte[] latestCopy = new byte[latestBytes.Length];
                        latestBytes.CopyTo(latestCopy, 0);

                        byte[] currentCopy = new byte[currentBytes.Length];
                        currentBytes.CopyTo(currentCopy, 0);

                        delta = Delta.CreatePatch(currentCopy, latestCopy);
                        Trace.WriteLine(String.Format("{0:n0}", ((long)delta.Length).SizeString()));
                    }

                    using (new TraceWatch("Validating Delta..."))
                    {
                        byte[] currentWithDelta = Delta.ApplyPatch(currentBytes, delta);

                        if (latestBytes.Length != currentWithDelta.Length)
                        {
                            throw new IOException(String.Format("Delta from '{0}' to '{1}' didn't reproduce latest. Wrong length. Aborting.", filePath, latestVersionPath));
                        }

                        for (int i = 0; i < latestBytes.Length; ++i)
                        {
                            if (latestBytes[i] != currentWithDelta[i])
                            {
                                throw new IOException(String.Format("Delta from '{0}' to '{1}' didn't reproduce latest; Aborting. Byte {2} wrong.\r\nExpect: {3}\r\nActual: {4}", filePath, latestVersionPath, i, latestBytes[i], currentWithDelta[i]));
                            }
                        }
                    }

                    using (new TraceWatch("Writing Delta..."))
                    {
                        File.WriteAllBytes(Path.ChangeExtension(filePath, ".Delta.bin"), delta);
                    }
                }
            }
        }
예제 #2
0
        public void AddReferenceDatabase_Prerelease()
        {
            // Verify unknown SymbolTypes are excluded ('!'),
            // descendants of excluded elements are added under parent (Logger),
            // and later siblings are correct (Extensions).
            // We keep descendants rather than excluding them so that new types can be added higher in the tree (ex: Package Release, Assembly Hash Signature)
            string sampleTree = @"Elfie V2
20160126
P SamplePackage
    V 1.2.3-beta1
        R 17
            A Sample.dll
                N Extensions
                    C IntExtensions
                N Sample
                    C Logger
                        C TryLog
                    C Memory
                    C TraceWatch
".TrimStart().Replace("    ", "\t");

            string expectedLoadResult = sampleTree;

            AddReferenceDatabase db = new AddReferenceDatabase(ArdbVersion.Current);

            db.ReadText(new StringReader(sampleTree));

            string result = Write.ToString(db.WriteText);

            Assert.AreEqual(expectedLoadResult, result);
        }
예제 #3
0
        private static void WriteArdbVariations(string folderPath)
        {
            foreach (string filePath in Directory.GetFiles(folderPath, "*.txt", SearchOption.AllDirectories))
            {
                AddReferenceDatabase ardb = new AddReferenceDatabase();
                Read.FromFile(ardb.ReadText, filePath);

                // Write only the Package Names [easy diff of which packages included]
                using (StreamWriter writer = new StreamWriter(Path.ChangeExtension(filePath, "PackageOnly.txt"), false))
                {
                    ardb.WriteText(writer, (s) => s.Type == SymbolType.Package);
                }

                // Write without extension methods [compare sizes]
                using (StreamWriter writer = new StreamWriter(Path.ChangeExtension(filePath, "NoExtensionMethods.txt"), false))
                {
                    ardb.WriteText(writer, (s) => s.Type != SymbolType.ExtensionMethod);
                }

                // Write without long names
                using (StreamWriter writer = new StreamWriter(Path.ChangeExtension(filePath, "NoExtensionsOrLongNames.txt"), false))
                {
                    ardb.WriteText(writer, (s) => s.Type != SymbolType.ExtensionMethod && (s.Type.IsAboveType() || s.Name.Length <= 40));
                }
            }
        }
예제 #4
0
        public void AddReferenceDatabase_BinaryWrongVersionLoading()
        {
            AddReferenceDatabase db = new AddReferenceDatabase(ArdbVersion.Current);

            db.AddUniqueMembers(PackageDatabaseTests.BuildDefaultSample());

            // Overwrite version with '9' and verify binary format won't load
            Verify.RoundTrip(db, new AddReferenceDatabase(), (w) => w.Write(9));
        }
            public AddReferenceDatabase CreateDatabaseFromBytes(byte[] bytes)
            {
                using var memoryStream = new MemoryStream(bytes);
                using var streamReader = new StreamReader(memoryStream);
                var database = new AddReferenceDatabase(ArdbVersion.V1);

                database.ReadText(streamReader);
                return(database);
            }
 public AddReferenceDatabase CreateDatabaseFromBytes(byte[] bytes)
 {
     using (var memoryStream = new MemoryStream(bytes))
     using (var streamReader = new StreamReader(memoryStream))
     {
         var database = new AddReferenceDatabase();
         database.ReadText(streamReader);
         return database;
     }
 }
 public AddReferenceDatabase CreateDatabaseFromBytes(byte[] bytes)
 {
     using (var memoryStream = new MemoryStream(bytes))
         using (var streamReader = new StreamReader(memoryStream))
         {
             var database = new AddReferenceDatabase();
             database.ReadText(streamReader);
             return(database);
         }
 }
예제 #8
0
        private static void LoadSpeedTest(string sourcePath)
        {
            AddReferenceDatabase ardb = new AddReferenceDatabase();

            int iterations = 100;

            using (new TraceWatch("Loading '{0}' {1} times...", sourcePath, iterations))
            {
                for (int i = 0; i < iterations; ++i)
                {
                    ardb.FileRead(sourcePath);
                }
            }
        }
예제 #9
0
        private static void ConvertAddReferenceDatabaseFromText(string textFilePath)
        {
            AddReferenceDatabase ardb = new AddReferenceDatabase();

            using (new TraceWatch("Converting '{0}' from text to binary model...", textFilePath))
            {
                Read.FromFile(ardb.ReadText, textFilePath);
                ardb.FileWrite(textFilePath.Substring(0, textFilePath.Length - 4));
            }

            int  count = ardb.Count;
            long bytes = ardb.Bytes;

            Trace.WriteLine(String.Format("{0:n0} items in {1}, {2}/item.\r\n", count, bytes.SizeString(), (bytes / count).SizeString()));
        }
예제 #10
0
        private PackageWithTypeResult CreateResult(AddReferenceDatabase database, Symbol type)
        {
            var nameParts = ArrayBuilder<string>.GetInstance();
            GetFullName(nameParts, type.FullName.Parent);

            var packageName = type.PackageName.ToString();

            var version = database.GetPackageVersion(type.Index).ToString();

            return new PackageWithTypeResult(
                packageName: packageName,
                typeName: type.Name.ToString(),
                version: version,
                rank: GetRank(type),
                containingNamespaceNames: nameParts.ToImmutableAndFree());
        }
예제 #11
0
        public void AddReferenceDatabase_PackagePrereleaseVersion()
        {
            AddReferenceDatabase ardb = new AddReferenceDatabase(ArdbVersion.Current);
            // Build and add the sample PackageDatabase
            PackageDatabase source = PackageDatabaseTests.BuildPreleaseSample();

            ardb.AddUniqueMembers(source);
            ardb.ConvertToImmutable();

            MemberQuery           query   = new MemberQuery(PackageDatabaseTests.TYPE_LOGGER, false, false);
            PartialArray <Symbol> results = new PartialArray <Symbol>(10);

            query.TryFindMembers(ardb, ref results);
            Assert.AreEqual(1, results.Count);
            Assert.AreEqual(PackageDatabaseTests.PRERELEASE_VERSION, ardb.GetPackageVersion(results[0].Index).ToString());
        }
예제 #12
0
        private PackageWithTypeResult CreateResult(AddReferenceDatabase database, Symbol type)
        {
            var nameParts = new List <string>();

            GetFullName(nameParts, type.FullName.Parent);

            var packageName = type.PackageName.ToString();

            var version = database.GetPackageVersion(type.Index).ToString();

            return(new PackageWithTypeResult(
                       packageName: packageName,
                       typeName: type.Name.ToString(),
                       version: version,
                       containingNamespaceNames: nameParts));
        }
예제 #13
0
        public void AddReferenceDatabase_PackageReleaseVersion()
        {
            AddReferenceDatabase ardb = new AddReferenceDatabase(ArdbVersion.Current);
            // Build and add the sample PackageDatabase
            PackageDatabase source = PackageDatabaseTests.BuildDefaultSample();

            ardb.AddUniqueMembers(source);
            ardb.ConvertToImmutable();

            MemberQuery           query   = new MemberQuery(PackageDatabaseTests.TYPE_LOGGER, false, false);
            PartialArray <Symbol> results = new PartialArray <Symbol>(10);

            query.TryFindMembers(ardb, ref results);
            Assert.AreEqual(1, results.Count);

            // We shouldn't persist non-prerelease version details in the ARDB
            Assert.AreEqual(String.Empty, ardb.GetPackageVersion(results[0].Index).ToString());
        }
예제 #14
0
        private PackageWithTypeResult CreateResult(AddReferenceDatabase database, Symbol type)
        {
            var nameParts = new List <string>();

            GetFullName(nameParts, type.FullName.Parent);

            var packageName = type.PackageName.ToString();

            var version = database.GetPackageVersion(type.Index).ToString();

            return(new PackageWithTypeResult(
                       isDesktopFramework: packageName == MicrosoftAssemblyReferencesName,
                       packageName: packageName,
                       assemblyName: type.AssemblyNameWithoutExtension.ToString(),
                       typeName: type.Name.ToString(),
                       version: version,
                       containingNamespaceNames: nameParts));
        }
예제 #15
0
        public void AddReferenceDatabase_NewlineFlexibility()
        {
            PackageDatabase db = PackageDatabaseTests.BuildDefaultSample();

            AddReferenceDatabase ardb = new AddReferenceDatabase(ArdbVersion.Current);

            ardb.AddUniqueMembers(db);
            string originalTextFormat = Write.ToString(ardb.WriteText);

            // Ensure non-Windows newlines don't trip up ReadText
            string modifiedNewlines    = originalTextFormat.Replace("\r\n", "\n");
            AddReferenceDatabase ardb2 = new AddReferenceDatabase(ArdbVersion.Current);

            Read.FromString(ardb2.ReadText, modifiedNewlines);

            // Verify everything in the ARDB round-tripped to validate read success
            string roundTripped = Write.ToString(ardb2.WriteText);

            Assert.AreEqual(originalTextFormat, roundTripped);
        }
예제 #16
0
        public void AddReferenceDatabase_DuplicateMerging()
        {
            int defaultArdbMemberCount, addedDefaultSampleDataMemberCount;
            AddReferenceDatabase ardb = new AddReferenceDatabase(ArdbVersion.Current);
            PackageDatabase      db   = PackageDatabaseTests.BuildDefaultSample();

            defaultArdbMemberCount = ardb.DeclaredMembers.Count;

            // Add the database once
            ardb.AddUniqueMembers(db);
            int memberCount = ardb.DeclaredMembers.Count;

            addedDefaultSampleDataMemberCount = (ardb.DeclaredMembers.Count - defaultArdbMemberCount);

            db = PackageDatabaseTests.BuildDefaultSample(Guid.NewGuid().ToString());

            // Change only the package name. We should see no change
            // in member count, since all package contents are duped.
            memberCount = ardb.DeclaredMembers.Count;
            ardb.AddUniqueMembers(db);
            Assert.AreEqual(memberCount, ardb.DeclaredMembers.Count);

            db = PackageDatabaseTests.BuildDefaultSample(Guid.NewGuid().ToString());

            // Add allowing duplicates should add the same number of
            // new members as fresh construction of the sample data
            // + 2 (to account for a duplicated type and for
            // an added assembly node).
            memberCount = ardb.DeclaredMembers.Count + addedDefaultSampleDataMemberCount;
            ardb.AddReferenceAssemblyTypes(db);
            Assert.AreEqual(memberCount + 2, ardb.DeclaredMembers.Count);

            // Write the ARDB tree [debuggability]
            string result = Write.ToString(ardb.WriteText);

            Trace.WriteLine(result);
        }
예제 #17
0
        private void VerifyQueryResults(AddReferenceDatabase ardb, ArdbVersion version)
        {
            // "Diagnostics."
            MemberQuery           query   = new MemberQuery(PackageDatabaseTests.NS_DIAGNOSTICS + ".", false, false);
            PartialArray <Symbol> results = new PartialArray <Symbol>(10);

            query.TryFindMembers(ardb, ref results);
            Assert.AreEqual(3, results.Count);
            Assert.AreEqual("Logger, Memory, TraceWatch", PackageDatabaseTests.ResultNamesToString(results));

            if (version == ArdbVersion.V1)
            {
                // V1 has no TFM data. This call also verifies that most current client
                // can query older format without raising an exception.
                Assert.AreEqual(String8.Empty, ardb.GetFrameworkTargets(results[0].Index));
                return;
            }

            for (int i = 0; i < results.Count; i++)
            {
                Symbol symbol = results[i];
                string fx     = ardb.GetFrameworkTargets(symbol.Index).ToString();

                if (symbol.Name.ToString() == "TraceWatch")
                {
                    Assert.AreEqual(PackageDatabaseTests.NET20, fx);
                }
                else if (symbol.Name.ToString() == "Memory")
                {
                    Assert.AreEqual(PackageDatabaseTests.NET35, fx);
                }
                else
                {
                    Assert.AreEqual(@"<tfms><tfm>net20</tfm><tfm>net35</tfm></tfms>", fx);
                }
            }
        }
예제 #18
0
        private static void ReportEmptyPackages(AddReferenceDatabase ardb)
        {
            Console.WriteLine("Packages with few Types:");

            Symbol root = ardb.QueryRoot;

            for (Symbol package = root.FirstChild(); package.IsValid; package = package.NextSibling())
            {
                int typeCount = 0;
                package.Walk((s) => { if (s.Type.IsType())
                                      {
                                          typeCount++;
                                      }
                             });

                if (typeCount < 5)
                {
                    package.Name.WriteTo(Console.Out);
                    Console.WriteLine("\t" + typeCount.ToString());
                }
            }

            Console.WriteLine("\r\nDone.");
        }
예제 #19
0
 private DatabaseAddResult CallAddUniqueMembers(AddReferenceDatabase ardb, PackageDatabase source)
 {
     return(ardb.AddUniqueMembers(source));
 }
예제 #20
0
        private PackageWithTypeResult CreateResult(AddReferenceDatabase database, Symbol type)
        {
            var nameParts = new List<string>();
            GetFullName(nameParts, type.FullName.Parent);

            var packageName = type.PackageName.ToString();

            var version = database.GetPackageVersion(type.Index).ToString();

            return new PackageWithTypeResult(
                packageName: packageName, 
                typeName: type.Name.ToString(), 
                version: version,
                rank: GetRank(type),
                containingNamespaceNames: nameParts);
        }
예제 #21
0
        private void AddReferenceDatabaseBasicHelper(ArdbVersion version)
        {
            AddReferenceDatabase ardb = new AddReferenceDatabase(version);
            DatabaseAddResult    result;

            // Build and add the sample PackageDatabase
            PackageDatabase source = PackageDatabaseTests.BuildDefaultSample("V1");

            result = CallAddUniqueMembers(ardb, source);

            // Verify at least something was added
            int ardbCountFirstAdd = ardb.Count;

            Assert.IsTrue(result.WasMemberAdded[0].Value);

            // Add the sample again; verify nothing was added
            source = PackageDatabaseTests.BuildDefaultSample("V2");
            result = CallAddUniqueMembers(ardb, source);
            Assert.IsFalse(result.WasMemberAdded[0].Value);
            Assert.AreEqual(ardbCountFirstAdd, ardb.Count);

            // Add a namespace with a private class; verify nothing added
            source = PackageDatabaseTests.BuildDefaultSample("V3");
            MutableSymbol diagnostics = source.MutableRoot.FindByFullName(BuildDiagnosticsNamespaceFor(source.Identity.PackageName), PackageDatabaseTests.SEPARATOR_CHAR);
            MutableSymbol internalNs  = diagnostics.AddChild(new MutableSymbol("Internal", SymbolType.Namespace));

            internalNs.AddChild(new MutableSymbol("Tracer", SymbolType.Class)
            {
                Modifiers = SymbolModifier.Internal
            });
            result = CallAddUniqueMembers(ardb, source);
            Assert.IsFalse(result.WasMemberAdded[0].Value);
            Assert.AreEqual(ardbCountFirstAdd, ardb.Count);

            // Add a new public class (existing namespace); verify it is added
            source      = PackageDatabaseTests.BuildDefaultSample("V4");
            diagnostics = source.MutableRoot.FindByFullName(BuildDiagnosticsNamespaceFor(source.Identity.PackageName), PackageDatabaseTests.SEPARATOR_CHAR);
            diagnostics.AddChild(new MutableSymbol("TraceWatch", SymbolType.Class)
            {
                Modifiers = SymbolModifier.Public | SymbolModifier.Static
            });
            result = CallAddUniqueMembers(ardb, source);
            Assert.IsTrue(result.WasMemberAdded[0].Value);
            Assert.IsTrue(result.WasMemberAdded[result.WasMemberAdded.Length - 1].Value);
            Assert.AreNotEqual(ardbCountFirstAdd, ardb.Count);

            // Verify a query [expect Diagnostics. to match Logger, Memory, and TraceWatch
            ardb.ConvertToImmutable();
            VerifyQueryResults(ardb, version);

            // Double-convert ARDB. Verify queries still work correctly.
            ardb.ConvertToImmutable();
            VerifyQueryResults(ardb, version);

            // Round trip to string; verify query still right, count matches
            string sampleArdbFilePath = "Sample.ardb.txt";

            Write.ToFile(ardb.WriteText, sampleArdbFilePath);
            AddReferenceDatabase reloaded = new AddReferenceDatabase(version);

            Read.FromFile(reloaded.ReadText, sampleArdbFilePath);

            VerifyQueryResults(reloaded, version);
            Assert.AreEqual(ardb.Count, reloaded.Count);

            string sampleRewriteArdbFilePath = "Sample.Rewrite.ardb.txt";

            Write.ToFile(reloaded.WriteText, sampleRewriteArdbFilePath);
            Assert.AreEqual(File.ReadAllText(sampleArdbFilePath), File.ReadAllText(sampleRewriteArdbFilePath));
        }
 public PopularityAndSizeReport()
 {
     _addReferenceDB = new AddReferenceDatabase(ArdbVersion.Current);
     _results        = new List <PopularityDetails>();
 }
 public AddReferenceDatabaseWrapper(AddReferenceDatabase database)
 {
     Database = database;
 }
예제 #24
0
        private PackageWithTypeResult CreateResult(AddReferenceDatabase database, Symbol type)
        {
            var nameParts = new List<string>();
            GetFullName(nameParts, type.FullName.Parent);

            var packageName = type.PackageName.ToString();

            var version = database.GetPackageVersion(type.Index).ToString();

            return new PackageWithTypeResult(
                isDesktopFramework: packageName == MicrosoftAssemblyReferencesName,
                packageName: packageName, 
                assemblyName: type.AssemblyNameWithoutExtension.ToString(),
                typeName: type.Name.ToString(), 
                version: version,
                containingNamespaceNames: nameParts);
        }
예제 #25
0
        public static void Merge(MergerOptions options)
        {
            string individualLogs = options.PathToMerge + "Logs";

            if (Directory.Exists(individualLogs))
            {
                Directory.Delete(individualLogs, true);
            }
            if (options.WithPackageOutcomes)
            {
                Directory.CreateDirectory(individualLogs);
            }

            using (new TraceWatch("Filtering '{0}' covering {1:p0} of downloads to Public Types Only...", options.PathToMerge, options.DownloadPercentage))
            {
                AddReferenceDatabase ardb = new AddReferenceDatabase(options.Version);
                ardb.DatabaseVersion = options.DatabaseVersion;

                // Determine indexes to include (up to popularity cutoff)
                List <string> indexesToInclude = null;

                if (Directory.Exists(options.PathToMerge))
                {
                    indexesToInclude = IndexesByPopularityToCutoff(Directory.EnumerateFiles(options.PathToMerge, "*.idx", SearchOption.AllDirectories), options.DownloadPercentage);

                    if (indexesToInclude.Count == 0)
                    {
                        Trace.WriteLine("No indexes found to include. Stopping.");
                        return;
                    }
                }
                else if (File.Exists(options.PathToMerge))
                {
                    // Text file listing IDS files passed
                    indexesToInclude = new List <string>(File.ReadAllLines(options.PathToMerge));
                }
                else
                {
                    throw new ArgumentException(String.Format("Merge doesn't know how to crawl passed path, '{0}'.", options.PathToMerge));
                }

                HashSet <string> excludedPackageNames          = ParsePackageNames(options.ExcludedPackageNames);
                HashSet <string> filteringDisabledPackageNames = ParsePackageNames(options.DisableDuplicateFilteringPackageNames);

                // Load individual package databases in approximate download count order (prefix of name is scale of download count)
                ProgressWriter p = new ProgressWriter(indexesToInclude.Count);
                foreach (PackageDatabase db in BinarySerializableExtensions.LoadEach <PackageDatabase>(indexesToInclude, true))
                {
                    if (!String.IsNullOrEmpty(db.Identity.PackageName) && excludedPackageNames.Contains(db.Identity.PackageName))
                    {
                        Trace.WriteLine(String.Format("Excluded Package {0}", db.Identity.PackageName));
                    }
                    else
                    {
                        if (filteringDisabledPackageNames.Contains(db.Identity.PackageName))
                        {
                            ardb.AddReferenceAssemblyTypes(db);
                        }
                        else
                        {
                            DatabaseAddResult result = null;

                            ardb.AddUniqueMembers(db);

                            if (options.WithPackageOutcomes)
                            {
                                string log = Path.Combine(individualLogs, db.Identity.IndexFileName + ".log");
                                using (StreamWriter writer = new StreamWriter(log, false))
                                {
                                    result.WriteMemberResults(writer);
                                }
                            }
                        }
                    }

                    p.IncrementProgress();
                }

                // Include the percentage included in the name
                string outputFilePath = Path.Combine(options.OutputPath, Path.GetFileName(Path.GetFullPath(options.PathToMerge)) + "." + (options.DownloadPercentage * 100).ToString("g0"));

                // Write the merged tree, if requested (debuggability)
                if (options.WithMergedTreeLog)
                {
                    string uniqueTreePath = options.PathToMerge + ".MergedTree.log";
                    using (new TraceWatch("Writing Unique Global Namespace tree to '{0}'...", uniqueTreePath))
                    {
                        using (StreamWriter writer = new StreamWriter(uniqueTreePath, false))
                        {
                            ardb.GetMergedMembers().WriteMergedTree(writer);
                        }
                    }
                }

                // Write the binary and text forms of the ARDB
                using (new TraceWatch("Writing AddReferenceDatabase '{0}'...", outputFilePath))
                {
                    ardb.FileWrite(outputFilePath + ".ardb");
                    CreateZip(outputFilePath + ".ardb");

                    Write.ToFile(ardb.WriteText, outputFilePath + ".ardb.txt");
                    CreateZip(outputFilePath + ".ardb.txt");
                }
            }
        }
 public AddReferenceDatabaseWrapper(AddReferenceDatabase database)
 => Database = database;