Exemplo n.º 1
0
        public void TestImportWhenFileOpen()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                string?temp = TestResources.GetTestBeatmapForImport();
                using (File.OpenRead(temp))
                    await importer.Import(temp);
                ensureLoaded(realmFactory.Context);
                File.Delete(temp);
                Assert.IsFalse(File.Exists(temp), "We likely held a read lock on the file when we shouldn't");
            });
        }
Exemplo n.º 2
0
        public static async Task <RealmBeatmapSet> LoadOszIntoStore(BeatmapImporter importer, Realm realm, string?path = null, bool virtualTrack = false)
        {
            var temp = path ?? TestResources.GetTestBeatmapForImport(virtualTrack);

            var importedSet = await importer.Import(new ImportTask(temp));

            Assert.NotNull(importedSet);
            Debug.Assert(importedSet != null);

            ensureLoaded(realm);

            waitForOrAssert(() => !File.Exists(temp), "Temporary file still exists after standard import", 5000);

            return(realm.All <RealmBeatmapSet>().First(beatmapSet => beatmapSet.ID == importedSet.ID));
        }
Exemplo n.º 3
0
        public void TestAccessFileAfterImport()
        {
            RunTestWithRealmAsync(async(realm, storage) =>
            {
                using var importer = new BeatmapImporter(storage, realm);
                using var store    = new RealmRulesetStore(realm, storage);

                var imported = await LoadOszIntoStore(importer, realm.Realm);

                var beatmap = imported.Beatmaps.First();
                var file    = beatmap.File;

                Assert.NotNull(file);
                Assert.AreEqual(beatmap.Hash, file !.File.Hash);
            });
        }
Exemplo n.º 4
0
        public void TestImportThenImportWithReZip()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                string?temp = TestResources.GetTestBeatmapForImport();

                string extractedFolder = $"{temp}_extracted";
                Directory.CreateDirectory(extractedFolder);

                try
                {
                    var imported = await LoadOszIntoStore(importer, realmFactory.Context);

                    string hashBefore = hashFile(temp);

                    using (var zip = ZipArchive.Open(temp))
                        zip.WriteToDirectory(extractedFolder);

                    using (var zip = ZipArchive.Create())
                    {
                        zip.AddAllFromDirectory(extractedFolder);
                        zip.SaveTo(temp, new ZipWriterOptions(CompressionType.Deflate));
                    }

                    // zip files differ because different compression or encoder.
                    Assert.AreNotEqual(hashBefore, hashFile(temp));

                    var importedSecondTime = await importer.Import(new ImportTask(temp));

                    ensureLoaded(realmFactory.Context);

                    Assert.NotNull(importedSecondTime);
                    Debug.Assert(importedSecondTime != null);

                    // but contents doesn't, so existing should still be used.
                    Assert.IsTrue(imported.ID == importedSecondTime.ID);
                    Assert.IsTrue(imported.Beatmaps.First().ID == importedSecondTime.PerformRead(s => s.Beatmaps.First().ID));
                }
                finally
                {
                    Directory.Delete(extractedFolder, true);
                }
            });
        }
Exemplo n.º 5
0
        public void TestImportThenImportWithChangedFile()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                string?temp = TestResources.GetTestBeatmapForImport();

                string extractedFolder = $"{temp}_extracted";
                Directory.CreateDirectory(extractedFolder);

                try
                {
                    var imported = await LoadOszIntoStore(importer, realmFactory.Context);

                    using (var zip = ZipArchive.Open(temp))
                        zip.WriteToDirectory(extractedFolder);

                    // arbitrary write to non-hashed file
                    using (var sw = new FileInfo(Directory.GetFiles(extractedFolder, "*.mp3").First()).AppendText())
                        await sw.WriteLineAsync("text");

                    using (var zip = ZipArchive.Create())
                    {
                        zip.AddAllFromDirectory(extractedFolder);
                        zip.SaveTo(temp, new ZipWriterOptions(CompressionType.Deflate));
                    }

                    var importedSecondTime = await importer.Import(new ImportTask(temp));

                    ensureLoaded(realmFactory.Context);

                    Assert.NotNull(importedSecondTime);
                    Debug.Assert(importedSecondTime != null);

                    // check the newly "imported" beatmap is not the original.
                    Assert.IsTrue(imported.ID != importedSecondTime.ID);
                    Assert.IsTrue(imported.Beatmaps.First().ID != importedSecondTime.PerformRead(s => s.Beatmaps.First().ID));
                }
                finally
                {
                    Directory.Delete(extractedFolder, true);
                }
            });
        }
