Skip to content

Commit 0d32fac

Browse files
authored
Version 2.0.4 (#16)
## Version 2.0.4 - 23.09.2018 - `BacktraceClient` allows developer to unpack `AggregateException` and send only exceptions available in `InnerExceptions` property. - `BacktraceReport` accepts two new properties: `Factor` and `Fingerprint`. These properties allows you to change server side algorithms. - `BacktraceData` now include informations about `Exception` properties. You can check detailed `Exception` properties in Annotations. - `BacktraceDatabase` doesn't throw exception when developer can't add new record. This situation exists when database was full or database hasn't enough disk space for exceptions. - `BacktraceResult` can use new `Status`. In case when developer want to unpack `AggregateException` and `InnerExceptions` property is empty, `BacktraceClient` return `BacktraceResult` with status `Empty`,
1 parent a5f98ba commit 0d32fac

31 files changed

Lines changed: 485 additions & 197 deletions

Backtrace.Tests/Backtrace.Tests.csproj

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,6 @@
1212
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
1313
<PackageReference Include="RichardSzalay.MockHttp" Version="5.0.0" />
1414
</ItemGroup>
15-
<ItemGroup>
16-
<None Remove="IntegrationTests\Template.cshtml" />
17-
</ItemGroup>
18-
<ItemGroup>
19-
<Compile Remove="IntegrationTests\Template.cs" />
20-
</ItemGroup>
2115
<ItemGroup>
2216
<ProjectReference Include="..\Backtrace\Backtrace.csproj" />
2317
</ItemGroup>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using Backtrace.Interfaces;
2+
using Backtrace.Model;
3+
using Backtrace.Types;
4+
using Moq;
5+
using NUnit.Framework;
6+
using System;
7+
using System.Collections.Generic;
8+
9+
namespace Backtrace.Tests.ClientTests
10+
{
11+
[TestFixture(
12+
Author = "Konrad Dysput",
13+
Category = "Client.AggreagateException",
14+
Description = "Test client bahaviour for handling aggreagate exceptions")]
15+
public class AggregateExceptionTests
16+
{
17+
protected BacktraceClient _backtraceClient;
18+
19+
[SetUp]
20+
public virtual void Setup()
21+
{
22+
var api = new Mock<IBacktraceApi>();
23+
api.Setup(n => n.Send(It.IsAny<BacktraceData>()))
24+
.Returns(new BacktraceResult() { Status = BacktraceResultStatus.Ok });
25+
26+
api.Setup(n => n.SendAsync(It.IsAny<BacktraceData>()))
27+
.ReturnsAsync(() => new BacktraceResult() { Status = BacktraceResultStatus.Ok });
28+
29+
var credentials = new BacktraceCredentials(@"https://validurl.com/", "validToken");
30+
_backtraceClient = new BacktraceClient(credentials)
31+
{
32+
BacktraceApi = api.Object,
33+
UnpackAggregateExcetpion = true
34+
};
35+
}
36+
37+
[Test(Description = "Test empty aggregate exception")]
38+
public void TestEmptyAggreagateException()
39+
{
40+
var aggregateException = new AggregateException("test exception");
41+
var result = _backtraceClient.Send(aggregateException);
42+
Assert.IsNotNull(result);
43+
Assert.AreEqual(result.Status, BacktraceResultStatus.Empty);
44+
}
45+
46+
[Test(Description = "Test default scenario for aggregate exception")]
47+
public void TestAggreagateException()
48+
{
49+
var aggregateException = new AggregateException("test exception",
50+
new List<Exception>() {
51+
new ArgumentException("argument exception"),
52+
new InvalidOperationException("invalid operation exception"),
53+
new FormatException("format exception"),
54+
});
55+
var result = _backtraceClient.Send(aggregateException);
56+
57+
Assert.IsNotNull(result);
58+
Assert.AreEqual(result.Status, BacktraceResultStatus.Ok);
59+
60+
int totalReports = 0;
61+
while (result != null)
62+
{
63+
totalReports++;
64+
result = result.InnerExceptionResult;
65+
}
66+
Assert.AreEqual(3, totalReports);
67+
68+
}
69+
}
70+
}

Backtrace.Tests/ClientTests/LogCreationBase.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@
22
using Backtrace.Model;
33
using Moq;
44
using NUnit.Framework;
5-
using System;
65
using System.Collections.Generic;
7-
using System.Linq;
8-
using System.Text;
9-
using System.Threading.Tasks;
106

117
namespace Backtrace.Tests.ClientTests
128
{
@@ -19,7 +15,9 @@ public class LogCreationBase
1915
public virtual void Setup()
2016
{
2117
var api = new Mock<IBacktraceApi>();
22-
api.Setup(n => n.Send(It.IsAny<BacktraceData>())).Returns(new BacktraceResult());
18+
api.Setup(n => n.Send(It.IsAny<BacktraceData>()))
19+
.Returns(new BacktraceResult() { Status = Types.BacktraceResultStatus.Ok });
20+
2321
var credentials = new BacktraceCredentials(@"https://validurl.com/", "validToken");
2422
_backtraceClient = new BacktraceClient(credentials)
2523
{

Backtrace.Tests/DatabaseTests/BatchTests.cs

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
using Backtrace.Tests.DatabaseTests.Model;
22
using NUnit.Framework;
3-
using System;
4-
using System.Collections.Generic;
5-
using System.Linq;
6-
using System.Text;
7-
using System.Threading.Tasks;
83

94
namespace Backtrace.Tests.DatabaseTests
105
{
@@ -17,11 +12,12 @@ public class BatchTests : DatabaseTestBase
1712
/// <summary>
1813
/// Add record to first batch on context
1914
/// </summary>
20-
private void AddRecords(int numberOfRecordsOnBatch)
15+
private void AddRecords(int numberOfRecordsOnBatch, bool locked = false)
2116
{
2217
for (int i = 0; i < numberOfRecordsOnBatch; i++)
2318
{
24-
_database.BacktraceDatabaseContext.Add(GetRecord());
19+
var fakeRecord = _database.BacktraceDatabaseContext.Add(GetRecord());
20+
fakeRecord.Locked = locked;
2521
}
2622
}
2723
[TestCase(3, 2, 0)]
@@ -54,5 +50,43 @@ public void TestBatchAdd(int recordsOnFirstBatch, int recordsOnSecoundBatch, int
5450
totalRecords = _database.BacktraceDatabaseContext.Count();
5551
Assert.AreEqual(totalRecords, recordsOnFirstBatch + recordsOnSecoundBatch);
5652
}
53+
54+
[Test]
55+
public void TestRecordLimitInBatches()
56+
{
57+
_database.Start();
58+
_database.Clear();
59+
//value from database settings
60+
int maxRecordCount = 100;
61+
AddRecords(maxRecordCount);
62+
63+
var report = new Backtrace.Model.BacktraceReport("report");
64+
var result = _database.Add(
65+
backtraceReport: report,
66+
attributes: null,
67+
miniDumpType: Types.MiniDumpType.None
68+
);
69+
Assert.IsNotNull(result);
70+
Assert.AreEqual(maxRecordCount, _database.Count());
71+
}
72+
73+
[Test]
74+
public void TestRecordLimitWithAllReservedBatches()
75+
{
76+
_database.Start();
77+
_database.Clear();
78+
//value from database settings
79+
int maxRecordCount = 100;
80+
AddRecords(maxRecordCount, true);
81+
82+
var report = new Backtrace.Model.BacktraceReport("report");
83+
var result = _database.Add(
84+
backtraceReport: report,
85+
attributes: null,
86+
miniDumpType: Types.MiniDumpType.None
87+
);
88+
Assert.IsNull(result);
89+
Assert.AreEqual(maxRecordCount, _database.Count());
90+
}
5791
}
5892
}

Backtrace.Tests/DatabaseTests/DatabaseConditionTests.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
using Backtrace.Extensions;
22
using Backtrace.Interfaces;
3+
using Backtrace.Model;
34
using Backtrace.Model.Database;
45
using Moq;
56
using NUnit.Framework;
67
using System;
78
using System.Collections.Generic;
89
using System.IO;
9-
using System.Linq;
10-
using System.Text;
11-
using System.Threading.Tasks;
1210

1311
namespace Backtrace.Tests.DatabaseTests
1412
{
@@ -23,7 +21,7 @@ public class DatabaseConditionTests
2321
/// <summary>
2422
/// Current project directory - any database path
2523
/// </summary>
26-
private readonly string _projectDirectory = Environment.CurrentDirectory;
24+
private readonly string _projectDirectory = System.IO.Path.GetTempPath();
2725

2826
/// <summary>
2927
/// Total number of reports
@@ -41,7 +39,8 @@ public void Setup()
4139

4240
var backtraceDatabaseSettings = new BacktraceDatabaseSettings(_projectDirectory)
4341
{
44-
MaxRecordCount = _totalNumberOfReports
42+
MaxRecordCount = _totalNumberOfReports,
43+
RetryBehavior = Types.RetryBehavior.NoRetry
4544
};
4645

4746
_backtraceDatabase = new BacktraceDatabase(backtraceDatabaseSettings)
@@ -59,9 +58,11 @@ public void TestDatabaseRecordLimitConditions()
5958
_backtraceDatabase.Clear();
6059
for (int i = 0; i < _totalNumberOfReports; i++)
6160
{
62-
_backtraceDatabase.Add(backtraceReport, new Dictionary<string, object>(), Types.MiniDumpType.None);
61+
var record = _backtraceDatabase.Add(backtraceReport, new Dictionary<string, object>(), Types.MiniDumpType.None);
62+
record.Dispose();
6363
}
64-
Assert.Throws<ArgumentException>(() => _backtraceDatabase.Add(backtraceReport, new Dictionary<string, object>(),Types.MiniDumpType.None));
64+
_backtraceDatabase.Add(backtraceReport, new Dictionary<string, object>(), Types.MiniDumpType.None);
65+
Assert.AreEqual(_totalNumberOfReports, _backtraceDatabase.Count());
6566
}
6667

6768
[TestCase(1)]

Backtrace.Tests/DatabaseTests/DatabaseContextOperationTests.cs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
using Backtrace.Interfaces;
1+
using Backtrace.Model;
22
using Backtrace.Model.Database;
33
using Backtrace.Tests.DatabaseTests.Model;
44
using Backtrace.Types;
5-
using Moq;
65
using NUnit.Framework;
7-
using System;
86
using System.Collections.Generic;
9-
using System.Linq;
10-
using System.Text;
11-
using System.Threading.Tasks;
127

138
namespace Backtrace.Tests.DatabaseTests
149
{
@@ -36,14 +31,23 @@ public void TestMaximumNumberOfRecords()
3631
{
3732
_database.Clear();
3833
//we set maximum number of records to equal to 100 in Setup method on DatabaseTestBase class
39-
int maximumNumberOfRecords = 101;
34+
int maximumNumberOfRecords = 100;
4035
//we add 100 records - 100 is our database limit
41-
for (int i = 0; i < maximumNumberOfRecords - 1; i++)
36+
for (int i = 0; i < maximumNumberOfRecords; i++)
4237
{
43-
_database.BacktraceDatabaseContext.Add(GetRecord());
38+
var fakeRecord = GetRecord();
39+
var record = _database.BacktraceDatabaseContext.Add(fakeRecord);
40+
fakeRecord.Locked = false;
4441
}
4542
_database.Start();
46-
Assert.Throws<ArgumentException>(() => _database.Add(null, new Dictionary<string, object>(), MiniDumpType.None));
43+
_database.Add(
44+
backtraceReport: new BacktraceReport("fake report"),
45+
attributes: new Dictionary<string, object>(),
46+
miniDumpType: MiniDumpType.None);
47+
48+
// in the end BacktraceDatabase should contain 100 reports.
49+
// Database should remove first ever report.
50+
Assert.AreEqual(_database.Count(), maximumNumberOfRecords);
4751
}
4852

4953

@@ -82,7 +86,7 @@ public void TestFifoListOrder(int totalNumberOfRecords)
8286
{
8387
var record = GetRecord();
8488
records.Add(record);
85-
_database.BacktraceDatabaseContext.Add(record);
89+
var dbRecord = _database.BacktraceDatabaseContext.Add(record);
8690
}
8791
DisposeRecords();
8892
foreach (var record in records)

Backtrace.Tests/DatabaseTests/DatabaseSetupTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class DatabaseSetupTests
2020
/// <summary>
2121
/// Current project directory
2222
/// </summary>
23-
private readonly string _projectDirectory = Environment.CurrentDirectory;
23+
private readonly string _projectDirectory = System.IO.Path.GetTempPath();
2424

2525
[Test(Author = "Konrad Dysput", Description = "Test database initialization")]
2626
public void TestDatabaseInitalizationConditions()

Backtrace.Tests/DatabaseTests/Model/DatabaseTestBase.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using Backtrace.Base;
2-
using Backtrace.Interfaces;
3-
using Backtrace.Interfaces.Database;
1+
using Backtrace.Interfaces;
42
using Backtrace.Model;
53
using Backtrace.Model.Database;
64
using Backtrace.Services;
@@ -10,9 +8,6 @@
108
using System;
119
using System.Collections.Generic;
1210
using System.IO;
13-
using System.Linq;
14-
using System.Text;
15-
using System.Threading.Tasks;
1611

1712
namespace Backtrace.Tests.DatabaseTests.Model
1813
{
@@ -30,7 +25,7 @@ public class DatabaseTestBase
3025
public virtual void Setup()
3126
{
3227
//get project path
33-
string projectPath = Environment.CurrentDirectory;
28+
string projectPath = Path.GetTempPath();
3429

3530
//mock api
3631
var mockApi = new Mock<IBacktraceApi>();
@@ -49,9 +44,10 @@ public virtual void Setup()
4944

5045
var settings = new BacktraceDatabaseSettings(projectPath)
5146
{
47+
RetryBehavior = RetryBehavior.NoRetry,
5248
AutoSendMode = false, //we don't want to test timers
5349
MaxRecordCount = 100,
54-
RetryLimit = 3
50+
RetryLimit = 3
5551
};
5652
_database = new BacktraceDatabase(settings)
5753
{
@@ -85,6 +81,9 @@ protected BacktraceDatabaseRecord GetRecord()
8581
mockRecord.Setup(n => n.Delete());
8682
mockRecord.Setup(n => n.BacktraceData)
8783
.Returns(new BacktraceData(It.IsAny<BacktraceReport>(), It.IsAny<Dictionary<string, object>>()));
84+
mockRecord.Setup(n => n.Valid())
85+
.Returns(true);
86+
8887
var data = new BacktraceData(null, new Dictionary<string, object>());
8988
mockRecord.SetupProperty(n => n.Record, data);
9089

0 commit comments

Comments
 (0)