Skip to content

Commit 37cd4cc

Browse files
committed
test: 💍 add NFS call roundtrip tests
1 parent 59ddfa3 commit 37cd4cc

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

src/nfs/v3/__tests__/Nfsv3Decoder.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ describe('NFSv3 Decoder with real traffic', () => {
5959
expect(proc).toBe(Nfsv3Proc.LOOKUP);
6060
expect(request).toBeInstanceOf(msg.Nfsv3LookupRequest);
6161
const lookupReq = request as msg.Nfsv3LookupRequest;
62-
console.log(lookupReq);
6362
expect(lookupReq.what.name).toBe('hello');
6463
});
6564

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import {RmRecordDecoder, RmRecordEncoder} from '../../../rm';
2+
import {RpcCallMessage, RpcMessageDecoder, RpcMessageEncoder} from '../../../rpc';
3+
import {Nfsv3Decoder} from '../Nfsv3Decoder';
4+
import {Nfsv3Encoder} from '../Nfsv3Encoder';
5+
import * as msg from '../messages';
6+
import {nfsv3} from './fixtures';
7+
8+
const rmDecoder = new RmRecordDecoder();
9+
const rmEncoder = new RmRecordEncoder();
10+
const rpcDecoder = new RpcMessageDecoder();
11+
const rpcEncoder = new RpcMessageEncoder();
12+
const nfsDecoder = new Nfsv3Decoder();
13+
const nfsEncoder = new Nfsv3Encoder();
14+
15+
const assertCallRoundtrip = (hex: string): void => {
16+
const originalHex = hex.toLowerCase();
17+
const buffer = Buffer.from(originalHex, 'hex');
18+
rmDecoder.push(new Uint8Array(buffer));
19+
let totalEncodedHex = '';
20+
while (true) {
21+
const rmRecord = rmDecoder.readRecord();
22+
if (!rmRecord) break;
23+
const rpcMessage = rpcDecoder.decodeMessage(rmRecord);
24+
if (!(rpcMessage instanceof RpcCallMessage)) throw new Error(`Expected RPC Call message`);
25+
const nfsRequest = nfsDecoder.decodeMessage(rpcMessage.params!, rpcMessage.proc, true) as msg.Nfsv3Request;
26+
const nfsEncoded = nfsEncoder.encodeMessage(nfsRequest, rpcMessage.proc, true);
27+
const rpcEncoded = rpcEncoder.encodeCall(
28+
rpcMessage.xid,
29+
rpcMessage.prog,
30+
rpcMessage.vers,
31+
rpcMessage.proc,
32+
rpcMessage.cred,
33+
rpcMessage.verf,
34+
nfsEncoded,
35+
);
36+
const rmEncoded = rmEncoder.encodeRecord(rpcEncoded);
37+
const encodedHex = Buffer.from(rmEncoded).toString('hex').toLowerCase();
38+
totalEncodedHex += encodedHex;
39+
}
40+
expect(totalEncodedHex).toBe(originalHex);
41+
};
42+
43+
test('assert roundtrip of Call messages', () => {
44+
assertCallRoundtrip(nfsv3.GETATTR.Call[0]);
45+
assertCallRoundtrip(nfsv3.GETATTR.Call[0] + nfsv3.ACCESS.Call[0]);
46+
assertCallRoundtrip(
47+
nfsv3.ACCESS.Call[0] +
48+
nfsv3.GETATTR.Call[0] +
49+
nfsv3.COMMIT.Call[0] +
50+
nfsv3.RMDIR.Call[0] +
51+
nfsv3.MKDIR.Call[0] +
52+
nfsv3.RMDIR.Call[0] +
53+
nfsv3.READDIRPLUS.Call[0] +
54+
nfsv3.REMOVE.Call[0] +
55+
nfsv3.CREATE.Call[0] +
56+
nfsv3.CREATE.Call[0] +
57+
nfsv3.LOOKUP.Call[0]);
58+
});

0 commit comments

Comments
 (0)