Exemplo n.º 6
0
        public void TestImportThenImportWithDifferentFilename()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                string?temp = TestResources.GetTestBeatmapForImport();

                string extractedFolder = $"{temp}_extracted";
                Directory.CreateDirectory(extractedFolder);

                try
                {
                    var imported = await LoadOszIntoStore(importer, realmFactory.Context);

                    using (var zip = ZipArchive.Open(temp))
                        zip.WriteToDirectory(extractedFolder);

                    // change filename
                    var firstFile = new FileInfo(Directory.GetFiles(extractedFolder).First());
                    firstFile.MoveTo(Path.Combine(firstFile.DirectoryName.AsNonNull(), $"{firstFile.Name}-changed{firstFile.Extension}"));

                    using (var zip = ZipArchive.Create())
                    {
                        zip.AddAllFromDirectory(extractedFolder);
                        zip.SaveTo(temp, new ZipWriterOptions(CompressionType.Deflate));
                    }

                    var importedSecondTime = await importer.Import(new ImportTask(temp));

                    ensureLoaded(realmFactory.Context);

                    Assert.NotNull(importedSecondTime);
                    Debug.Assert(importedSecondTime != null);

                    // check the newly "imported" beatmap is not the original.
                    Assert.IsTrue(imported.ID != importedSecondTime.ID);
                    Assert.IsTrue(imported.Beatmaps.First().ID != importedSecondTime.PerformRead(s => s.Beatmaps.First().ID));
                }
                finally
                {
                    Directory.Delete(extractedFolder, true);
                }
            });
        }
Exemplo n.º 7
0
        public void TestImportWithDuplicateBeatmapIDs()
        {
            RunTestWithRealm((realm, storage) =>
            {
                using var importer = new BeatmapImporter(storage, realm);
                using var store    = new RealmRulesetStore(realm, storage);

                var metadata = new BeatmapMetadata
                {
                    Artist = "SomeArtist",
                    Author =
                    {
                        Username = "******"
                    }
                };

                var ruleset = realm.Realm.All <RulesetInfo>().First();

                var toImport = new BeatmapSetInfo
                {
                    OnlineID = 1,
                    Beatmaps =
                    {
                        new BeatmapInfo(ruleset, new BeatmapDifficulty(), metadata)
                        {
                            OnlineID = 2,
                        },
                        new BeatmapInfo(ruleset, new BeatmapDifficulty(), metadata)
                        {
                            OnlineID = 2,
                            Status   = BeatmapOnlineStatus.Loved,
                        }
                    }
                };

                var imported = importer.ImportModel(toImport);

                realm.Run(r => r.Refresh());

                Assert.NotNull(imported);
                Debug.Assert(imported != null);

                Assert.AreEqual(-1, imported.PerformRead(s => s.Beatmaps[0].OnlineID));
                Assert.AreEqual(-1, imported.PerformRead(s => s.Beatmaps[1].OnlineID));
            });
        }
Exemplo n.º 8
0
        public void TestImportThenImport()
        {
            RunTestWithRealmAsync(async(realm, storage) =>
            {
                using var importer = new BeatmapImporter(storage, realm);
                using var store    = new RealmRulesetStore(realm, storage);

                var imported           = await LoadOszIntoStore(importer, realm.Realm);
                var importedSecondTime = await LoadOszIntoStore(importer, realm.Realm);

                // check the newly "imported" beatmap is actually just the restored previous import. since it matches hash.
                Assert.IsTrue(imported.ID == importedSecondTime.ID);
                Assert.IsTrue(imported.Beatmaps.First().ID == importedSecondTime.Beatmaps.First().ID);

                checkBeatmapSetCount(realm.Realm, 1);
                checkSingleReferencedFileCount(realm.Realm, 18);
            });
        }
Exemplo n.º 9
0
        public BeatmapDatabase(BasicStorage storage, BasicGameHost importHost = null)
        {
            this.storage = storage;

            if (importHost != null)
            {
                ipc = new BeatmapImporter(importHost, this);
            }

            if (connection == null)
            {
                connection = storage.GetDatabase(@"beatmaps");
                connection.CreateTable <BeatmapMetadata>();
                connection.CreateTable <BaseDifficulty>();
                connection.CreateTable <BeatmapSetInfo>();
                connection.CreateTable <BeatmapInfo>();
            }
        }
