Files
ClawdDotNet/tests/ClawdDotNet.Core.Tests/Storage/OwnerOnlyFileTests.cs
T
RichardandClaude Opus 5.5 837a634a22 Stufe 4c (#764): Kommentare in C#, WebUI-Skripten, CSS und HTML auf Englisch
Rund 2.600 Kommentarblöcke in 310 C#-Dateien übersetzt, Begründungen vollständig
erhalten: blockweise gleiche Anzahl wie vorher, kein Block unter 60 % seiner
Länge, der Code außerhalb der Kommentare per Tokenizer byte-identisch geprüft.
Zitate deutscher Oberflächentexte und Testdaten bleiben deutsch.

WebUI: Kommentare in JS/CSS/HTML übersetzt, JSDoc-@param an die in 4b
umbenannten Parameter angeglichen.

Dabei behoben:
- 4b hatte "tag" (HTML-Tag) als deutsches "Tag" gelesen und zu "dayValue"
  gemacht (makeElement, svg, Tagesübersicht) - zurück auf tag/day.
- Aufgaben "InProgress" bekamen die Plakettenart "laufend", für die es nie eine
  CSS-Klasse gab - jetzt "success" wie laufende Instanzen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 12:45:03 +02:00

75 lines
2.4 KiB
C#

using ClawdDotNet.Core.Storage;
using ClawdDotNet.Core.Tests.Infrastructure;
using Shouldly;
namespace ClawdDotNet.Core.Tests.Storage;
/// <summary>
/// #575: On the test VM (umask 0002) InstanceSettings.json went from
/// 0600 to 0664 on the first save, logs were created with 0664. Not meaningful under Windows.
/// </summary>
public sealed class OwnerOnlyFileTests : IDisposable
{
private readonly string _dir = Path.Combine(Path.GetTempPath(), "clawd-owner-" + Guid.NewGuid().ToString("N")[..8]);
public OwnerOnlyFileTests() => Directory.CreateDirectory(_dir);
public void Dispose()
{
try { Directory.Delete(_dir, recursive: true); } catch { /* Cleaning up is best effort */ }
}
private const UnixFileMode NurBesitzer = UnixFileMode.UserRead | UnixFileMode.UserWrite;
[LinuxFact]
[System.Runtime.Versioning.SupportedOSPlatform("linux")]
public void AtomicFile_ersetzt_eine_offene_Datei_durch_eine_nur_fuer_den_Besitzer()
{
var pfad = Path.Combine(_dir, "InstanceSettings.json");
File.WriteAllText(pfad, "{}");
File.SetUnixFileMode(pfad, NurBesitzer | UnixFileMode.GroupRead | UnixFileMode.OtherRead);
AtomicFile.WriteAllText(pfad, "{\"a\":1}");
File.GetUnixFileMode(pfad).ShouldBe(NurBesitzer);
}
[LinuxFact]
[System.Runtime.Versioning.SupportedOSPlatform("linux")]
public void AtomicFile_legt_neue_Dateien_nur_fuer_den_Besitzer_an()
{
var pfad = Path.Combine(_dir, "neu.json");
AtomicFile.WriteAllText(pfad, "{}");
File.GetUnixFileMode(pfad).ShouldBe(NurBesitzer);
}
[LinuxFact]
[System.Runtime.Versioning.SupportedOSPlatform("linux")]
public void OpenAppend_legt_neue_Dateien_nur_fuer_den_Besitzer_an()
{
var pfad = Path.Combine(_dir, "protokoll.log");
using (var stream = OwnerOnlyFile.OpenAppend(pfad))
stream.WriteByte((byte)'x');
File.GetUnixFileMode(pfad).ShouldBe(NurBesitzer);
}
[Fact]
public void OpenAppend_haengt_an_statt_zu_ueberschreiben()
{
var pfad = Path.Combine(_dir, "anhang.txt");
foreach (var teil in new[] { "eins", "zwei" })
{
using var stream = OwnerOnlyFile.OpenAppend(pfad);
using var writer = new StreamWriter(stream);
writer.Write(teil);
}
File.ReadAllText(pfad).ShouldBe("einszwei");
}
}