Persist channel DRED settings
Build and test / test (macos-latest) (push) Canceled after 0s
Build and test / test (ubuntu-24.04) (push) Canceled after 0s
Build and test / test (windows-latest) (push) Canceled after 0s
Build and test / apple-client (push) Canceled after 0s

This commit is contained in:
2026-09-22 14:11:36 +02:00
parent 8471eac363
commit 7c4708c3de
9 changed files with 101 additions and 11 deletions
+29
View File
@@ -54,4 +54,33 @@ public sealed class AccountStoreTests
}
finally { Directory.Delete(directory, true); }
}
[Fact]
public void VersionTwoDatabaseMigratesDredAsDisabled()
{
string directory = Path.Combine(Path.GetTempPath(), "voicecat-v2-" + Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(directory);
string path = Path.Combine(directory, "voicecat.db");
try
{
using (var store = new AccountStore(path)) store.LoadChannels();
using (var connection = new SqliteConnection(new SqliteConnectionStringBuilder { DataSource = path, Pooling = false }.ToString()))
{
connection.Open();
using var command = connection.CreateCommand();
command.CommandText = "ALTER TABLE channels DROP COLUMN audio_dred; UPDATE server_meta SET value='2' WHERE key='schema_version';";
command.ExecuteNonQuery();
}
using (var migrated = new AccountStore(path))
Assert.All(migrated.LoadChannels(), channel => Assert.False(channel.Audio.Dred));
using var verify = new SqliteConnection(new SqliteConnectionStringBuilder { DataSource = path, Pooling = false }.ToString());
verify.Open();
using var query = verify.CreateCommand();
query.CommandText = "SELECT value FROM server_meta WHERE key='schema_version'";
Assert.Equal("3", query.ExecuteScalar());
}
finally { Directory.Delete(directory, true); }
}
}
@@ -99,4 +99,33 @@ public class ChannelManagementTests
Assert.True(await ResultAsync(admin, new() { DeleteChannel = new() { ChannelId = child.Id } }));
Assert.True(await ResultAsync(admin, new() { DeleteChannel = new() { ChannelId = parent.Id } }));
}
[Fact]
public async Task DredAudioSettingsRoundTripThroughEditAndDatabaseRestart()
{
await using var fixture = new ServerFixture();
await using var admin = await AdminAsync(fixture);
using (var store = new AccountStore(Path.Combine(fixture.Directory, "voicecat.db")))
{
Channel music = store.LoadChannels().Single(c => c.Name == "Music Room");
music.Audio.SampleRate = 48_000;
music.Audio.BitrateBps = 128_000;
music.Audio.ExpectedPacketLoss = 15;
music.Audio.Dtx = true;
music.Audio.Fec = true;
music.Audio.Dred = true;
music.Audio.Complexity = 10;
Assert.True(await ResultAsync(admin, new() { EditChannel = new() { Channel = music } }));
}
using var reopened = new AccountStore(Path.Combine(fixture.Directory, "voicecat.db"));
AudioConfig audio = reopened.LoadChannels().Single(c => c.Name == "Music Room").Audio;
Assert.Equal(48_000U, audio.SampleRate);
Assert.Equal(128_000U, audio.BitrateBps);
Assert.Equal(15U, audio.ExpectedPacketLoss);
Assert.True(audio.Dtx);
Assert.True(audio.Fec);
Assert.True(audio.Dred);
Assert.Equal(10U, audio.Complexity);
}
}
@@ -78,6 +78,25 @@ public class WindowsManagedClientTests
Assert.Empty(alice.ManagedClient.LocalStreams);
}
[Fact]
public async Task WindowsChannelEditorSettingsRoundTripFromServer()
{
await using var fixture = new ServerFixture();
using (var accounts = new AccountStore(Path.Combine(fixture.Directory, "voicecat.db")))
await accounts.CreateAccountAsync("Admin", "secret", true);
using var client = new Client("Admin", "test", tofuStorePath: Path.Combine(fixture.Directory, "admin.pins"));
await Login(client, fixture, true);
ChannelInfo music = client.ListChannels().Single(c => c.Name == "Music Room");
var expected = new AudioConfigInfo(0, true, 48_000, 128_000, 20, 1, true, 15, true, 10, true);
var edit = new ChannelEditInfo(music.Id, music.ParentId, music.Name, music.Topic,
music.PasswordProtected, null, music.MaxUsers, music.SortOrder, expected);
Assert.Equal(VcResult.Ok, client.EditChannel(edit));
await Until(client, () => client.ListChannels().Single(c => c.Id == music.Id).Audio.Dred);
Assert.Equal(expected, client.ListChannels().Single(c => c.Id == music.Id).Audio);
}
[Fact]
public async Task WindowsScreenAudioPreservesDistinctStereoChannels()
{