Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
finished split
  • Loading branch information
bitsandfoxes committed Sep 25, 2024
commit 2803559c26d3703b487da76b3bcda7318dfa537e
2 changes: 2 additions & 0 deletions src/Sentry/FileAttachmentContent.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Sentry.Internal;

namespace Sentry;

/// <summary>
Expand Down
4 changes: 2 additions & 2 deletions src/Sentry/Http/HttpTransportBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ private void HandleFailure(HttpResponseMessage response, Envelope envelope)
return;
}

var (result, envelopeFile) = _options.FileSystem.CreateFileForWriting(destination);
var result = _options.FileSystem.CreateFileForWriting(destination, out var envelopeFile);
if (result is not FileOperationResult.Success)
{
_options.LogError("Failed to create envelope file.");
Expand Down Expand Up @@ -457,7 +457,7 @@ private async Task HandleFailureAsync(HttpResponseMessage response, Envelope env
return;
}

var (result, envelopeFile) = _options.FileSystem.CreateFileForWriting(destination);
var result = _options.FileSystem.CreateFileForWriting(destination, out var envelopeFile);
if (result is not FileOperationResult.Success)
{
_options.LogError("Failed to create envelope file.");
Expand Down
2 changes: 1 addition & 1 deletion src/Sentry/ISentryJsonSerializable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ internal static class JsonSerializableExtensions
{
public static void WriteToFile(this ISentryJsonSerializable serializable, IFileSystem fileSystem, string filePath, IDiagnosticLogger? logger)
{
var (result, file) = fileSystem.CreateFileForWriting(filePath);
var result = fileSystem.CreateFileForWriting(filePath, out var file);
if (result is not FileOperationResult.Success)
{
return;
Expand Down
29 changes: 29 additions & 0 deletions src/Sentry/Internal/FileSystemBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace Sentry.Internal;

internal abstract class FileSystemBase : IFileSystem
{
public IEnumerable<string> EnumerateFiles(string path) => Directory.EnumerateFiles(path);

public IEnumerable<string> EnumerateFiles(string path, string searchPattern) =>
Directory.EnumerateFiles(path, searchPattern);

public IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOption) =>
Directory.EnumerateFiles(path, searchPattern, searchOption);

public bool DirectoryExists(string path) => Directory.Exists(path);

public bool FileExists(string path) => File.Exists(path);

public DateTimeOffset GetFileCreationTime(string path) => new FileInfo(path).CreationTimeUtc;

public string ReadAllTextFromFile(string path) => File.ReadAllText(path);

public Stream OpenFileForReading(string path) => File.OpenRead(path);

public abstract FileOperationResult CreateDirectory(string path);
public abstract FileOperationResult DeleteDirectory(string path, bool recursive = false);
public abstract FileOperationResult CreateFileForWriting(string path, out Stream fileStream);
public abstract FileOperationResult WriteAllTextToFile(string path, string contents);
public abstract FileOperationResult MoveFile(string sourceFileName, string destFileName, bool overwrite = false);
public abstract FileOperationResult DeleteFile(string path);
}
2 changes: 1 addition & 1 deletion src/Sentry/Internal/Http/CachingTransport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ private async Task StoreToCacheAsync(

EnsureFreeSpaceInCache();

var (result, stream) = _fileSystem.CreateFileForWriting(envelopeFilePath);
var result = _options.FileSystem.CreateFileForWriting(envelopeFilePath, out var stream);
if (result is not FileOperationResult.Success)
{
_options.LogDebug("Failed to store to cache.");
Expand Down
17 changes: 6 additions & 11 deletions src/Sentry/Internal/IFileSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,16 @@ internal interface IFileSystem
IEnumerable<string> EnumerateFiles(string path);
IEnumerable<string> EnumerateFiles(string path, string searchPattern);
IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOption);
FileOperationResult CreateDirectory(string path);
FileOperationResult DeleteDirectory(string path, bool recursive = false);
bool DirectoryExists(string path);
bool FileExists(string path);
FileOperationResult MoveFile(string sourceFileName, string destFileName, bool overwrite = false);
FileOperationResult DeleteFile(string path);
DateTimeOffset GetFileCreationTime(string path);
string? ReadAllTextFromFile(string file);
Stream OpenFileForReading(string path);
Stream OpenFileForReading(string path,
bool useAsync,
FileMode fileMode = FileMode.Open,
FileAccess fileAccess = FileAccess.Read,
FileShare fileShare = FileShare.ReadWrite,
int bufferSize = 4096);
(FileOperationResult, Stream) CreateFileForWriting(string path);

FileOperationResult CreateDirectory(string path);
FileOperationResult DeleteDirectory(string path, bool recursive = false);
FileOperationResult CreateFileForWriting(string path, out Stream fileStream);
FileOperationResult WriteAllTextToFile(string path, string contents);
FileOperationResult MoveFile(string sourceFileName, string destFileName, bool overwrite = false);
FileOperationResult DeleteFile(string path);
}
58 changes: 11 additions & 47 deletions src/Sentry/Internal/ReadOnlyFilesystem.cs
Original file line number Diff line number Diff line change
@@ -1,57 +1,21 @@
using Sentry.Extensibility;

namespace Sentry.Internal;

internal class ReadOnlyFileSystem : IFileSystem
internal class ReadOnlyFileSystem : FileSystemBase
{
public IEnumerable<string> EnumerateFiles(string path) => Directory.EnumerateFiles(path);

public IEnumerable<string> EnumerateFiles(string path, string searchPattern) =>
Directory.EnumerateFiles(path, searchPattern);

public IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOption) =>
Directory.EnumerateFiles(path, searchPattern, searchOption);

public FileOperationResult CreateDirectory(string path) => FileOperationResult.Disabled;

public FileOperationResult DeleteDirectory(string path, bool recursive = false) => FileOperationResult.Disabled;

public bool DirectoryExists(string path) => Directory.Exists(path);

public bool FileExists(string path) => File.Exists(path);

public FileOperationResult MoveFile(string sourceFileName, string destFileName, bool overwrite = false) =>
FileOperationResult.Disabled;

public FileOperationResult DeleteFile(string path) => FileOperationResult.Disabled;

public DateTimeOffset GetFileCreationTime(string path) => new FileInfo(path).CreationTimeUtc;

public string ReadAllTextFromFile(string path) => File.ReadAllText(path);
public override FileOperationResult CreateDirectory(string path) => FileOperationResult.Disabled;

public Stream OpenFileForReading(string path) => File.OpenRead(path);
public override FileOperationResult DeleteDirectory(string path, bool recursive = false) => FileOperationResult.Disabled;

public Stream OpenFileForReading(string path,
bool useAsync,
FileMode fileMode = FileMode.Open,
FileAccess fileAccess = FileAccess.Read,
FileShare fileShare = FileShare.ReadWrite,
int bufferSize = 4096)
public override FileOperationResult CreateFileForWriting(string path, out Stream fileStream)
{
return new FileStream(
path,
fileMode,
fileAccess,
fileShare,
bufferSize: bufferSize,
useAsync: useAsync);
fileStream = Stream.Null;
return FileOperationResult.Disabled;
}

public (FileOperationResult, Stream) CreateFileForWriting(string path) => (FileOperationResult.Disabled, Stream.Null);
public override FileOperationResult WriteAllTextToFile(string path, string contents) => FileOperationResult.Disabled;

public FileOperationResult WriteAllTextToFile(string path, string contents)
{
File.WriteAllText(path, contents);
return File.Exists(path) ? FileOperationResult.Success : FileOperationResult.Failure;
}
public override FileOperationResult MoveFile(string sourceFileName, string destFileName, bool overwrite = false) =>
FileOperationResult.Disabled;

public override FileOperationResult DeleteFile(string path) => FileOperationResult.Disabled;
}
65 changes: 16 additions & 49 deletions src/Sentry/Internal/ReadWriteFileSystem.cs
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
namespace Sentry.Internal;

internal class ReadWriteFileSystem : IFileSystem
internal class ReadWriteFileSystem : FileSystemBase
{
public IEnumerable<string> EnumerateFiles(string path) => Directory.EnumerateFiles(path);

public IEnumerable<string> EnumerateFiles(string path, string searchPattern) =>
Directory.EnumerateFiles(path, searchPattern);

public IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOption) =>
Directory.EnumerateFiles(path, searchPattern, searchOption);

public FileOperationResult CreateDirectory(string path)
public override FileOperationResult CreateDirectory(string path)
{
Directory.CreateDirectory(path);
return DirectoryExists(path) ? FileOperationResult.Success : FileOperationResult.Failure;
}

public FileOperationResult DeleteDirectory(string path, bool recursive = false)
public override FileOperationResult DeleteDirectory(string path, bool recursive = false)
{
Directory.Delete(path, recursive);
return Directory.Exists(path) ? FileOperationResult.Failure : FileOperationResult.Success;
return Directory.Exists(path) ? FileOperationResult.Failure : FileOperationResult.Success;
}

public bool DirectoryExists(string path) => Directory.Exists(path);
public override FileOperationResult CreateFileForWriting(string path, out Stream fileStream)
{
fileStream = File.Create(path);
return FileOperationResult.Success;
}

public bool FileExists(string path) => File.Exists(path);
public override FileOperationResult WriteAllTextToFile(string path, string contents)
{
File.WriteAllText(path, contents);
return File.Exists(path) ? FileOperationResult.Success : FileOperationResult.Failure;
}

public FileOperationResult MoveFile(string sourceFileName, string destFileName, bool overwrite = false)
public override FileOperationResult MoveFile(string sourceFileName, string destFileName, bool overwrite = false)
{
#if NETCOREAPP3_0_OR_GREATER
File.Move(sourceFileName, destFileName, overwrite);
Expand All @@ -50,42 +50,9 @@ public FileOperationResult MoveFile(string sourceFileName, string destFileName,
return FileOperationResult.Success;
}

public FileOperationResult DeleteFile(string path)
public override FileOperationResult DeleteFile(string path)
{
File.Delete(path);
return File.Exists(path) ? FileOperationResult.Failure : FileOperationResult.Success;
}

public DateTimeOffset GetFileCreationTime(string path) => new FileInfo(path).CreationTimeUtc;

public string ReadAllTextFromFile(string path) => File.ReadAllText(path);

public Stream OpenFileForReading(string path) => File.OpenRead(path);

public Stream OpenFileForReading(string path,
bool useAsync,
FileMode fileMode = FileMode.Open,
FileAccess fileAccess = FileAccess.Read,
FileShare fileShare = FileShare.ReadWrite,
int bufferSize = 4096)
{
return new FileStream(
path,
fileMode,
fileAccess,
fileShare,
bufferSize: bufferSize,
useAsync: useAsync);
}

public (FileOperationResult, Stream) CreateFileForWriting(string path)
{
return (FileOperationResult.Success, File.Create(path));
}

public FileOperationResult WriteAllTextToFile(string path, string contents)
{
File.WriteAllText(path, contents);
return File.Exists(path) ? FileOperationResult.Success : FileOperationResult.Failure;
}
}
8 changes: 6 additions & 2 deletions src/Sentry/SentryOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -722,11 +722,16 @@ public IList<SubstringOrRegexPattern> FailedRequestTargets
set => _failedRequestTargets = new(value.WithConfigBinding);
}

private IFileSystem? _fileSystem;
/// <summary>
/// Sets the filesystem instance to use. Defaults to the actual <see cref="ReadWriteFileSystem"/>.
/// Used for testing.
/// </summary>
internal IFileSystem FileSystem { get; set; }
internal IFileSystem FileSystem
{
get => _fileSystem ??= DisableFileWrite ? new ReadOnlyFileSystem() : new ReadWriteFileSystem();
set => _fileSystem = value;
}

/// <summary>
/// Allows to disable the SDKs writing to disk operations
Expand Down Expand Up @@ -1184,7 +1189,6 @@ public bool JsonPreserveReferences
/// </summary>
public SentryOptions()
{
FileSystem = new ReadOnlyFileSystem();
SettingLocator = new SettingLocator(this);
_lazyInstallationId = new(() => new InstallationIdHelper(this).TryGetInstallationId());

Expand Down
8 changes: 0 additions & 8 deletions src/Sentry/SentrySdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,6 @@ internal static IHub InitHub(SentryOptions options)
{
options.SetupLogging();

// For testing: Only overwrite the ReadOnlyFileSystem with a Read-Write one
if (options is { DisableFileWrite: true, FileSystem: ReadOnlyFileSystem })
{
options.LogDebug("File write has been disabled.");
options.FileSystem = new ReadWriteFileSystem();
}


ProcessInfo.Instance ??= new ProcessInfo(options);

// Locate the DSN
Expand Down
5 changes: 3 additions & 2 deletions test/Sentry.Testing/FakeFileSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,10 @@ public Stream OpenFileForReading(string path,
useAsync: useAsync);
}

public (FileOperationResult, Stream) CreateFileForWriting(string path)
public FileOperationResult CreateFileForWriting(string path, out Stream stream)
{
return (FileOperationResult.Success, _fileSystem.File.Create(path));
stream = _fileSystem.File.Create(path);
return FileOperationResult.Success;
}

public FileOperationResult WriteAllTextToFile(string path, string contents)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ public async Task Handle_Malformed_Envelopes_Gracefully()
var filePath = Path.Combine(processingDirectoryPath, fileName);

options.FileSystem.CreateDirectory(processingDirectoryPath); // Create the processing directory
var (result, file) = options.FileSystem.CreateFileForWriting(filePath);
options.FileSystem.CreateFileForWriting(filePath, out var file);
file.Dispose(); // Make a malformed envelope... just an empty file
options.FileSystem.FileExists(filePath).Should().BeTrue();

Expand Down
33 changes: 33 additions & 0 deletions test/Sentry.Tests/ReadOnlyFileSystemTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
namespace Sentry.Tests;

public class ReadOnlyFileSystemTests
{
private readonly ReadOnlyFileSystem _sut = new();

[Fact]
public void CreateDirectory_ReturnsFileOperationResultDisabled() =>
Assert.Equal(FileOperationResult.Disabled, _sut.CreateDirectory("someDirectory"));

[Fact]
public void DeleteDirectory_ReturnsFileOperationResultDisabled() =>
Assert.Equal(FileOperationResult.Disabled, _sut.DeleteDirectory("someDirectory"));

[Fact]
public void CreateFileForWriting_ReturnsFileOperationResultDisabledAndNullStream()
{
Assert.Equal(FileOperationResult.Disabled, _sut.CreateFileForWriting("someFile", out var fileStream));
Assert.Equal(Stream.Null, fileStream);
}

[Fact]
public void WriteAllTextToFile_ReturnsFileOperationDisabled() =>
Assert.Equal(FileOperationResult.Disabled, _sut.WriteAllTextToFile("someFile", "someContent"));

[Fact]
public void MoveFile_ReturnsFileOperationDisabled() =>
Assert.Equal(FileOperationResult.Disabled, _sut.MoveFile("someSourceFile", "someDestinationFile"));

[Fact]
public void DeleteFile_ReturnsFileOperationResultDisabled() =>
Assert.Equal(FileOperationResult.Disabled, _sut.DeleteFile("someFile"));
}
Loading