2020-02-19 07:12:23 +01:00
|
|
|
|
using LibHac.Account;
|
2021-08-21 00:33:26 +02:00
|
|
|
|
using LibHac.Common;
|
2020-02-19 07:12:23 +01:00
|
|
|
|
using LibHac.Fs;
|
|
|
|
|
using LibHac.Fs.Shim;
|
|
|
|
|
using LibHac.Ns;
|
|
|
|
|
using Xunit;
|
2022-01-24 23:02:32 +01:00
|
|
|
|
using static LibHac.Fs.SaveData;
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
namespace LibHac.Tests.Fs.FileSystemClientTests;
|
|
|
|
|
|
|
|
|
|
public class ApplicationSaveDataManagementTests
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public static void EnsureApplicationSaveData_CreatesAccountSaveData()
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(true);
|
|
|
|
|
|
|
|
|
|
var applicationId = new Ncm.ApplicationId(11);
|
|
|
|
|
var userId = new Uid(2, 3);
|
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
var controlProperty = new ApplicationControlProperty
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
UserAccountSaveDataSize = 0x1000,
|
|
|
|
|
UserAccountSaveDataJournalSize = 0x1000
|
|
|
|
|
};
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
2022-04-02 02:32:38 +02:00
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
// EnsureApplicationSaveData should do nothing the second time it is called
|
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
void AssertSaveExists()
|
|
|
|
|
{
|
|
|
|
|
using var iterator = new UniqueRef<SaveDataIterator>();
|
|
|
|
|
fs.OpenSaveDataIterator(ref iterator.Ref(), SaveDataSpaceId.User);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
var info = new SaveDataInfo[2];
|
|
|
|
|
Assert.Success(iterator.Get.ReadSaveDataInfo(out long entriesRead, info));
|
|
|
|
|
|
|
|
|
|
Assert.Equal(1, entriesRead);
|
|
|
|
|
Assert.Equal(applicationId, info[0].ProgramId);
|
|
|
|
|
Assert.Equal(Utility.ConvertAccountUidToFsUserId(userId), info[0].UserId);
|
|
|
|
|
Assert.Equal(SaveDataType.Account, info[0].Type);
|
|
|
|
|
}
|
2021-11-14 20:08:57 +01:00
|
|
|
|
}
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public static void EnsureApplicationSaveData_CreatesDeviceSaveData()
|
|
|
|
|
{
|
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(true);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
var applicationId = new Ncm.ApplicationId(11);
|
|
|
|
|
var userId = new Uid(2, 3);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
var controlProperty = new ApplicationControlProperty
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
DeviceSaveDataSize = 0x1000,
|
|
|
|
|
DeviceSaveDataJournalSize = 0x1000
|
|
|
|
|
};
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
2022-04-02 02:32:38 +02:00
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
void AssertSaveExists()
|
|
|
|
|
{
|
|
|
|
|
using var iterator = new UniqueRef<SaveDataIterator>();
|
|
|
|
|
fs.OpenSaveDataIterator(ref iterator.Ref(), SaveDataSpaceId.User);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
var info = new SaveDataInfo[2];
|
|
|
|
|
Assert.Success(iterator.Get.ReadSaveDataInfo(out long entriesRead, info));
|
|
|
|
|
|
|
|
|
|
Assert.Equal(1, entriesRead);
|
|
|
|
|
Assert.Equal(applicationId, info[0].ProgramId);
|
|
|
|
|
Assert.Equal(InvalidUserId, info[0].UserId);
|
|
|
|
|
Assert.Equal(SaveDataType.Device, info[0].Type);
|
|
|
|
|
}
|
2021-11-14 20:08:57 +01:00
|
|
|
|
}
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public static void EnsureApplicationSaveData_CreatesBcatCacheStorage()
|
|
|
|
|
{
|
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(true);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
var applicationId = new Ncm.ApplicationId(11);
|
|
|
|
|
var userId = new Uid(2, 3);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
var controlProperty = new ApplicationControlProperty
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
BcatDeliveryCacheStorageSize = 0x1000
|
|
|
|
|
};
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
2022-04-02 02:32:38 +02:00
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
void AssertSaveExists()
|
|
|
|
|
{
|
|
|
|
|
using var iterator = new UniqueRef<SaveDataIterator>();
|
|
|
|
|
fs.OpenSaveDataIterator(ref iterator.Ref(), SaveDataSpaceId.User);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
var info = new SaveDataInfo[2];
|
|
|
|
|
Assert.Success(iterator.Get.ReadSaveDataInfo(out long entriesRead, info));
|
|
|
|
|
|
|
|
|
|
Assert.Equal(1, entriesRead);
|
|
|
|
|
Assert.Equal(applicationId, info[0].ProgramId);
|
|
|
|
|
Assert.Equal(InvalidUserId, info[0].UserId);
|
|
|
|
|
Assert.Equal(SaveDataType.Bcat, info[0].Type);
|
|
|
|
|
}
|
2021-11-14 20:08:57 +01:00
|
|
|
|
}
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public static void EnsureApplicationSaveData_CreatesTemporaryStorage()
|
|
|
|
|
{
|
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(true);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
var applicationId = new Ncm.ApplicationId(11);
|
|
|
|
|
var userId = new Uid(2, 3);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
var controlProperty = new ApplicationControlProperty
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
TemporaryStorageSize = 0x1000
|
|
|
|
|
};
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
2022-04-02 02:32:38 +02:00
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
void AssertSaveExists()
|
|
|
|
|
{
|
|
|
|
|
using var iterator = new UniqueRef<SaveDataIterator>();
|
|
|
|
|
fs.OpenSaveDataIterator(ref iterator.Ref(), SaveDataSpaceId.Temporary);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
var info = new SaveDataInfo[2];
|
|
|
|
|
Assert.Success(iterator.Get.ReadSaveDataInfo(out long entriesRead, info));
|
|
|
|
|
|
|
|
|
|
Assert.Equal(1, entriesRead);
|
|
|
|
|
Assert.Equal(applicationId, info[0].ProgramId);
|
|
|
|
|
Assert.Equal(InvalidUserId, info[0].UserId);
|
|
|
|
|
Assert.Equal(SaveDataType.Temporary, info[0].Type);
|
|
|
|
|
}
|
2021-11-14 20:08:57 +01:00
|
|
|
|
}
|
2022-04-02 02:32:38 +02:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public static void EnsureApplicationSaveData_NeedsExtension_IsExtended()
|
|
|
|
|
{
|
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(true);
|
|
|
|
|
|
|
|
|
|
var applicationId = new Ncm.ApplicationId(11);
|
|
|
|
|
var userId = new Uid(2, 3);
|
|
|
|
|
|
|
|
|
|
var controlProperty = new ApplicationControlProperty
|
|
|
|
|
{
|
|
|
|
|
UserAccountSaveDataSize = 0x1000,
|
|
|
|
|
UserAccountSaveDataJournalSize = 0x1000
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
|
|
|
|
|
|
|
|
|
const int newAvailableSize = 1024 * 1024 * 2;
|
|
|
|
|
const int newJournalSize = 1024 * 1024;
|
|
|
|
|
|
|
|
|
|
controlProperty.UserAccountSaveDataSize = newAvailableSize;
|
|
|
|
|
controlProperty.UserAccountSaveDataJournalSize = newJournalSize;
|
|
|
|
|
|
|
|
|
|
Assert.Success(fs.EnsureApplicationSaveData(out _, applicationId, in controlProperty, in userId));
|
|
|
|
|
|
|
|
|
|
using var iterator = new UniqueRef<SaveDataIterator>();
|
|
|
|
|
fs.OpenSaveDataIterator(ref iterator.Ref(), SaveDataSpaceId.User);
|
|
|
|
|
|
|
|
|
|
var info = new SaveDataInfo[2];
|
|
|
|
|
Assert.Success(iterator.Get.ReadSaveDataInfo(out long entriesRead, info));
|
|
|
|
|
|
|
|
|
|
Assert.Equal(1, entriesRead);
|
|
|
|
|
Assert.Equal(applicationId, info[0].ProgramId);
|
|
|
|
|
Assert.Equal(Utility.ConvertAccountUidToFsUserId(userId), info[0].UserId);
|
|
|
|
|
Assert.Equal(SaveDataType.Account, info[0].Type);
|
|
|
|
|
|
|
|
|
|
// ReSharper disable UnusedVariable
|
|
|
|
|
Assert.Success(fs.GetSaveDataAvailableSize(out long availableSize, SaveDataSpaceId.User, info[0].SaveDataId));
|
|
|
|
|
Assert.Success(fs.GetSaveDataJournalSize(out long journalSize, SaveDataSpaceId.User, info[0].SaveDataId));
|
|
|
|
|
// ReSharper restore UnusedVariable
|
|
|
|
|
|
|
|
|
|
// Todo: Remove once save data extension is implemented
|
|
|
|
|
// Assert.Equal(newAvailableSize, availableSize);
|
|
|
|
|
// Assert.Equal(newJournalSize, journalSize);
|
|
|
|
|
}
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public static void EnsureApplicationCacheStorage_SdCardAvailable_CreatesCacheStorageOnSd()
|
|
|
|
|
{
|
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(true);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
var applicationId = new Ncm.ApplicationId(11);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
var controlProperty = new ApplicationControlProperty
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
CacheStorageSize = 0x1000,
|
|
|
|
|
CacheStorageJournalSize = 0x1000
|
|
|
|
|
};
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
Assert.Success(fs.EnsureApplicationCacheStorage(out _, out CacheStorageTargetMedia target, applicationId,
|
2022-01-24 23:02:32 +01:00
|
|
|
|
in controlProperty));
|
2022-04-02 02:32:38 +02:00
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
Assert.Success(fs.EnsureApplicationCacheStorage(out _, out target, applicationId, in controlProperty));
|
|
|
|
|
AssertSaveExists();
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
void AssertSaveExists()
|
|
|
|
|
{
|
|
|
|
|
Assert.Equal(CacheStorageTargetMedia.SdCard, target);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
using var iterator = new UniqueRef<SaveDataIterator>();
|
|
|
|
|
fs.OpenSaveDataIterator(ref iterator.Ref(), SaveDataSpaceId.SdUser);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-04-02 02:32:38 +02:00
|
|
|
|
var info = new SaveDataInfo[2];
|
|
|
|
|
Assert.Success(iterator.Get.ReadSaveDataInfo(out long entriesRead, info));
|
|
|
|
|
|
|
|
|
|
Assert.Equal(1, entriesRead);
|
|
|
|
|
Assert.Equal(applicationId, info[0].ProgramId);
|
|
|
|
|
Assert.Equal(SaveDataType.Cache, info[0].Type);
|
|
|
|
|
}
|
2021-11-14 20:08:57 +01:00
|
|
|
|
}
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public static void EnsureApplicationCacheStorage_SdCardNotAvailable_CreatesCacheStorageOnBis()
|
|
|
|
|
{
|
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(false);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
var applicationId = new Ncm.ApplicationId(11);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
var controlProperty = new ApplicationControlProperty
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
CacheStorageSize = 0x1000,
|
|
|
|
|
CacheStorageJournalSize = 0x1000
|
|
|
|
|
};
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
Assert.Success(fs.EnsureApplicationCacheStorage(out _, out CacheStorageTargetMedia target, applicationId,
|
2022-01-24 23:02:32 +01:00
|
|
|
|
in controlProperty));
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
Assert.Equal(CacheStorageTargetMedia.Nand, target);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
using var iterator = new UniqueRef<SaveDataIterator>();
|
|
|
|
|
fs.OpenSaveDataIterator(ref iterator.Ref(), SaveDataSpaceId.User);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
var info = new SaveDataInfo[2];
|
|
|
|
|
Assert.Success(iterator.Get.ReadSaveDataInfo(out long entriesRead, info));
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
Assert.Equal(1, entriesRead);
|
|
|
|
|
Assert.Equal(applicationId, info[0].ProgramId);
|
|
|
|
|
Assert.Equal(SaveDataType.Cache, info[0].Type);
|
|
|
|
|
}
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(true)]
|
|
|
|
|
[InlineData(false)]
|
|
|
|
|
public static void GetCacheStorageTargetMedia_ReturnsTargetOfNewCacheStorage(bool isSdCardInserted)
|
|
|
|
|
{
|
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(isSdCardInserted);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
var applicationId = new Ncm.ApplicationId(11);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
var controlProperty = new ApplicationControlProperty
|
2020-02-19 07:12:23 +01:00
|
|
|
|
{
|
2021-11-14 20:08:57 +01:00
|
|
|
|
CacheStorageSize = 0x1000,
|
|
|
|
|
CacheStorageJournalSize = 0x1000
|
|
|
|
|
};
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2022-01-24 23:02:32 +01:00
|
|
|
|
fs.EnsureApplicationCacheStorage(out _, out CacheStorageTargetMedia targetFromCreation, applicationId,
|
|
|
|
|
in controlProperty);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
Assert.Success(fs.GetCacheStorageTargetMedia(out CacheStorageTargetMedia target, applicationId));
|
|
|
|
|
Assert.Equal(targetFromCreation, target);
|
|
|
|
|
}
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public static void GetCacheStorageTargetMedia_CacheStorageDoesNotExist_ReturnsNone()
|
|
|
|
|
{
|
|
|
|
|
FileSystemClient fs = FileSystemServerFactory.CreateClient(true);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
|
2021-11-14 20:08:57 +01:00
|
|
|
|
Assert.Success(fs.GetCacheStorageTargetMedia(out CacheStorageTargetMedia target, new Ncm.ApplicationId(11)));
|
|
|
|
|
Assert.Equal(CacheStorageTargetMedia.None, target);
|
2020-02-19 07:12:23 +01:00
|
|
|
|
}
|
2021-12-29 18:13:42 +01:00
|
|
|
|
}
|