mirror of
https://github.com/ppy/osu.git
synced 2024-12-15 01:43:20 +08:00
Merge pull request #6185 from peppy/checksum-before-skip-copy
Checksum before skip copy
This commit is contained in:
commit
33e39795c3
@ -90,6 +90,48 @@ namespace osu.Game.Tests.Beatmaps.IO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task TestImportCorruptThenImport()
|
||||||
|
{
|
||||||
|
//unfortunately for the time being we need to reference osu.Framework.Desktop for a game host here.
|
||||||
|
using (HeadlessGameHost host = new CleanRunHeadlessGameHost("TestImportThenImport"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var osu = loadOsu(host);
|
||||||
|
|
||||||
|
var imported = await LoadOszIntoOsu(osu);
|
||||||
|
|
||||||
|
var firstFile = imported.Files.First();
|
||||||
|
|
||||||
|
var files = osu.Dependencies.Get<FileStore>();
|
||||||
|
|
||||||
|
long originalLength;
|
||||||
|
using (var stream = files.Storage.GetStream(firstFile.FileInfo.StoragePath))
|
||||||
|
originalLength = stream.Length;
|
||||||
|
|
||||||
|
using (var stream = files.Storage.GetStream(firstFile.FileInfo.StoragePath, FileAccess.Write, FileMode.Create))
|
||||||
|
stream.WriteByte(0);
|
||||||
|
|
||||||
|
var importedSecondTime = await LoadOszIntoOsu(osu);
|
||||||
|
|
||||||
|
using (var stream = files.Storage.GetStream(firstFile.FileInfo.StoragePath))
|
||||||
|
Assert.AreEqual(stream.Length, originalLength, "Corruption was not fixed on second import");
|
||||||
|
|
||||||
|
// 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(osu, 1);
|
||||||
|
checkSingleReferencedFileCount(osu, 18);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
host.Exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public async Task TestRollbackOnFailure()
|
public async Task TestRollbackOnFailure()
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,16 @@ namespace osu.Game.IO
|
|||||||
string path = info.StoragePath;
|
string path = info.StoragePath;
|
||||||
|
|
||||||
// we may be re-adding a file to fix missing store entries.
|
// we may be re-adding a file to fix missing store entries.
|
||||||
if (!Storage.Exists(path))
|
bool requiresCopy = !Storage.Exists(path);
|
||||||
|
|
||||||
|
if (!requiresCopy)
|
||||||
|
{
|
||||||
|
// even if the file already exists, check the existing checksum for safety.
|
||||||
|
using (var stream = Storage.GetStream(path))
|
||||||
|
requiresCopy |= stream.ComputeSHA2Hash() != hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requiresCopy)
|
||||||
{
|
{
|
||||||
data.Seek(0, SeekOrigin.Begin);
|
data.Seek(0, SeekOrigin.Begin);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user