1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-16 23:42:54 +08:00
osu-lazer/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs

169 lines
6.0 KiB
C#
Raw Normal View History

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;
2017-02-28 21:36:11 +08:00
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using NUnit.Framework;
using osu.Framework.Desktop.Platform;
using osu.Framework.Platform;
using osu.Game.IPC;
2017-07-22 18:16:46 +08:00
using osu.Framework.Allocation;
2017-07-26 12:22:46 +08:00
using osu.Game.Beatmaps;
using osu.Game.Rulesets;
namespace osu.Game.Tests.Beatmaps.IO
{
[TestFixture]
public class ImportBeatmapTest
{
2017-03-07 09:59:19 +08:00
private const string osz_path = @"../../../osu-resources/osu.Game.Resources/Beatmaps/241526 Soleily - Renatus.osz";
[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())
{
2017-07-22 18:16:46 +08:00
var osu = loadOsu(host);
2017-02-28 21:36:11 +08:00
var temp = prepareTempCopy(osz_path);
Assert.IsTrue(File.Exists(temp));
osu.Dependencies.Get<BeatmapManager>().Import(temp);
2017-02-28 21:36:11 +08:00
2017-07-22 18:16:46 +08:00
ensureLoaded(osu);
2017-02-28 21:36:11 +08:00
Assert.IsFalse(File.Exists(temp));
2016-11-21 11:34:03 +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);
2017-07-22 18:16:46 +08:00
var osu = loadOsu(host);
2017-02-28 21:36:11 +08:00
var temp = prepareTempCopy(osz_path);
Assert.IsTrue(File.Exists(temp));
2017-03-04 17:51:16 +08:00
var importer = new BeatmapIPCChannel(client);
if (!importer.ImportAsync(temp).Wait(10000))
2016-11-21 11:34:03 +08:00
Assert.Fail(@"IPC took too long to send");
2017-07-22 18:16:46 +08:00
ensureLoaded(osu);
2017-02-28 21:36:11 +08:00
Assert.IsFalse(File.Exists(temp));
2016-11-21 11:34:03 +08:00
}
}
[Test]
public void TestImportWhenFileOpen()
{
//unfortunately for the time being we need to reference osu.Framework.Desktop for a game host here.
using (HeadlessGameHost host = new HeadlessGameHost())
{
2017-07-22 18:16:46 +08:00
var osu = loadOsu(host);
var temp = prepareTempCopy(osz_path);
Assert.IsTrue(File.Exists(temp), "Temporary file copy never substantiated");
2017-03-07 12:30:36 +08:00
using (File.OpenRead(temp))
osu.Dependencies.Get<BeatmapManager>().Import(temp);
2017-07-22 18:16:46 +08:00
ensureLoaded(osu);
File.Delete(temp);
2017-07-11 09:45:43 +08:00
Assert.IsFalse(File.Exists(temp), "We likely held a read lock on the file when we shouldn't");
}
}
2017-02-28 21:36:11 +08:00
private string prepareTempCopy(string path)
{
var temp = Path.GetTempFileName();
2017-03-07 09:59:19 +08:00
return new FileInfo(path).CopyTo(temp, true).FullName;
2017-02-28 21:36:11 +08:00
}
2017-02-23 14:38:17 +08:00
private OsuGameBase loadOsu(GameHost host)
{
var osu = new OsuGameBase();
Task.Run(() => host.Run(osu));
2016-11-03 15:59:16 +08:00
while (!osu.IsLoaded)
Thread.Sleep(1);
//reset beatmap database (sqlite and storage backing)
osu.Dependencies.Get<RulesetStore>().Reset();
osu.Dependencies.Get<BeatmapManager>().Reset();
return osu;
}
2017-07-22 18:16:46 +08:00
private void ensureLoaded(OsuGameBase osu, int timeout = 60000)
{
IEnumerable<BeatmapSetInfo> resultSets = null;
var store = osu.Dependencies.Get<BeatmapManager>();
Action waitAction = () =>
{
while (!(resultSets = store.QueryBeatmapSets(s => s.OnlineBeatmapSetID == 241526)).Any())
Thread.Sleep(50);
};
2017-04-17 19:10:51 +08:00
Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout),
2017-03-07 09:59:19 +08:00
@"BeatmapSet did not import to the database in allocated time.");
//ensure we were stored to beatmap database backing...
2016-11-05 21:48:32 +08:00
Assert.IsTrue(resultSets.Count() == 1, $@"Incorrect result count found ({resultSets.Count()} but should be 1).");
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 = () =>
{
while ((resultBeatmaps = store.QueryBeatmaps(s => s.OnlineBeatmapSetID == 241526 && s.BaseDifficultyID > 0)).Count() != 12)
2017-02-25 10:55:30 +08:00
Thread.Sleep(50);
};
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");
var set = store.QueryBeatmapSets(s => s.OnlineBeatmapSetID == 241526).First();
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}).");
foreach (BeatmapInfo b in resultBeatmaps)
Assert.IsTrue(set.Beatmaps.Any(c => c.OnlineBeatmapID == b.OnlineBeatmapID));
Assert.IsTrue(set.Beatmaps.Count > 0);
var beatmap = store.GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 0))?.Beatmap;
Assert.IsTrue(beatmap?.HitObjects.Count > 0);
beatmap = store.GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 1))?.Beatmap;
Assert.IsTrue(beatmap?.HitObjects.Count > 0);
beatmap = store.GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 2))?.Beatmap;
Assert.IsTrue(beatmap?.HitObjects.Count > 0);
beatmap = store.GetWorkingBeatmap(set.Beatmaps.First(b => b.RulesetID == 3))?.Beatmap;
2017-03-07 09:59:19 +08:00
Assert.IsTrue(beatmap?.HitObjects.Count > 0);
}
}
}