Exemplo n.º 10
0
        public void TestImportThenDeleteThenImport()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                var imported = await LoadOszIntoStore(importer, realmFactory.Context);

                deleteBeatmapSet(imported, realmFactory.Context);

                var importedSecondTime = await LoadOszIntoStore(importer, realmFactory.Context);

                // check the newly "imported" beatmap is actually just the restored previous import. since it matches hash.
                Assert.IsTrue(imported.ID == importedSecondTime.ID);
                Assert.IsTrue(imported.Beatmaps.First().ID == importedSecondTime.Beatmaps.First().ID);
            });
        }
Exemplo n.º 11
0
        public void TestImportWithDuplicateBeatmapIDs()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                var metadata = new RealmBeatmapMetadata
                {
                    Artist = "SomeArtist",
                    Author =
                    {
                        Username = "******"
                    }
                };

                var ruleset = realmFactory.Context.All <RealmRuleset>().First();

                var toImport = new RealmBeatmapSet
                {
                    OnlineID = 1,
                    Beatmaps =
                    {
                        new RealmBeatmap(ruleset, new RealmBeatmapDifficulty(), metadata)
                        {
                            OnlineID = 2,
                        },
                        new RealmBeatmap(ruleset, new RealmBeatmapDifficulty(), metadata)
                        {
                            OnlineID = 2,
                            Status   = BeatmapSetOnlineStatus.Loved,
                        }
                    }
                };

                var imported = await importer.Import(toImport);

                Assert.NotNull(imported);
                Debug.Assert(imported != null);

                Assert.AreEqual(-1, imported.PerformRead(s => s.Beatmaps[0].OnlineID));
                Assert.AreEqual(-1, imported.PerformRead(s => s.Beatmaps[1].OnlineID));
            });
        }
Exemplo n.º 12
0
        public void TestImportOverIPC()
        {
            HeadlessGameHost host   = new HeadlessGameHost("host", true);
            HeadlessGameHost client = new HeadlessGameHost("client", true);

            Assert.IsTrue(host.IsPrimaryInstance);
            Assert.IsTrue(!client.IsPrimaryInstance);

            var osu = loadOsu(host);

            var importer = new BeatmapImporter(client);

            if (!importer.Import(osz_path).Wait(1000))
            {
                Assert.Fail(@"IPC took too long to send");
            }

            ensureLoaded(osu, 10000);
        }
Exemplo n.º 13
0
        public void TestUpdateBeatmapInfo()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                string?temp = TestResources.GetTestBeatmapForImport();
                await importer.Import(temp);

                // Update via the beatmap, not the beatmap info, to ensure correct linking
                RealmBeatmapSet setToUpdate = realmFactory.Context.All <RealmBeatmapSet>().First();

                var beatmapToUpdate = setToUpdate.Beatmaps.First();

                realmFactory.Context.Write(() => beatmapToUpdate.DifficultyName = "updated");

                RealmBeatmap updatedInfo = realmFactory.Context.All <RealmBeatmap>().First(b => b.ID == beatmapToUpdate.ID);
                Assert.That(updatedInfo.DifficultyName, Is.EqualTo("updated"));
            });
        }
Exemplo n.º 14
0
        public void TestImportNestedStructure()
        {
            RunTestWithRealmAsync(async(realmFactory, storage) =>
            {
                using var importer = new BeatmapImporter(realmFactory, storage);
                using var store    = new RealmRulesetStore(realmFactory, storage);

                string?temp = TestResources.GetTestBeatmapForImport();

                string extractedFolder = $"{temp}_extracted";
                string subfolder       = Path.Combine(extractedFolder, "subfolder");

                Directory.CreateDirectory(subfolder);

                try
                {
                    using (var zip = ZipArchive.Open(temp))
                        zip.WriteToDirectory(subfolder);

                    using (var zip = ZipArchive.Create())
                    {
                        zip.AddAllFromDirectory(extractedFolder);
                        zip.SaveTo(temp, new ZipWriterOptions(CompressionType.Deflate));
                    }

                    var imported = await importer.Import(new ImportTask(temp));

                    Assert.NotNull(imported);
                    Debug.Assert(imported != null);

                    ensureLoaded(realmFactory.Context);

                    Assert.IsFalse(imported.PerformRead(s => s.Files.Any(f => f.Filename.Contains("subfolder"))), "Files contain common subfolder");
                }
                finally
                {
                    Directory.Delete(extractedFolder, true);
                }
            });
        }
