@@ -19,6 +19,8 @@ import * as loader from '@grpc/proto-loader';
19
19
import * as assert2 from './assert2' ;
20
20
import * as path from 'path' ;
21
21
import * as grpc from '../src' ;
22
+ import * as fsPromises from 'fs/promises' ;
23
+ import * as os from 'os' ;
22
24
23
25
import {
24
26
GrpcObject ,
@@ -71,54 +73,77 @@ const serviceImpl = {
71
73
72
74
export class TestServer {
73
75
private server : grpc . Server ;
74
- public port : number | null = null ;
76
+ private target : string | null = null ;
75
77
constructor ( public useTls : boolean , options ?: grpc . ServerOptions ) {
76
78
this . server = new grpc . Server ( options ) ;
77
79
this . server . addService ( echoService . service , serviceImpl ) ;
78
80
}
79
- start ( ) : Promise < void > {
80
- let credentials : grpc . ServerCredentials ;
81
+
82
+ private getCredentials ( ) : grpc . ServerCredentials {
81
83
if ( this . useTls ) {
82
- credentials = grpc . ServerCredentials . createSsl ( null , [
84
+ return grpc . ServerCredentials . createSsl ( null , [
83
85
{ private_key : key , cert_chain : cert } ,
84
86
] ) ;
85
87
} else {
86
- credentials = grpc . ServerCredentials . createInsecure ( ) ;
88
+ return grpc . ServerCredentials . createInsecure ( ) ;
87
89
}
90
+ }
91
+
92
+ start ( ) : Promise < void > {
88
93
return new Promise < void > ( ( resolve , reject ) => {
89
- this . server . bindAsync ( 'localhost:0' , credentials , ( error , port ) => {
94
+ this . server . bindAsync ( 'localhost:0' , this . getCredentials ( ) , ( error , port ) => {
90
95
if ( error ) {
91
96
reject ( error ) ;
92
97
return ;
93
98
}
94
- this . port = port ;
99
+ this . target = `localhost: ${ port } ` ;
95
100
resolve ( ) ;
96
101
} ) ;
97
102
} ) ;
98
103
}
99
104
105
+ startUds ( ) : Promise < void > {
106
+ return fsPromises . mkdtemp ( path . join ( os . tmpdir ( ) , 'uds' ) ) . then ( dir => {
107
+ return new Promise < void > ( ( resolve , reject ) => {
108
+ const target = `unix://${ dir } /socket` ;
109
+ this . server . bindAsync ( target , this . getCredentials ( ) , ( error , port ) => {
110
+ if ( error ) {
111
+ reject ( error ) ;
112
+ return ;
113
+ }
114
+ this . target = target ;
115
+ resolve ( ) ;
116
+ } ) ;
117
+ } ) ;
118
+ } ) ;
119
+ }
120
+
100
121
shutdown ( ) {
101
122
this . server . forceShutdown ( ) ;
102
123
}
124
+
125
+ getTarget ( ) {
126
+ if ( this . target === null ) {
127
+ throw new Error ( 'Server not yet started' ) ;
128
+ }
129
+ return this . target ;
130
+ }
103
131
}
104
132
105
133
export class TestClient {
106
134
private client : ServiceClient ;
107
- constructor ( port : number , useTls : boolean , options ?: grpc . ChannelOptions ) {
135
+ constructor ( target : string , useTls : boolean , options ?: grpc . ChannelOptions ) {
108
136
let credentials : grpc . ChannelCredentials ;
109
137
if ( useTls ) {
110
138
credentials = grpc . credentials . createSsl ( ca ) ;
111
139
} else {
112
140
credentials = grpc . credentials . createInsecure ( ) ;
113
141
}
114
- this . client = new echoService ( `localhost: ${ port } ` , credentials , options ) ;
142
+ this . client = new echoService ( target , credentials , options ) ;
115
143
}
116
144
117
145
static createFromServer ( server : TestServer , options ?: grpc . ChannelOptions ) {
118
- if ( server . port === null ) {
119
- throw new Error ( 'Cannot create client, server not started' ) ;
120
- }
121
- return new TestClient ( server . port , server . useTls , options ) ;
146
+ return new TestClient ( server . getTarget ( ) , server . useTls , options ) ;
122
147
}
123
148
124
149
waitForReady ( deadline : grpc . Deadline , callback : ( error ?: Error ) => void ) {
0 commit comments