forked from kubernetes-client/javascript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexec_test.ts
More file actions
122 lines (98 loc) · 5.19 KB
/
exec_test.ts
File metadata and controls
122 lines (98 loc) · 5.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { expect } from 'chai';
import WebSocket = require('isomorphic-ws');
import { ReadableStreamBuffer, WritableStreamBuffer } from 'stream-buffers';
import { anyFunction, capture, instance, mock, verify, when } from 'ts-mockito';
import { V1Status } from './api';
import { KubeConfig } from './config';
import { Exec } from './exec';
import { WebSocketHandler, WebSocketInterface } from './web-socket-handler';
describe('Exec', () => {
describe('basic', () => {
it('should correctly exec to a url', async () => {
const kc = new KubeConfig();
const fakeWebSocket: WebSocketInterface = mock(WebSocketHandler);
const exec = new Exec(kc, instance(fakeWebSocket));
const osStream = new WritableStreamBuffer();
const errStream = new WritableStreamBuffer();
const isStream = new ReadableStreamBuffer();
const namespace = 'somenamespace';
const pod = 'somepod';
const container = 'container';
const cmd = 'command';
const path = `/api/v1/namespaces/${namespace}/pods/${pod}/exec`;
await exec.exec(
namespace, pod, container, cmd, osStream, errStream, isStream, false);
let args = `stdout=true&stderr=true&stdin=true&tty=false&command=${cmd}&container=${container}`;
verify(fakeWebSocket.connect(`${path}?${args}`, null, anyFunction())).called();
await exec.exec(
namespace, pod, container, cmd, null, errStream, isStream, false);
args = `stdout=false&stderr=true&stdin=true&tty=false&command=${cmd}&container=${container}`;
verify(fakeWebSocket.connect(`${path}?${args}`, null, anyFunction())).called();
await exec.exec(
namespace, pod, container, cmd, null, null, isStream, false);
args = `stdout=false&stderr=false&stdin=true&tty=false&command=${cmd}&container=${container}`;
verify(fakeWebSocket.connect(`${path}?${args}`, null, anyFunction())).called();
await exec.exec(
namespace, pod, container, cmd, null, null, null, false);
args = `stdout=false&stderr=false&stdin=false&tty=false&command=${cmd}&container=${container}`;
verify(fakeWebSocket.connect(`${path}?${args}`, null, anyFunction())).called();
await exec.exec(
namespace, pod, container, cmd, null, errStream, isStream, true);
args = `stdout=false&stderr=true&stdin=true&tty=true&command=${cmd}&container=${container}`;
verify(fakeWebSocket.connect(`${path}?${args}`, null, anyFunction())).called();
});
it('should correctly attach to streams', async () => {
const kc = new KubeConfig();
const fakeWebSocket: WebSocketInterface = mock(WebSocketHandler);
const exec = new Exec(kc, instance(fakeWebSocket));
const osStream = new WritableStreamBuffer();
const errStream = new WritableStreamBuffer();
const isStream = new ReadableStreamBuffer();
const namespace = 'somenamespace';
const pod = 'somepod';
const container = 'somecontainer';
const cmd = 'command';
const path = `/api/v1/namespaces/${namespace}/pods/${pod}/exec`;
const args = `stdout=true&stderr=true&stdin=true&tty=false&command=${cmd}&container=${container}`;
let statusOut = {} as V1Status;
const fakeConn: WebSocket = mock(WebSocket);
when(fakeWebSocket.connect(`${path}?${args}`, null, anyFunction())).thenResolve(fakeConn);
await exec.exec(
namespace, pod, container, cmd, osStream, errStream, isStream, false, (status: V1Status) => {
statusOut = status;
});
const [, , outputFn] = capture(fakeWebSocket.connect).last();
/* tslint:disable:no-unused-expression */
expect(outputFn).to.not.be.null;
// this is redundant but needed for the compiler, sigh...
if (!outputFn) {
return;
}
let buffer = Buffer.alloc(1024, 10);
outputFn(WebSocketHandler.StdoutStream, buffer);
expect(osStream.size()).to.equal(1024);
let buff = osStream.getContents() as Buffer;
for (let i = 0; i < 1024; i++) {
expect(buff[i]).to.equal(10);
}
buffer = Buffer.alloc(1024, 20);
outputFn(WebSocketHandler.StderrStream, buffer);
expect(errStream.size()).to.equal(1024);
buff = errStream.getContents() as Buffer;
for (let i = 0; i < 1024; i++) {
expect(buff[i]).to.equal(20);
}
const msg = 'This is test data';
isStream.put(msg);
verify(fakeConn.send(msg));
const statusIn = {
code: 100,
message: 'this is a test',
} as V1Status;
outputFn(WebSocketHandler.StatusStream, Buffer.from(JSON.stringify(statusIn)));
expect(statusOut).to.deep.equal(statusIn);
isStream.stop();
verify(fakeConn.close());
});
});
});