Пример #1
0
        public void WhenCalculatingBundleHash_HashingBeginsAtFirstObject()
        {
            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
            WriteResult result = AddSimpleBundle(input, "mybundle", "internalName");

            // Add a serialized. Say that the first object begins 100 bytes into the file
            var osi = new ObjectSerializedInfo();
            SerializedLocation header = new SerializedLocation();

            header.SetFileName(result.resourceFiles[0].fileAlias);
            header.SetOffset(100);
            osi.SetHeader(header);
            result.SetSerializedObjects(new ObjectSerializedInfo[] { osi });
            ResourceFile rf = result.resourceFiles[0];

            rf.SetSerializedFile(true);
            result.SetResourceFiles(new ResourceFile[] { rf });
            input.InternalFilenameToWriteResults["internalName"] = result;
            string srcFile = input.InternalFilenameToWriteResults["internalName"].resourceFiles[0].fileName;

            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);
            // Change the first 100 bytes. This is before the serialized object.
            WriteRandomData(srcFile, 100, 1);
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output2);

            // Change the first 104 bytes. This should affect the hash
            WriteRandomData(srcFile, 104, 2);
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output3);

            Assert.AreEqual(output.BundleDetails["mybundle"].Hash, output2.BundleDetails["mybundle"].Hash);
            Assert.AreNotEqual(output.BundleDetails["mybundle"].Hash, output3.BundleDetails["mybundle"].Hash);
        }
Пример #2
0
        public void HashRemainsTheSame_AfterRevertingDependencyListChange()
        {
            Dictionary <string, ulong> offsets = new Dictionary <string, ulong>();

            ResourceFile[] resourceFiles = new ResourceFile[0];

            string[] dependencies = new string[]
            {
                "dependency1",
                "dependency2"
            };

            Hash128 firstHash = ArchiveAndCompressBundles.CalculateHashVersion(offsets, resourceFiles, dependencies);

            dependencies[1] = "newDependency";

            Hash128 secondHash = ArchiveAndCompressBundles.CalculateHashVersion(offsets, resourceFiles, dependencies);

            dependencies[1] = "dependency2";

            Hash128 thirdHash = ArchiveAndCompressBundles.CalculateHashVersion(offsets, resourceFiles, dependencies);

            Assert.AreNotEqual(secondHash, thirdHash);
            Assert.AreEqual(firstHash, thirdHash);
        }
Пример #3
0
        public void WhenInputsChange_BundleOutputHashIsAffectedAsExpected(bool hashShouldChange, Action <ContentHashTestContext> postFirstBuildAction)
        {
            ContentHashTestContext ctx = new ContentHashTestContext();

            ctx.input = GetDefaultInput();
            WriteResult result  = AddSimpleBundle(ctx.input, "mybundle", "internalName");
            WriteResult result2 = AddSimpleBundle(ctx.input, "mybundle2", "internalName2");
            WriteResult result3 = AddSimpleBundle(ctx.input, "mybundle3", "internalName3");

            ctx.assetGUID = GUID.Generate();
            ctx.input.AssetToFilesDependencies.Add(ctx.assetGUID, new List <string>()
            {
                "internalName", "internalName2"
            });

            ArchiveAndCompressBundles.Run(ctx.input, out ArchiveAndCompressBundles.TaskOutput output);

            postFirstBuildAction(ctx);

            ArchiveAndCompressBundles.Run(ctx.input, out ArchiveAndCompressBundles.TaskOutput output2);

            Hash128 prevHash = output.BundleDetails["mybundle"].Hash;
            Hash128 newHash  = output2.BundleDetails["mybundle"].Hash;

            if (hashShouldChange)
            {
                Assert.AreNotEqual(prevHash, newHash);
            }
            else
            {
                Assert.AreEqual(prevHash, newHash);
            }
        }
Пример #4
0
        public void WhenInputsChanges_AndRebuilt_CachedDataIsUsedAsExpected(bool shouldRebuild, Action <RebuildTestContext> postFirstBuildAction)
        {
            BuildCache.PurgeCache(false);
            using (BuildCache cache = new BuildCache())
            {
                RebuildTestContext ctx = new RebuildTestContext();
                ctx.input            = GetDefaultInput();
                ctx._this            = this;
                ctx.input.BuildCache = cache;

                AddSimpleBundle(ctx.input, "mybundle", "internalName");

                ArchiveAndCompressBundles.Run(ctx.input, out ArchiveAndCompressBundles.TaskOutput output);
                cache.SyncPendingSaves();
                Assert.AreEqual(0, ctx.input.OutCachedBundles.Count);

                postFirstBuildAction(ctx);

                ctx.input.OutCachedBundles.Clear();
                ArchiveAndCompressBundles.Run(ctx.input, out ArchiveAndCompressBundles.TaskOutput outputReRun);

                if (shouldRebuild)
                {
                    Assert.AreEqual(0, ctx.input.OutCachedBundles.Count);
                }
                else
                {
                    Assert.AreEqual(1, ctx.input.OutCachedBundles.Count);
                }
            }
        }