Exemplo n.º 15
0
        public BeatmapDatabase(Storage storage, GameHost importHost = null)
        {
            this.storage = storage;

            if (importHost != null)
                ipc = new BeatmapImporter(importHost, this);

            if (connection == null)
            {
                try
                {
                    connection = prepareConnection();
                    deletePending();
                }
                catch (Exception e)
                {
                    Logger.Error(e, @"Failed to initialise the beatmap database! Trying again with a clean database...");
                    storage.DeleteDatabase(@"beatmaps");
                    connection = prepareConnection();
                }
            }
        }
Exemplo n.º 16
0
        public void TestDetachBeatmapSet()
        {
            RunTestWithRealmAsync(async(realm, storage) =>
            {
                using (var importer = new BeatmapImporter(storage, realm))
                    using (new RealmRulesetStore(realm, storage))
                    {
                        var beatmapSet = await importer.Import(new ImportTask(TestResources.GetTestBeatmapStream(), "renatus.osz"));

                        Assert.NotNull(beatmapSet);
                        Debug.Assert(beatmapSet != null);

                        BeatmapSetInfo?detachedBeatmapSet = null;

                        beatmapSet.PerformRead(live =>
                        {
                            detachedBeatmapSet = live.Detach();

                            // files are omitted
                            Assert.AreEqual(0, detachedBeatmapSet.Files.Count);

                            Assert.AreEqual(live.Beatmaps.Count, detachedBeatmapSet.Beatmaps.Count);
                            Assert.AreEqual(live.Beatmaps.Select(f => f.Difficulty).Count(), detachedBeatmapSet.Beatmaps.Select(f => f.Difficulty).Count());
                            Assert.AreEqual(live.Metadata, detachedBeatmapSet.Metadata);
                        });

                        Debug.Assert(detachedBeatmapSet != null);

                        // Check detached instances can all be accessed without throwing.
                        Assert.AreEqual(0, detachedBeatmapSet.Files.Count);
                        Assert.NotNull(detachedBeatmapSet.Beatmaps.Count);
                        Assert.NotZero(detachedBeatmapSet.Beatmaps.Select(f => f.Difficulty).Count());
                        Assert.NotNull(detachedBeatmapSet.Metadata);

                        // Check cyclic reference to beatmap set
                        Assert.AreEqual(detachedBeatmapSet, detachedBeatmapSet.Beatmaps.First().BeatmapSet);
                    }
            });
        }
Exemplo n.º 17
0
        public BeatmapDatabase(Storage storage, GameHost importHost = null)
        {
            this.storage = storage;

            if (importHost != null)
            {
                ipc = new BeatmapImporter(importHost, this);
            }

            if (connection == null)
            {
                try
                {
                    connection = prepareConnection();
                }
                catch
                {
                    Console.WriteLine(@"Failed to initialise the beatmap database! Trying again with a clean database...");
                    storage.DeleteDatabase(@"beatmaps");
                    connection = prepareConnection();
                }
            }
        }
Exemplo n.º 18
0
        public static int Main(string[] args)
        {
            LegacyFilesystemReader.Register();

            // Back up the cwd before DesktopGameHost changes it
            var cwd = Environment.CurrentDirectory;

            using (DesktopGameHost host = Host.GetSuitableHost(@"osu", true))
            {
                if (!host.IsPrimaryInstance)
                {
                    var importer = new BeatmapImporter(host);
                    // Restore the cwd so relative paths given at the command line work correctly
                    Directory.SetCurrentDirectory(cwd);
                    foreach (var file in args)
                    {
                        Console.WriteLine(@"Importing {0}", file);
                        if (!importer.Import(Path.GetFullPath(file)).Wait(3000))
                        {
                            throw new TimeoutException(@"IPC took too long to send");
                        }
                    }
                }
                else
                {
                    Ruleset.Register(new OsuRuleset());
                    Ruleset.Register(new TaikoRuleset());
                    Ruleset.Register(new ManiaRuleset());
                    Ruleset.Register(new CatchRuleset());

                    BaseGame osu = new OsuGameDesktop(args);
                    host.Add(osu);
                    host.Run();
                }
                return(0);
            }
        }