Skip to content

Commit 2a8516f

Browse files
Fix unittest memory leaks
1 parent ea6d9df commit 2a8516f

File tree

5 files changed

+83
-60
lines changed

5 files changed

+83
-60
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ unittest/UnitTest.res
77
unittest/UnitTest.dsk
88
unittest/UnitTest.dof
99
unittest/UnitTest.exe
10+
unittest/UnitTest.map
11+
unittest/target
1012
packages/D7/D7_RestApi.dsk
1113
packages/D7/D7_RestApi.res
1214
packages/XE/DelphiXE_RestApi.res

unittest/BaseTestRest.pas

+2-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ procedure TBaseTestRest.SetUp;
7070
begin
7171
inherited;
7272
FRestClient := TRestClient.Create(nil);
73-
FRestClient.EnabledCompression := True;
73+
// AV in Delphi XE2
74+
FRestClient.EnabledCompression := False;
7475
FRestClient.ConnectionType := FHttpConnectionType;
7576
end;
7677

unittest/TestDBXJson.pas

+14-18
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,15 @@ procedure TTestDbxJson.EchoJsonObjectWithPut;
5050

5151
procedure TTestDbxJson.GetJsonList;
5252
var
53-
vResponse: TList<TPerson>;
53+
vResponse: TObjectList<TPerson>;
5454
vPerson: TPerson;
5555
begin
5656
vResponse := RestClient.Resource(CONTEXT_PATH + 'persons')
5757
.Accept(RestUtils.MediaType_Json)
58-
.Get<TList<TPerson>>();
58+
.Get<TObjectList<TPerson>>();
5959
try
6060
CheckNotNull(vResponse);
61+
vResponse.OwnsObjects := True;
6162
CheckEquals(4, vResponse.Count);
6263

6364
for vPerson in vResponse do
@@ -130,27 +131,22 @@ procedure TTestDbxJson.DeleteJsonObject;
130131

131132
procedure TTestDbxJson.EchoJsonObjectListWithPost;
132133
var
133-
vPerson: TPerson;
134134
vReqJson,
135-
vRespJson: TList<TPerson>;
135+
vRespJson: TObjectList<TPerson>;
136136
begin
137-
vReqJson := TList<TPerson>.Create;
137+
vReqJson := TObjectList<TPerson>.Create;
138138
try
139-
vPerson := TPerson.NewFrom(123, 'Fabricio', 'fabricio.colombo.mva@gmail.com');
139+
vReqJson.Add(TPerson.NewFrom(123, 'Fabricio', 'fabricio.colombo.mva@gmail.com'));
140+
141+
vRespJson := RestClient.Resource(CONTEXT_PATH + 'json/persons')
142+
.Accept(RestUtils.MediaType_Json)
143+
.ContentType(RestUtils.MediaType_Json)
144+
.Post<TObjectList<TPerson>>(vReqJson);
140145
try
141-
vReqJson.Add(vPerson);
142-
143-
vRespJson := RestClient.Resource(CONTEXT_PATH + 'json/persons')
144-
.Accept(RestUtils.MediaType_Json)
145-
.ContentType(RestUtils.MediaType_Json)
146-
.Post<TList<TPerson>>(vReqJson);
147-
try
148-
CheckEqualsString(vReqJson[0].ToString, vRespJson[0].ToString);
149-
finally
150-
vRespJson.Free;
151-
end;
146+
vRespJson.OwnsObjects := True;
147+
CheckEqualsString(vReqJson[0].ToString, vRespJson[0].ToString);
152148
finally
153-
vPerson.Free;
149+
vRespJson.Free;
154150
end;
155151
finally
156152
vReqJson.Free;

unittest/TestDataSetHandler.pas

+10-9
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,15 @@ procedure TTestDataSetHandler.JsonToDynamicDataSet;
112112
vJson := '{"id":123,"name":"Fabricio Colombo"}';
113113

114114
vDataSet := TJsonToDataSetConverter.CreateDataSetMetadata(vJson);
115-
116-
CheckNotNull(vDataSet);
117-
CheckTrue(vDataSet.Active);
118-
CheckEquals(2, vDataSet.FieldCount);
119-
CheckEquals('id', vDataSet.Fields[0].FieldName);
120-
CheckEquals('name', vDataSet.Fields[1].FieldName);
115+
try
116+
CheckNotNull(vDataSet);
117+
CheckTrue(vDataSet.Active);
118+
CheckEquals(2, vDataSet.FieldCount);
119+
CheckEquals('id', vDataSet.Fields[0].FieldName);
120+
CheckEquals('name', vDataSet.Fields[1].FieldName);
121+
finally
122+
vDataSet.Free;
123+
end;
121124
end;
122125

123126
procedure TTestDataSetHandler.JsonToDynamicDataSetWithNestedDataSet;
@@ -141,10 +144,8 @@ procedure TTestDataSetHandler.JsonToDynamicDataSetWithNestedDataSet;
141144
' ]' +
142145
'}';
143146

