Skip to content

Commit ff53964

Browse files
bugfix: ZENKO-2866 unit test showing the bug
Add a unit test counting the number of open sockets after an S3 client closes the connection before the data backend has sent a GET request: with the fix, there should be none remaining open.
1 parent e5c3bb1 commit ff53964

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
const assert = require('assert');
2+
const http = require('http');
3+
4+
const werelogs = require('werelogs');
5+
const logger = new werelogs.Logger('test:routesUtils.responseStreamData');
6+
7+
const { responseStreamData } = require('../../../../lib/s3routes/routesUtils.js');
8+
const AwsClient = require('../../../../lib/storage/data/external/AwsClient');
9+
const DummyObjectStream = require('../../storage/data/DummyObjectStream');
10+
11+
werelogs.configure({
12+
level: 'debug',
13+
dump: 'error',
14+
});
15+
16+
describe('routesUtils.responseStreamData', () => {
17+
const awsAgent = new http.Agent({
18+
keepAlive: true,
19+
});
20+
const awsConfig = {
21+
s3Params: {
22+
endpoint: 'http://localhost:8888',
23+
maxRetries: 0,
24+
s3ForcePathStyle: true,
25+
accessKeyId: 'accessKey',
26+
secretAccessKey: 'secretKey',
27+
httpOptions: {
28+
agent: awsAgent,
29+
},
30+
},
31+
bucketName: 'awsTestBucketName',
32+
dataStoreName: 'awsDataStore',
33+
serverSideEncryption: false,
34+
type: 'aws',
35+
};
36+
let httpServer;
37+
let awsClient;
38+
39+
before(done => {
40+
awsClient = new AwsClient(awsConfig);
41+
httpServer = http.createServer((req, res) => {
42+
const objStream = new DummyObjectStream(0, 10000000);
43+
res.setHeader('content-length', 10000000);
44+
objStream.pipe(res);
45+
}).listen(8888);
46+
httpServer.on('listening', done);
47+
httpServer.on('error', err => assert.ifError(err));
48+
});
49+
50+
after(() => {
51+
httpServer.close();
52+
});
53+
54+
it('should not leak socket if client closes the connection before ' +
55+
'data backend starts streaming', done => {
56+
responseStreamData(undefined, {}, {}, [{
57+
key: 'foo',
58+
size: 10000000,
59+
}], {
60+
client: awsClient,
61+
implName: 'impl',
62+
config: {},
63+
locStorageCheckFn: () => {},
64+
}, {
65+
setHeader: () => {},
66+
writeHead: () => {},
67+
on: () => {},
68+
once: () => {},
69+
emit: () => {},
70+
write: () => {},
71+
end: () => setTimeout(() => {
72+
const nOpenSockets = Object.keys(awsAgent.sockets).length;
73+
assert.strictEqual(nOpenSockets, 0);
74+
done();
75+
}, 1000),
76+
// fake a connection close from the S3 client by setting the "isclosed" flag
77+
isclosed: true,
78+
}, undefined, logger.newRequestLogger());
79+
});
80+
});

0 commit comments

Comments
 (0)