2017-02-14 15:13:25 +08:00
|
|
|
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
|
|
|
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
|
|
|
|
|
|
|
|
|
using System;
|
2016-10-21 17:25:22 +08:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using NUnit.Framework;
|
|
|
|
|
using osu.Framework.Desktop.Platform;
|
|
|
|
|
using osu.Framework.Platform;
|
|
|
|
|
using osu.Game.Database;
|
|
|
|
|
using osu.Game.IPC;
|
2016-11-14 17:03:20 +08:00
|
|
|
|
using osu.Game.Modes;
|
2016-11-14 21:03:39 +08:00
|
|
|
|
using osu.Game.Modes.Catch;
|
|
|
|
|
using osu.Game.Modes.Mania;
|
|
|
|
|
using osu.Game.Modes.Osu;
|
|
|
|
|
using osu.Game.Modes.Taiko;
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
|
|
|
|
namespace osu.Game.Tests.Beatmaps.IO
|
|
|
|
|
{
|
|
|
|
|
[TestFixture]
|
|
|
|
|
public class ImportBeatmapTest
|
|
|
|
|
{
|
|
|
|
|
const string osz_path = @"../../../osu-resources/osu.Game.Resources/Beatmaps/241526 Soleily - Renatus.osz";
|
|
|
|
|
|
2016-10-26 22:37:36 +08:00
|
|
|
|
[OneTimeSetUp]
|
2016-10-21 17:25:22 +08:00
|
|
|
|
public void SetUp()
|
|
|
|
|
{
|
2016-11-14 21:03:39 +08:00
|
|
|
|
Ruleset.Register(new OsuRuleset());
|
|
|
|
|
Ruleset.Register(new TaikoRuleset());
|
|
|
|
|
Ruleset.Register(new ManiaRuleset());
|
|
|
|
|
Ruleset.Register(new CatchRuleset());
|
2016-10-21 17:25:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void TestImportWhenClosed()
|
|
|
|
|
{
|
|
|
|
|
//unfortunately for the time being we need to reference osu.Framework.Desktop for a game host here.
|
2016-11-21 11:34:03 +08:00
|
|
|
|
using (HeadlessGameHost host = new HeadlessGameHost())
|
|
|
|
|
{
|
|
|
|
|
var osu = loadOsu(host);
|
|
|
|
|
osu.Dependencies.Get<BeatmapDatabase>().Import(osz_path);
|
|
|
|
|
ensureLoaded(osu);
|
|
|
|
|
}
|
2016-10-21 17:25:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
public void TestImportOverIPC()
|
|
|
|
|
{
|
2016-11-21 11:34:03 +08:00
|
|
|
|
using (HeadlessGameHost host = new HeadlessGameHost("host", true))
|
|
|
|
|
using (HeadlessGameHost client = new HeadlessGameHost("client", true))
|
|
|
|
|
{
|
|
|
|
|
Assert.IsTrue(host.IsPrimaryInstance);
|
|
|
|
|
Assert.IsTrue(!client.IsPrimaryInstance);
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
2016-11-21 11:34:03 +08:00
|
|
|
|
var osu = loadOsu(host);
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
2016-11-21 11:34:03 +08:00
|
|
|
|
var importer = new BeatmapImporter(client);
|
2017-02-24 05:32:10 +08:00
|
|
|
|
if (!importer.ImportAsync(osz_path).Wait(1000))
|
2016-11-21 11:34:03 +08:00
|
|
|
|
Assert.Fail(@"IPC took too long to send");
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
2016-11-21 11:34:03 +08:00
|
|
|
|
ensureLoaded(osu, 10000);
|
|
|
|
|
}
|
2016-10-21 17:25:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-02-23 14:38:17 +08:00
|
|
|
|
private OsuGameBase loadOsu(GameHost host)
|
2016-10-21 17:25:22 +08:00
|
|
|
|
{
|
|
|
|
|
var osu = new OsuGameBase();
|
|
|
|
|
host.Add(osu);
|
|
|
|
|
|
2016-11-03 15:59:16 +08:00
|
|
|
|
while (!osu.IsLoaded)
|
|
|
|
|
Thread.Sleep(1);
|
|
|
|
|
|
2016-10-21 17:25:22 +08:00
|
|
|
|
//reset beatmap database (sqlite and storage backing)
|
2016-11-05 06:06:58 +08:00
|
|
|
|
osu.Dependencies.Get<BeatmapDatabase>().Reset();
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
|
|
|
|
return osu;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ensureLoaded(OsuGameBase osu, int timeout = 100)
|
|
|
|
|
{
|
|
|
|
|
IEnumerable<BeatmapSetInfo> resultSets = null;
|
|
|
|
|
|
|
|
|
|
Action waitAction = () =>
|
|
|
|
|
{
|
2016-11-05 06:06:58 +08:00
|
|
|
|
while ((resultSets = osu.Dependencies.Get<BeatmapDatabase>()
|
2017-02-25 10:46:04 +08:00
|
|
|
|
.Query<BeatmapSetInfo>().Where(s => s.OnlineBeatmapSetID == 241526)).Count() == 0)
|
|
|
|
|
Thread.Sleep(50);
|
2016-10-21 17:25:22 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout),
|
2017-02-25 10:46:04 +08:00
|
|
|
|
$@"BeatmapSet did not import to the database in allocated time.");
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
|
|
|
|
//ensure we were stored to beatmap database backing...
|
2016-11-05 21:48:32 +08:00
|
|
|
|
|
2017-02-25 10:46:04 +08:00
|
|
|
|
Assert.IsTrue(resultSets.Count() == 1, $@"Incorrect result count found ({resultSets.Count()} but should be 1).");
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
|
|
|
|
IEnumerable<BeatmapInfo> resultBeatmaps = null;
|
|
|
|
|
|
|
|
|
|
//if we don't re-check here, the set will be inserted but the beatmaps won't be present yet.
|
|
|
|
|
waitAction = () =>
|
|
|
|
|
{
|
2016-11-05 06:06:58 +08:00
|
|
|
|
while ((resultBeatmaps = osu.Dependencies.Get<BeatmapDatabase>()
|
2017-01-09 21:05:01 +08:00
|
|
|
|
.Query<BeatmapInfo>().Where(s => s.OnlineBeatmapSetID == 241526 && s.BaseDifficultyID > 0)).Count() != 12)
|
2017-02-25 10:55:30 +08:00
|
|
|
|
Thread.Sleep(50);
|
2016-10-21 17:25:22 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout),
|
2017-02-25 10:55:30 +08:00
|
|
|
|
@"Beatmaps did not import to the database in allocated time");
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
|
|
|
|
//fetch children and check we can load from the post-storage path...
|
2016-11-05 06:06:58 +08:00
|
|
|
|
var set = osu.Dependencies.Get<BeatmapDatabase>().GetChildren(resultSets.First());
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
2017-02-25 10:55:30 +08:00
|
|
|
|
Assert.IsTrue(set.Beatmaps.Count == resultBeatmaps.Count(),
|
|
|
|
|
$@"Incorrect database beatmap count post-import ({resultBeatmaps.Count()} but should be {set.Beatmaps.Count}).");
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
|
|
|
|
foreach (BeatmapInfo b in resultBeatmaps)
|
2017-01-09 21:05:01 +08:00
|
|
|
|
Assert.IsTrue(set.Beatmaps.Any(c => c.OnlineBeatmapID == b.OnlineBeatmapID));
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
|
|
|
|
Assert.IsTrue(set.Beatmaps.Count > 0);
|
|
|
|
|
|
2017-02-24 12:43:21 +08:00
|
|
|
|
var beatmap = osu.Dependencies.Get<BeatmapDatabase>().GetWorkingBeatmap(set.Beatmaps.First(b => b.Mode == PlayMode.Osu))?.Beatmap;
|
2016-10-21 17:25:22 +08:00
|
|
|
|
|
|
|
|
|
Assert.IsTrue(beatmap.HitObjects.Count > 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|