144-
vDataSet := TClientDataSet.Create(nil);
147+
vDataSet := TJsonToDataSetConverter.CreateDataSetMetadata(vJson);
145148
try
146-
vDataSet := TJsonToDataSetConverter.CreateDataSetMetadata(vJson);
147-
148149
CheckNotNull(vDataSet);
149150
CheckTrue(vDataSet.Active);
150151
CheckEquals(3, vDataSet.FieldCount);

unittest/TestSerializer.pas

+55-32
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ TPerson = class(TObject)
1616
age: Integer;
1717
name: String;
1818
father: TPerson;
19-
phones : TList<TPhone>;
19+
phones : TObjectList<TPhone>;
2020

2121
function ToString: string; override;
22+
destructor Destroy; override;
2223
end;
2324

2425
TTestDesserializer = class(TBaseTestRest)
@@ -53,14 +54,17 @@ procedure TTestDesserializer.personWithFather;
5354
vPerson: TPerson;
5455
begin
5556
vPerson := TPerson.FromJson(sJson);
56-
57-
CheckNotNull(vPerson);
58-
CheckEquals('Helbert', vPerson.name);
59-
CheckEquals(30, vPerson.age);
60-
61-
CheckNotNull(vPerson.father);
62-
CheckEquals('Luiz', vPerson.father.name);
63-
CheckEquals(60, vPerson.father.age);
57+
try
58+
CheckNotNull(vPerson);
59+
CheckEquals('Helbert', vPerson.name);
60+
CheckEquals(30, vPerson.age);
61+
62+
CheckNotNull(vPerson.father);
63+
CheckEquals('Luiz', vPerson.father.name);
64+
CheckEquals(60, vPerson.father.age);
65+
finally
66+
vPerson.Free;
67+
end;
6468
end;
6569

6670
procedure TTestDesserializer.personWithFatherAndPhones;
@@ -89,22 +93,25 @@ procedure TTestDesserializer.personWithFatherAndPhones;
8993
vPerson: TPerson;
9094
begin
9195
vPerson := TPerson.FromJson(sJson);
92-
93-
CheckNotNull(vPerson);
94-
CheckEquals('Helbert', vPerson.name);
95-
CheckEquals(30, vPerson.age);
96-
97-
CheckNotNull(vPerson.father);
98-
CheckEquals('Luiz', vPerson.father.name);
99-
CheckEquals(60, vPerson.father.age);
100-
101-
CheckNotNull(vPerson.phones);
102-
CheckEquals(2, vPerson.phones.Count);
103-
CheckEquals(33083518, vPerson.phones[0].number);
104-
CheckEquals(61, vPerson.phones[0].code);
105-
106-
CheckEquals(99744165, vPerson.phones[1].number);
107-
CheckEquals(61, vPerson.phones[1].code);
96+
try
97+
CheckNotNull(vPerson);
98+
CheckEquals('Helbert', vPerson.name);
99+
CheckEquals(30, vPerson.age);
100+
101+
CheckNotNull(vPerson.father);
102+
CheckEquals('Luiz', vPerson.father.name);
103+
CheckEquals(60, vPerson.father.age);
104+
105+
CheckNotNull(vPerson.phones);
106+
CheckEquals(2, vPerson.phones.Count);
107+
CheckEquals(33083518, vPerson.phones[0].number);
108+
CheckEquals(61, vPerson.phones[0].code);
109+
110+
CheckEquals(99744165, vPerson.phones[1].number);
111+
CheckEquals(61, vPerson.phones[1].code);
112+
finally
113+
vPerson.Free;
114+
end;
108115
end;
109116

110117
procedure TTestDesserializer.person;
@@ -117,10 +124,13 @@ procedure TTestDesserializer.person;
117124
vPerson: TPerson;
118125
begin
119126
vPerson := TPerson.FromJson(sJson);
120-
121-
CheckNotNull(vPerson);
122-
CheckEquals('Helbert', vPerson.name);
123-
CheckEquals(30, vPerson.age);
127+
try
128+
CheckNotNull(vPerson);
129+
CheckEquals('Helbert', vPerson.name);
130+
CheckEquals(30, vPerson.age);
131+
finally
132+
vPerson.Free;
133+
end;
124134
end;
125135

126136
{ TTestSerializer }
@@ -132,14 +142,27 @@ procedure TTestSerializer.person;
132142
vPerson: TPerson;
133143
begin
134144
vPerson := TPerson.Create;
135-
vPerson.name := 'Helbert';
136-
vPerson.age := 30;
145+
try
146+
vPerson.name := 'Helbert';
147+
vPerson.age := 30;
137148

138-
CheckEquals(sJson, vPerson.ToJson().AsJSon());
149+
CheckEquals(sJson, vPerson.ToJson().AsJSon());
150+
finally
151+
vPerson.Free;
152+
end;
139153
end;
140154

141155
{ TPerson }
142156

157+
destructor TPerson.Destroy;
158+
begin
159+
if Assigned(phones) then
160+
phones.OwnsObjects := True;
161+
phones.Free;
162+
father.Free;
163+
inherited;
164+
end;
165+
143166
function TPerson.ToString: string;
144167
begin
145168
Result := 'name:' + name + ' age:' + IntToStr(age);

0 commit comments

Comments
 (0)