mirror of https://github.com/grpc/grpc-web.git
Fix non-determinism in code generator
This commit is contained in:
parent
4a4923f928
commit
0c62fe8a3a
|
|
@ -529,15 +529,17 @@ string GetBasename(string filename) {
|
|||
return basename;
|
||||
}
|
||||
|
||||
// Finds all message types used in all services in the file.
|
||||
std::set<const Descriptor*> GetAllMessages(const FileDescriptor* file) {
|
||||
std::set<const Descriptor*> messages;
|
||||
// Finds all message types used in all services in the file. Return results as a
|
||||
// map of full names to descriptors to get sorted results and deterministic
|
||||
// build outputs.
|
||||
std::map<string, const Descriptor*> GetAllMessages(const FileDescriptor* file) {
|
||||
std::map<string, const Descriptor*> messages;
|
||||
for (int s = 0; s < file->service_count(); ++s) {
|
||||
const ServiceDescriptor* service = file->service(s);
|
||||
for (int m = 0; m < service->method_count(); ++m) {
|
||||
const MethodDescriptor *method = service->method(m);
|
||||
messages.insert(method->input_type());
|
||||
messages.insert(method->output_type());
|
||||
messages[method->input_type()->full_name()] = method->input_type();
|
||||
messages[method->output_type()->full_name()] = method->output_type();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -545,10 +547,10 @@ std::set<const Descriptor*> GetAllMessages(const FileDescriptor* file) {
|
|||
}
|
||||
|
||||
void PrintClosureDependencies(Printer* printer, const FileDescriptor* file) {
|
||||
for (const Descriptor* message : GetAllMessages(file)) {
|
||||
for (const auto &entry : GetAllMessages(file)) {
|
||||
printer->Print(
|
||||
"goog.require('proto.$full_name$');\n",
|
||||
"full_name", message->full_name());
|
||||
"full_name", entry.second->full_name());
|
||||
}
|
||||
printer->Print("\n\n\n");
|
||||
}
|
||||
|
|
@ -604,8 +606,8 @@ void PrintES6Imports(Printer* printer, const FileDescriptor* file) {
|
|||
printer->Print("import * as grpcWeb from 'grpc-web';\n\n");
|
||||
|
||||
std::set<string> imports;
|
||||
for (const Descriptor* message : GetAllMessages(file)) {
|
||||
const string& name = message->file()->name();
|
||||
for (const auto &entry : GetAllMessages(file)) {
|
||||
const string& name = entry.second->file()->name();
|
||||
string dep_filename = GetRootPath(file->name(), name) + StripProto(name);
|
||||
if (imports.find(dep_filename) != imports.end()) {
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -19,27 +19,27 @@ goog.module('grpc.web.GrpcWebClientBaseTest');
|
|||
goog.setTestOnly('grpc.web.GrpcWebClientBaseTest');
|
||||
|
||||
const ClientReadableStream = goog.require('grpc.web.ClientReadableStream');
|
||||
var EventType = goog.require('goog.net.EventType');
|
||||
var GrpcWebClientBase = goog.require('grpc.web.GrpcWebClientBase');
|
||||
var Map = goog.require('goog.structs.Map');
|
||||
var googCrypt = goog.require('goog.crypt.base64');
|
||||
var googEvents = goog.require('goog.events');
|
||||
var testSuite = goog.require('goog.testing.testSuite');
|
||||
const EventType = goog.require('goog.net.EventType');
|
||||
const GrpcWebClientBase = goog.require('grpc.web.GrpcWebClientBase');
|
||||
const Map = goog.require('goog.structs.Map');
|
||||
const googCrypt = goog.require('goog.crypt.base64');
|
||||
const googEvents = goog.require('goog.events');
|
||||
const testSuite = goog.require('goog.testing.testSuite');
|
||||
const {StreamInterceptor} = goog.require('grpc.web.Interceptor');
|
||||
goog.require('goog.testing.jsunit');
|
||||
|
||||
var REQUEST_BYTES = [1, 2, 3];
|
||||
var FAKE_METHOD = 'fake-method';
|
||||
var PROTO_FIELD_VALUE = 'meow';
|
||||
var EXPECTED_HEADERS;
|
||||
var EXPECTED_HEADER_VALUES;
|
||||
var EXPECTED_UNARY_HEADERS =
|
||||
const REQUEST_BYTES = [1, 2, 3];
|
||||
const FAKE_METHOD = 'fake-method';
|
||||
const PROTO_FIELD_VALUE = 'meow';
|
||||
const DEFAULT_UNARY_HEADERS =
|
||||
['Content-Type', 'Accept', 'X-User-Agent', 'X-Grpc-Web'];
|
||||
var EXPECTED_UNARY_HEADER_VALUES = [
|
||||
const DEFAULT_UNARY_HEADER_VALUES = [
|
||||
'application/grpc-web-text', 'application/grpc-web-text',
|
||||
'grpc-web-javascript/0.1', '1'
|
||||
];
|
||||
var dataCallback;
|
||||
let dataCallback;
|
||||
let expectedHeaders;
|
||||
let expectedHeaderValues;
|
||||
|
||||
|
||||
testSuite({
|
||||
|
|
@ -53,8 +53,8 @@ testSuite({
|
|||
},
|
||||
|
||||
tearDown: function() {
|
||||
EXPECTED_HEADERS = null;
|
||||
EXPECTED_HEADER_VALUES = null;
|
||||
expectedHeaders = null;
|
||||
expectedHeaderValues = null;
|
||||
},
|
||||
|
||||
testRpcResponse: function() {
|
||||
|
|
@ -69,7 +69,7 @@ testSuite({
|
|||
|
||||
expectUnaryHeaders();
|
||||
client.rpcCall(
|
||||
FAKE_METHOD, {}, {}, {
|
||||
FAKE_METHOD, /** requestMessage */ {}, /** metadata */ {}, {
|
||||
requestSerializeFn: function(request) {
|
||||
return REQUEST_BYTES;
|
||||
},
|
||||
|
|
@ -85,6 +85,28 @@ testSuite({
|
|||
dataCallback();
|
||||
},
|
||||
|
||||
testDeadline: function() {
|
||||
const client = new GrpcWebClientBase();
|
||||
client.newXhr_ = function() {
|
||||
return new MockXhr({
|
||||
deadline: true,
|
||||
response: googCrypt.encodeByteArray(new Uint8Array(0)),
|
||||
});
|
||||
};
|
||||
|
||||
expectUnaryHeaders();
|
||||
const deadline = new Date();
|
||||
deadline.setSeconds(deadline.getSeconds() + 1);
|
||||
client.rpcCall(
|
||||
FAKE_METHOD, /** requestMessage */ {}, {'deadline': deadline}, {
|
||||
requestSerializeFn: (request) => REQUEST_BYTES,
|
||||
responseDeserializeFn: (bytes) => {},
|
||||
|
||||
},
|
||||
(error, response) => assertNull(error));
|
||||
dataCallback();
|
||||
},
|
||||
|
||||
testStreamInterceptor: function() {
|
||||
var interceptor = new StreamResponseInterceptor();
|
||||
var client = new GrpcWebClientBase({'streamInterceptors': [interceptor]});
|
||||
|
|
@ -180,8 +202,8 @@ testSuite({
|
|||
|
||||
/** Sets expected headers as the unary response headers */
|
||||
function expectUnaryHeaders() {
|
||||
EXPECTED_HEADERS = EXPECTED_UNARY_HEADERS;
|
||||
EXPECTED_HEADER_VALUES = EXPECTED_UNARY_HEADER_VALUES;
|
||||
expectedHeaders = [...DEFAULT_UNARY_HEADERS];
|
||||
expectedHeaderValues = [...DEFAULT_UNARY_HEADER_VALUES];
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -198,18 +220,23 @@ class MockXhr {
|
|||
|
||||
/**
|
||||
* @param {string} url
|
||||
* @param {string=} opt_method
|
||||
* @param {string=} opt_content
|
||||
* @param {string=} opt_headers
|
||||
* @param {string=} method
|
||||
* @param {string=} content
|
||||
* @param {string=} headers
|
||||
*/
|
||||
send(url, opt_method, opt_content, opt_headers) {
|
||||
send(url, method, content, headers) {
|
||||
assertEquals(FAKE_METHOD, url);
|
||||
assertEquals('POST', opt_method);
|
||||
assertEquals('POST', method);
|
||||
assertElementsEquals(
|
||||
googCrypt.encodeByteArray(new Uint8Array([0, 0, 0, 0, 3, 1, 2, 3])),
|
||||
opt_content);
|
||||
assertElementsEquals(EXPECTED_HEADERS, this.headers.getKeys());
|
||||
assertElementsEquals(EXPECTED_HEADER_VALUES, this.headers.getValues());
|
||||
content);
|
||||
if (!this.mockValues.deadline) {
|
||||
assertElementsEquals(expectedHeaders, this.headers.getKeys());
|
||||
assertElementsEquals(expectedHeaderValues, this.headers.getValues());
|
||||
} else {
|
||||
expectedHeaders.push('grpc-timeout');
|
||||
assertElementsEquals(expectedHeaders, this.headers.getKeys());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue