17
17
18
18
import * as assert from 'assert' ;
19
19
import * as fs from 'fs' ;
20
+ import * as path from 'path' ;
20
21
import { promisify } from 'util' ;
22
+ import * as protoLoader from '@grpc/proto-loader' ;
21
23
22
24
import { CallCredentials } from '../src/call-credentials' ;
23
25
import { ChannelCredentials } from '../src/channel-credentials' ;
26
+ import * as grpc from '../src' ;
27
+ import { ServiceClient , ServiceClientConstructor } from '../src/make-client' ;
28
+ import { TestServiceClient , TestServiceHandlers } from './generated/TestService' ;
29
+ import { ProtoGrpcType as TestServiceGrpcType } from './generated/test_service' ;
24
30
25
- import { assert2 , mockFunction } from './common' ;
31
+ import { assert2 , loadProtoFile , mockFunction } from './common' ;
32
+ import { sendUnaryData , ServerUnaryCall , ServiceError } from '../src' ;
33
+
34
+ const protoFile = path . join ( __dirname , 'fixtures' , 'echo_service.proto' ) ;
35
+ const echoService = loadProtoFile ( protoFile ) . EchoService as ServiceClientConstructor ;
26
36
27
37
class CallCredentialsMock implements CallCredentials {
28
38
child : CallCredentialsMock | null = null ;
@@ -138,3 +148,65 @@ describe('ChannelCredentials Implementation', () => {
138
148
} ) ;
139
149
} ) ;
140
150
} ) ;
151
+
152
+ describe ( 'ChannelCredentials usage' , ( ) => {
153
+ let client : ServiceClient ;
154
+ let server : grpc . Server ;
155
+ before ( async ( ) => {
156
+ const { ca, key, cert} = await pFixtures ;
157
+ const serverCreds = grpc . ServerCredentials . createSsl ( null , [ { private_key : key , cert_chain : cert } ] ) ;
158
+ const channelCreds = ChannelCredentials . createSsl ( ca ) ;
159
+ const callCreds = CallCredentials . createFromMetadataGenerator ( ( options , cb ) => {
160
+ const metadata = new grpc . Metadata ( ) ;
161
+ metadata . set ( 'test-key' , 'test-value' ) ;
162
+ cb ( null , metadata ) ;
163
+ } ) ;
164
+ const combinedCreds = channelCreds . compose ( callCreds ) ;
165
+ return new Promise < void > ( ( resolve , reject ) => {
166
+
167
+ server = new grpc . Server ( ) ;
168
+ server . addService ( echoService . service , {
169
+ echo ( call : ServerUnaryCall < any , any > , callback : sendUnaryData < any > ) {
170
+ call . sendMetadata ( call . metadata ) ;
171
+ callback ( null , call . request ) ;
172
+ } ,
173
+ } ) ;
174
+
175
+ server . bindAsync (
176
+ 'localhost:0' ,
177
+ serverCreds ,
178
+ ( err , port ) => {
179
+ if ( err ) {
180
+ reject ( err ) ;
181
+ return ;
182
+ }
183
+ client = new echoService (
184
+ `localhost:${ port } ` ,
185
+ combinedCreds ,
186
+ { 'grpc.ssl_target_name_override' : 'foo.test.google.fr' , 'grpc.default_authority' : 'foo.test.google.fr' }
187
+ ) ;
188
+ server . start ( ) ;
189
+ resolve ( ) ;
190
+ }
191
+ ) ;
192
+ } ) ;
193
+ } ) ;
194
+ after ( ( ) => {
195
+ server . forceShutdown ( ) ;
196
+ } ) ;
197
+
198
+ it ( 'Should send the metadata from call credentials attached to channel credentials' , ( done ) => {
199
+ const call = client . echo (
200
+ { value : 'test value' , value2 : 3 } ,
201
+ assert2 . mustCall ( ( error : ServiceError , response : any ) => {
202
+ assert . ifError ( error ) ;
203
+ assert . deepStrictEqual ( response , { value : 'test value' , value2 : 3 } ) ;
204
+ } )
205
+ ) ;
206
+ call . on ( 'metadata' , assert2 . mustCall ( ( metadata : grpc . Metadata ) => {
207
+ assert . deepStrictEqual ( metadata . get ( 'test-key' ) , [ 'test-value' ] ) ;
208
+
209
+ } ) ) ;
210
+ assert2 . afterMustCallsSatisfied ( done ) ;
211
+ } ) ;
212
+ } ) ;
0 commit comments