blob: 6203154d204c96c2e24cc7bf348446a49a627f56 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
define([
"gin/test/expect",
"mojo/public/js/bindings",
"mojo/public/js/core",
"mojo/public/interfaces/bindings/tests/math_calculator.mojom",
"mojo/public/interfaces/bindings/tests/sample_interfaces.mojom",
"mojo/public/js/threading",
"gc",
], function(expect,
bindings,
core,
math,
sampleInterfaces,
threading,
gc) {
testIsBound()
.then(testEndToEnd)
.then(testReusable)
.then(testConnectionError)
.then(testPassInterface)
.then(testBindRawHandle)
.then(testQueryVersion)
.then(testRequireVersion)
.then(function() {
this.result = "PASS";
gc.collectGarbage(); // should not crash
threading.quit();
}.bind(this)).catch(function(e) {
this.result = "FAIL: " + (e.stack || e);
threading.quit();
}.bind(this));
function CalculatorImpl() {
this.total = 0;
}
CalculatorImpl.prototype.clear = function() {
this.total = 0;
return Promise.resolve({value: this.total});
};
CalculatorImpl.prototype.add = function(value) {
this.total += value;
return Promise.resolve({value: this.total});
};
CalculatorImpl.prototype.multiply = function(value) {
this.total *= value;
return Promise.resolve({value: this.total});
};
function IntegerAccessorImpl() {
this.integer = 0;
}
IntegerAccessorImpl.prototype.getInteger = function() {
return Promise.resolve({data: this.integer});
};
IntegerAccessorImpl.prototype.setInteger = function(value) {
this.integer = value;
};
function testIsBound() {
var calc = new math.CalculatorPtr();
expect(calc.ptr.isBound()).toBeFalsy();
var request = bindings.makeRequest(calc);
expect(calc.ptr.isBound()).toBeTruthy();
calc.ptr.reset();
expect(calc.ptr.isBound()).toBeFalsy();
return Promise.resolve();
}
function testEndToEnd() {
var calc = new math.CalculatorPtr();
var calcBinding = new bindings.Binding(math.Calculator,
new CalculatorImpl(),
bindings.makeRequest(calc));
var promise = calc.add(2).then(function(response) {
expect(response.value).toBe(2);
return calc.multiply(5);
}).then(function(response) {
expect(response.value).toBe(10);
return calc.clear();
}).then(function(response) {
expect(response.value).toBe(0);
return Promise.resolve();
});
return promise;
}
function testReusable() {
var calc = new math.CalculatorPtr();
var calcImpl1 = new CalculatorImpl();
var calcBinding1 = new bindings.Binding(math.Calculator,
calcImpl1,
bindings.makeRequest(calc));
var calcImpl2 = new CalculatorImpl();
var calcBinding2 = new bindings.Binding(math.Calculator, calcImpl2);
var promise = calc.add(2).then(function(response) {
expect(response.value).toBe(2);
calcBinding2.bind(bindings.makeRequest(calc));
return calc.add(2);
}).then(function(response) {
expect(response.value).toBe(2);
expect(calcImpl1.total).toBe(2);
expect(calcImpl2.total).toBe(2);
return Promise.resolve();
});
return promise;
}
function testConnectionError() {
var calc = new math.CalculatorPtr();
var calcBinding = new bindings.Binding(math.Calculator,
new CalculatorImpl(),
bindings.makeRequest(calc));
var promise = new Promise(function(resolve, reject) {
calc.ptr.setConnectionErrorHandler(function() {
resolve();
});
calcBinding.close();
});
return promise;
}
function testPassInterface() {
var calc = new math.CalculatorPtr();
var newCalc = null;
var calcBinding = new bindings.Binding(math.Calculator,
new CalculatorImpl(),
bindings.makeRequest(calc));
var promise = calc.add(2).then(function(response) {
expect(response.value).toBe(2);
newCalc = new math.CalculatorPtr();
newCalc.ptr.bind(calc.ptr.passInterface());
expect(calc.ptr.isBound()).toBeFalsy();
return newCalc.add(2);
}).then(function(response) {
expect(response.value).toBe(4);
return Promise.resolve();
});
return promise;
}
function testBindRawHandle() {
var pipe = core.createMessagePipe();
var calc = new math.CalculatorPtr(pipe.handle0);
var newCalc = null;
var calcBinding = new bindings.Binding(math.Calculator,
new CalculatorImpl(),
pipe.handle1);
var promise = calc.add(2).then(function(response) {
expect(response.value).toBe(2);
return Promise.resolve();
});
return promise;
}
function testQueryVersion() {
var integerAccessorPtr = new sampleInterfaces.IntegerAccessorPtr();
var integerAccessorBinding = new bindings.Binding(
sampleInterfaces.IntegerAccessor,
new IntegerAccessorImpl(),
bindings.makeRequest(integerAccessorPtr));
expect(integerAccessorPtr.ptr.version).toBe(0);
return integerAccessorPtr.ptr.queryVersion().then(function(version) {
expect(version).toBe(3);
expect(integerAccessorPtr.ptr.version).toBe(3);
});
}
function testRequireVersion() {
var integerAccessorImpl = new IntegerAccessorImpl();
var integerAccessorPtr = new sampleInterfaces.IntegerAccessorPtr();
var integerAccessorBinding = new bindings.Binding(
sampleInterfaces.IntegerAccessor,
integerAccessorImpl,
bindings.makeRequest(integerAccessorPtr));
// Inital version is 0.
expect(integerAccessorPtr.ptr.version).toBe(0);
function requireVersion1() {
integerAccessorPtr.ptr.requireVersion(1);
expect(integerAccessorPtr.ptr.version).toBe(1);
integerAccessorPtr.setInteger(123, sampleInterfaces.Enum.VALUE);
return integerAccessorPtr.getInteger().then(function(responseParams) {
expect(responseParams.data).toBe(123);
});
}
function requireVersion3() {
integerAccessorPtr.ptr.requireVersion(3);
expect(integerAccessorPtr.ptr.version).toBe(3);
integerAccessorPtr.setInteger(456, sampleInterfaces.Enum.VALUE);
return integerAccessorPtr.getInteger().then(function(responseParams) {
expect(responseParams.data).toBe(456);
});
}
// Require a version that is not supported by the impl side.
function requireVersion4() {
integerAccessorPtr.ptr.requireVersion(4);
expect(integerAccessorPtr.ptr.version).toBe(4);
integerAccessorPtr.setInteger(789, sampleInterfaces.Enum.VALUE);
var promise = new Promise(function(resolve, reject) {
integerAccessorPtr.ptr.setConnectionErrorHandler(function() {
// The call to setInteger() after requireVersion(4) is ignored.
expect(integerAccessorImpl.integer).toBe(456);
resolve();
});
});
return promise;
}
return requireVersion1().then(requireVersion3).then(requireVersion4);
}
});