Пример #5
0
 public void WhenBundleDoesNotHaveDependencies_DependenciesAreNotInDetails()
 {
     ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
     AddSimpleBundle(input, "mybundle", "internalName");
     ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);
     Assert.AreEqual(0, output.BundleDetails["mybundle"].Dependencies.Length);
 }
Пример #6
0
        public void CanAddRawFilesToBundles()
        {
            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
            AddSimpleBundle(input, "mybundle", "internalName");
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);

            AddRawFile(input, "mybundle", "rawName");
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output2);
            Assert.IsTrue(output.BundleDetails["mybundle"].Hash.isValid);
            Assert.IsTrue(output2.BundleDetails["mybundle"].Hash.isValid);
            Assert.AreNotEqual(output.BundleDetails["mybundle"].Hash, output2.BundleDetails["mybundle"].Hash);
        }
Пример #7
0
        public void WhenBuildingArchive_BuildLogIsPopulated()
        {
            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
            var log = new BuildLog();

            input.Log = log;
            AddSimpleBundle(input, "mybundle", "internalName");
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);
            var node = log.Root.Children.Find((x) => x.Name.StartsWith("ArchiveItems"));

            Assert.IsNotNull(node);
        }
Пример #8
0
        public void WhenArchiveIsAlreadyBuilt_AndArchiveIsInOutputDirectory_ArchiveIsNotCopied()
        {
            AddSimpleBundleAndBuild(out ArchiveAndCompressBundles.TaskInput input, out string bundleOutDir1);
            ScopeCapturer log2 = new ScopeCapturer();

            input.GetOutputFilePathForIdentifier = (x) => Path.Combine(bundleOutDir1, x);
            input.Log = log2;
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output2);
            Assert.AreEqual(1, input.OutCachedBundles.Count);
            Assert.AreEqual("mybundle", input.OutCachedBundles[0]);
            Assert.IsFalse(log2.ContainsScopeWithSubstring("Copying From Cache"));
        }
Пример #9
0
        public void WhenSerializedFileChanges_CachedVersionIsNotUsed()
        {
            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
            BuildCache cache = new BuildCache();

            input.BuildCache = cache;
            AddSimpleBundle(input, "mybundle", "internalName");
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);
            string srcFile = input.InternalFilenameToWriteResults["internalName"].resourceFiles[0].fileName;

            CreateFileOfSize(srcFile, 2048);
            cache.SyncPendingSaves();
            cache.ClearCacheEntryMaps();
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output2);
            Assert.AreEqual(0, input.OutCachedBundles.Count);
        }
Пример #10
0
        public void ResourceFilesAreAddedToBundles()
        {
            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
            string bundleOutDir = Path.Combine(m_TestTempDir, "bundleoutdir");

            AddSimpleBundle(input, "mybundle", "internalName");

            string srcFile = input.InternalFilenameToWriteResults["internalName"].resourceFiles[0].fileName;

            ReturnCode code = ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);

            Assert.AreEqual(ReturnCode.Success, code);

            string[] files = RunWebExtract(Path.Combine(bundleOutDir, "mybundle"));
            Assert.AreEqual(1, files.Length);
            FileAssert.AreEqual(files[0], srcFile);
        }
Пример #11
0
        public void WhenArchiveIsAlreadyBuilt_AndArchiveIsInOutputDirectoryButTimestampMismatch_ArchiveIsCopied()
        {
            AddSimpleBundleAndBuild(out ArchiveAndCompressBundles.TaskInput input, out string bundleOutDir1);

            // Change the creation timestamp on the bundles
            string bundlePath = Path.Combine(bundleOutDir1, "mybundle");

            File.SetLastWriteTime(bundlePath, new DateTime(2019, 1, 1));

            ScopeCapturer log2 = new ScopeCapturer();

            input.GetOutputFilePathForIdentifier = (x) => Path.Combine(bundleOutDir1, x);
            input.Log = log2;
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output2);

            Assert.AreEqual(1, input.OutCachedBundles.Count);
            Assert.AreEqual("mybundle", input.OutCachedBundles[0]);
            Assert.IsTrue(log2.ContainsScopeWithSubstring("Copying From Cache"));
        }
Пример #12
0
        private void AddSimpleBundleAndBuild(out ArchiveAndCompressBundles.TaskInput input, out string bundleBuildDir)
        {
            ScopeCapturer log1 = new ScopeCapturer();
            string        bDir = Path.Combine(m_TestTempDir, "bundleoutdir1");

            Directory.CreateDirectory(bDir);
            input = GetDefaultInput();
            BuildCache cache = new BuildCache();

            input.BuildCache = cache;
            input.Log        = log1;
            AddSimpleBundle(input, "mybundle", "internalName");
            input.GetOutputFilePathForIdentifier = (x) => Path.Combine(bDir, x);
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);
            Assert.AreEqual(0, input.OutCachedBundles.Count);
            Assert.IsTrue(log1.ContainsScopeWithSubstring("Copying From Cache"));
            cache.SyncPendingSaves();
            bundleBuildDir = bDir;
        }
Пример #13
0
        public void WhenArchiveIsCached_AndRebuildingArchive_HashIsAssignedToOutput()
        {
            string bundleName = "mybundle";

            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
            BuildCache cache = new BuildCache();

            input.BuildCache = cache;
            AddSimpleBundle(input, bundleName, "internalName");
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);
            var hash = output.BundleDetails[bundleName].Hash;

            Assert.AreNotEqual(Hash128.Parse(""), output.BundleDetails[bundleName].Hash);
            cache.SyncPendingSaves();

            //Now our bundle is cached so we'll run again and make sure the hashes are non-zero and equal
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output2);
            Assert.AreEqual(hash, output2.BundleDetails[bundleName].Hash);
        }
Пример #14
0
        public void HashChanges_WhenDependencyListHasModifiedEntries()
        {
            Dictionary <string, ulong> offsets = new Dictionary <string, ulong>();

            ResourceFile[] resourceFiles = new ResourceFile[0];

            string[] dependencies = new string[]
            {
                "dependency1",
                "dependency2"
            };

            Hash128 firstHash = ArchiveAndCompressBundles.CalculateHashVersion(offsets, resourceFiles, dependencies);

            dependencies[1] = "newDependency";

            Hash128 secondHash = ArchiveAndCompressBundles.CalculateHashVersion(offsets, resourceFiles, dependencies);

            Assert.AreNotEqual(firstHash, secondHash);
        }
Пример #15
0
        public void WhenBuildingManyArchives_ThreadedAndNonThreadedResultsAreIdentical()
        {
            const int kBundleCount = 100;

            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();

            for (int i = 0; i < kBundleCount; i++)
            {
                AddSimpleBundle(input, $"mybundle{i}", $"internalName{i}");
            }

            input.Threaded = false;
            input.GetOutputFilePathForIdentifier = (x) => Path.Combine(m_TestTempDir, "bundleoutdir_nothreading", x);
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output1);

            input.Threaded = true;
            input.GetOutputFilePathForIdentifier = (x) => Path.Combine(m_TestTempDir, "bundleoutdir_threading", x);
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output2);

            AssertDirectoriesEqual(Path.Combine(m_TestTempDir, "bundleoutdir_nothreading"), Path.Combine(m_TestTempDir, "bundleoutdir_threading"), kBundleCount);
        }
Пример #16
0
        public void WhenAssetInBundleHasDependencies_DependenciesAreInDetails()
        {
            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
            AddSimpleBundle(input, "mybundle", "internalName");
            AddSimpleBundle(input, "mybundle2", "internalName2");
            AddSimpleBundle(input, "mybundle3", "internalName3");

            input.AssetToFilesDependencies.Add(new GUID(), new List <string>()
            {
                "internalName", "internalName2"
            });
            input.AssetToFilesDependencies.Add(GUID.Generate(), new List <string>()
            {
                "internalName", "internalName3"
            });

            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);

            Assert.AreEqual(2, output.BundleDetails["mybundle"].Dependencies.Length);
            Assert.AreEqual("mybundle2", output.BundleDetails["mybundle"].Dependencies[0]);
            Assert.AreEqual("mybundle3", output.BundleDetails["mybundle"].Dependencies[1]);
        }
Пример #17
0
        public void WhenArchiveIsAlreadyBuilt_CachedVersionIsUsed()
        {
            string bundleOutDir1 = Path.Combine(m_TestTempDir, "bundleoutdir1");
            string bundleOutDir2 = Path.Combine(m_TestTempDir, "bundleoutdir2");

            Directory.CreateDirectory(bundleOutDir1);
            Directory.CreateDirectory(bundleOutDir2);
            ArchiveAndCompressBundles.TaskInput input = GetDefaultInput();
            BuildCache cache = new BuildCache();

            input.BuildCache = cache;
            AddSimpleBundle(input, "mybundle", "internalName");
            input.GetOutputFilePathForIdentifier = (x) => Path.Combine(bundleOutDir1, x);
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output);
            Assert.AreEqual(0, input.OutCachedBundles.Count);
            cache.SyncPendingSaves();

            input.GetOutputFilePathForIdentifier = (x) => Path.Combine(bundleOutDir2, x);
            ArchiveAndCompressBundles.Run(input, out ArchiveAndCompressBundles.TaskOutput output2);
            Assert.AreEqual(1, input.OutCachedBundles.Count);
            Assert.AreEqual("mybundle", input.OutCachedBundles[0]);
            AssertDirectoriesEqual(bundleOutDir1, bundleOutDir2, 1);
        }