Skip to content

Commit 6730a6a

Browse files
committed
Merge pull request #152 from uProxy/dev
v23
2 parents a067268 + 166c9f2 commit 6730a6a

File tree

13 files changed

+374
-130
lines changed

13 files changed

+374
-130
lines changed

Gruntfile.coffee

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,37 +46,54 @@ taskManager.add 'copypasteFreedomChat', [
4646
]
4747

4848
# Create unit test code
49-
taskManager.add 'browserify_specs', [
49+
taskManager.add 'browserifySpecs', [
5050
'base'
5151
'browserify:arraybuffersSpec'
5252
'browserify:handlerSpec'
5353
'browserify:buildToolsTaskmanagerSpec'
5454
'browserify:loggingSpec'
5555
'browserify:loggingProviderSpec'
56-
'browserify:webrtcSpec'
56+
'browserify:peerconnectionSpec'
57+
'browserify:datachannelSpec'
58+
'browserify:queueSpec'
59+
]
60+
61+
# Create unit test code
62+
taskManager.add 'browserifyCovSpecs', [
63+
'base'
64+
'browserify:arraybuffersCovSpec'
65+
'browserify:handlerCovSpec'
66+
'browserify:buildToolsTaskmanagerCovSpec'
67+
'browserify:loggingCovSpec'
68+
'browserify:loggingProviderCovSpec'
69+
'browserify:peerconnectionCovSpec'
70+
'browserify:datachannelCovSpec'
71+
'browserify:queueCovSpec'
5772
]
5873

5974
# Run unit tests
6075
taskManager.add 'unit_test', [
61-
'browserify_specs',
76+
'browserifySpecs',
6277
'jasmine:arraybuffers'
6378
'jasmine:handler'
6479
'jasmine:buildTools'
6580
'jasmine:logging'
6681
'jasmine:loggingProvider'
6782
'jasmine:webrtc'
83+
'jasmine:queue'
6884
]
6985

7086
# Run unit tests to produce coverage; these are separate from unit_tests because
7187
# they make tests hard to debug and fix.
7288
taskManager.add 'coverage', [
73-
'browserify_specs'
89+
'browserifyCovSpecs'
7490
'jasmine:arraybuffersCov'
7591
'jasmine:handlerCov'
7692
'jasmine:buildToolsCov'
7793
'jasmine:loggingCov'
7894
'jasmine:loggingProviderCov'
7995
'jasmine:webrtcCov'
96+
'jasmine:queueCov'
8097
]
8198

8299
# Run unit tests
@@ -200,17 +217,29 @@ module.exports = (grunt) ->
200217
loggingProviderCov: Rule.addCoverageToSpec(Rule.jasmineSpec 'loggingprovider')
201218
webrtc: Rule.jasmineSpec 'webrtc'
202219
webrtcCov: Rule.addCoverageToSpec(Rule.jasmineSpec 'webrtc')
220+
queue: Rule.jasmineSpec 'queue'
221+
queueCov: Rule.addCoverageToSpec(Rule.jasmineSpec 'queue')
203222

204223
browserify:
205224
# Browserify freedom-modules in the library
206225
loggingProvider: Rule.browserify 'loggingprovider/freedom-module'
207226
# Browserify specs
208227
arraybuffersSpec: Rule.browserifySpec 'arraybuffers/arraybuffers'
228+
arraybuffersCovSpec: Rule.addCoverageToBrowserify(Rule.browserifySpec 'arraybuffers/arraybuffers')
209229
buildToolsTaskmanagerSpec: Rule.browserifySpec 'build-tools/taskmanager'
230+
buildToolsTaskmanagerCovSpec: Rule.addCoverageToBrowserify(Rule.browserifySpec 'build-tools/taskmanager')
210231
handlerSpec: Rule.browserifySpec 'handler/queue'
232+
handlerCovSpec: Rule.addCoverageToBrowserify(Rule.browserifySpec 'handler/queue')
211233
loggingProviderSpec: Rule.browserifySpec 'loggingprovider/loggingprovider'
234+
loggingProviderCovSpec: Rule.addCoverageToBrowserify(Rule.browserifySpec 'loggingprovider/loggingprovider')
212235
loggingSpec: Rule.browserifySpec 'logging/logging'
213-
webrtcSpec: Rule.browserifySpec 'webrtc/peerconnection'
236+
loggingCovSpec: Rule.addCoverageToBrowserify(Rule.browserifySpec 'logging/logging')
237+
peerconnectionSpec: Rule.browserifySpec 'webrtc/peerconnection'
238+
peerconnectionCovSpec: Rule.addCoverageToBrowserify(Rule.browserifySpec 'webrtc/peerconnection')
239+
datachannelSpec: Rule.browserifySpec 'webrtc/datachannel'
240+
datachannelCovSpec: Rule.addCoverageToBrowserify(Rule.browserifySpec 'webrtc/datachannel')
241+
queueSpec: Rule.browserifySpec 'queue/queue'
242+
queueCovSpec: Rule.addCoverageToBrowserify(Rule.browserifySpec 'queue/queue')
214243
# Browserify sample apps main freedom module and core environments
215244
copypasteFreedomChatFreedomModule: Rule.browserify 'samples/copypaste-freedom-chat/freedom-module'
216245
copypasteFreedomChatMain: Rule.browserify 'samples/copypaste-freedom-chat/main.core-env'

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "uproxy-lib",
33
"description": "Shared libraries for uProxy projects.",
4-
"version": "20.0.5",
4+
"version": "23.0.0",
55
"repository": {
66
"type": "git",
77
"url": "https://github.com/uProxy/uproxy-lib"

src/build-tools/common-grunt-rules.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export interface BrowserifyRule {
3939
src :string[];
4040
dest :string;
4141
options ?:{
42+
transform ?:Object[][];
4243
debug ?:boolean;
4344
};
4445
}
@@ -59,6 +60,7 @@ export interface CopyRule {
5960
export class Rule {
6061
constructor(public config :RuleConfig) {}
6162

63+
// Note: argument is modified (and returned for conveniece);
6264
public addCoverageToSpec(spec:JasmineRule) :JasmineRule {
6365
var basePath = path.dirname(spec.options.outfile);
6466

@@ -96,18 +98,26 @@ export class Rule {
9698
// Grunt browserify target creator
9799
public browserify(filepath:string, options = {
98100
browserifyOptions: { standalone: 'browserified_exports' }
99-
}) : BrowserifyRule {
101+
}) :BrowserifyRule {
100102
return {
101103
src: [ path.join(this.config.devBuildPath, filepath + '.js') ],
102104
dest: path.join(this.config.devBuildPath, filepath + '.static.js'),
103105
options: options
104106
};
105107
}
106108

109+
// Note: argument is modified (and returned for conveniece);
110+
public addCoverageToBrowserify(rule:BrowserifyRule) :BrowserifyRule {
111+
if(!rule.options.transform) {
112+
rule.options.transform = [];
113+
}
114+
rule.options.transform.push(
115+
['browserify-istanbul', { ignore: ['**/mocks/**', '**/*.spec.js'] }]);
116+
return rule
117+
}
118+
107119
// Grunt browserify target creator, instrumented for istanbul
108120
public browserifySpec(filepath:string, options = {
109-
transform: [['browserify-istanbul',
110-
{ ignore: ['**/mocks/**', '**/*.spec.js'] }]],
111121
browserifyOptions: { standalone: 'browserified_exports' }
112122
}) : BrowserifyRule {
113123
return {

src/handler/queue.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
// CONSIDER: This is kind of similar to functional parsing. May be good to
2424
// formalize the relationship in comments here.
2525

26+
import baseQueue = require('../queue/queue');
27+
2628
// The |QueueFeeder| is the abstraction for events to be handled.
2729
export interface QueueFeeder<Feed,Result> {
2830
// Number of things in the queue to be handled.
@@ -160,7 +162,7 @@ class PendingPromiseHandler<T,T2> {
160162
export class Queue<Feed,Result>
161163
implements QueueFeeder<Feed,Result>, QueueHandler<Feed,Result> {
162164
// The queue of things to handle.
163-
private queue_ :PendingPromiseHandler<Feed, Result>[] = [];
165+
private queue_ = new baseQueue.Queue<PendingPromiseHandler<Feed, Result>>();
164166

165167
// Handler function for things on the queue. When null, things queue up.
166168
// When non-null, gets called on the thing to handle. When set, called on

src/queue/queue.spec.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/// <reference path='../../../third_party/typings/jasmine/jasmine.d.ts' />
2+
3+
import queue = require('./queue');
4+
import Queue = queue.Queue;
5+
6+
describe('Base Queue', function() {
7+
var queue :Queue<string>;
8+
9+
beforeEach(() => {
10+
queue = new Queue<string>();
11+
});
12+
13+
it('New queue has length = 0', function() {
14+
expect(queue.length).toBe(0);
15+
});
16+
17+
it('3 items makes length = 3', function() {
18+
queue.push('A');
19+
queue.push('BB');
20+
queue.push('CCC');
21+
expect(queue.length).toBe(3);
22+
});
23+
24+
it('3 items and then clearing makes length = 0', function() {
25+
queue.push('A');
26+
queue.push('BB');
27+
queue.push('CCC');
28+
while (queue.length > 0) {
29+
queue.shift();
30+
}
31+
expect(queue.length).toBe(0);
32+
});
33+
34+
it('3 items come out in order', function() {
35+
queue.push('A');
36+
queue.push('BBB');
37+
queue.push('CCCCC');
38+
expect(queue.length).toBe(3);
39+
expect(queue.shift()).toEqual('A');
40+
expect(queue.length).toBe(2);
41+
expect(queue.shift()).toEqual('BBB');
42+
expect(queue.length).toBe(1);
43+
expect(queue.shift()).toEqual('CCCCC');
44+
expect(queue.length).toBe(0);
45+
});
46+
}); // describe('Base Queue', ... )

src/queue/queue.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// This file defines a basic queue data structure, providing
2+
// the standard Array push(), shift(), and length attributes,
3+
// but with O(1) operation.
4+
5+
// Private helper class.
6+
class Cell<T> {
7+
public next :Cell<T> = null;
8+
constructor(public item:T) {}
9+
}
10+
11+
export class Queue<T> {
12+
private back_ :Cell<T> = null;
13+
private front_ :Cell<T> = null;
14+
public length :number = 0;
15+
16+
constructor() {}
17+
18+
// Add an item to the back of the queue.
19+
public push = (item:T) : void => {
20+
var cell = new Cell<T>(item);
21+
if (this.length > 0) {
22+
this.back_.next = cell;
23+
} else {
24+
// The queue was empty, so set both pointers.
25+
this.front_ = cell;
26+
}
27+
this.back_ = cell;
28+
this.length++;
29+
}
30+
31+
// Remove and return the front element.
32+
public shift = () : T => {
33+
var dequeued = this.front_;
34+
// If this.front_ is this.back_, then getNext() returns null.
35+
this.front_ = dequeued.next;
36+
dequeued.next = null; // Just to help the garbage collector.
37+
this.length--;
38+
if (this.length === 0) {
39+
this.back_ = null;
40+
}
41+
return dequeued.item;
42+
}
43+
} // class Queue

src/samples/copypaste-freedom-chat/freedom-module.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
import logging = require('../../logging/logging');
55

6+
import signals = require('../../webrtc/signals');
67
import peerconnection = require('../../webrtc/peerconnection');
78
import PeerConnection = peerconnection.PeerConnection;
8-
import SignallingMessage = peerconnection.SignallingMessage;
99
import DataChannel = peerconnection.DataChannel;
1010
import Data = peerconnection.Data;
1111

@@ -35,12 +35,12 @@ export function connectDataChannel(d:DataChannel) {
3535
});
3636
}
3737

38-
export function makePeerConnection() : PeerConnection<SignallingMessage> {
39-
var pc :PeerConnection<SignallingMessage> =
38+
export function makePeerConnection() : PeerConnection<signals.Message> {
39+
var pc :PeerConnection<signals.Message> =
4040
peerconnection.createPeerConnection(pcConfig);
4141

42-
pc.signalForPeerQueue.setSyncHandler((signal:SignallingMessage) => {
43-
parentModule.emit('signalForPeer', signal);
42+
pc.signalForPeerQueue.setSyncHandler((message:signals.Message) => {
43+
parentModule.emit('signalForPeer', message);
4444
});
4545

4646
pc.onceConnected.then(() => {
@@ -62,7 +62,7 @@ export function makePeerConnection() : PeerConnection<SignallingMessage> {
6262
return pc;
6363
}
6464

65-
export var pc :PeerConnection<SignallingMessage>;
65+
export var pc :PeerConnection<signals.Message>;
6666

6767
parentModule.on('start', () => {
6868
pc = makePeerConnection();
@@ -82,9 +82,9 @@ parentModule.on('start', () => {
8282
// Receive signalling channel messages from the UI.
8383
// If pc doesn't exist yet then we are responding to the remote
8484
// peer's initiation.
85-
parentModule.on('signalFromPeer', (signal:SignallingMessage) => {
85+
parentModule.on('signalFromPeer', (message:signals.Message) => {
8686
if (pc === undefined) {
8787
pc = makePeerConnection();
8888
}
89-
pc.handleSignalMessage(signal);
89+
pc.handleSignalMessage(message);
9090
});

src/samples/simple-freedom-chat/freedom-module.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
import logging = require('../../logging/logging');
55

6+
import signals = require('../../webrtc/signals');
67
import peerconnection = require('../../webrtc/peerconnection');
78
import PeerConnection = peerconnection.PeerConnection;
8-
import SignallingMessage = peerconnection.SignallingMessage;
99
import DataChannel = peerconnection.DataChannel;
1010
import Data = peerconnection.Data;
1111

@@ -30,7 +30,7 @@ function connectDataChannel(name:string, d:DataChannel) {
3030
d.toString());
3131
});
3232
d.dataFromPeerQueue.setSyncHandler((data:Data) => {
33-
log.info(name + ': dataFromPeer: ' + JSON.stringify(data));
33+
log.info('%1: dataFromPeer: %2', name, data);
3434
// Handle messages received on the datachannel(s).
3535
parentFreedomModule.emit('receive' + name, {
3636
message: data.str
@@ -49,7 +49,7 @@ function makePeerConnection(name:string) {
4949
urls: ['stun:stun.l.google.com:19302']},
5050
{urls: ['stun:stun1.l.google.com:19302']}]
5151
};
52-
var pc :PeerConnection<SignallingMessage> =
52+
var pc :PeerConnection<signals.Message> =
5353
peerconnection.createPeerConnection(pcConfig, name);
5454
pc.onceConnecting.then(() => { log.info(name + ': connecting...'); });
5555
pc.onceConnected.then(() => {
@@ -68,18 +68,18 @@ function makePeerConnection(name:string) {
6868
return pc;
6969
}
7070

71-
var a :PeerConnection<SignallingMessage> = makePeerConnection('A');
72-
var b :PeerConnection<SignallingMessage> = makePeerConnection('B')
71+
var a :PeerConnection<signals.Message> = makePeerConnection('A');
72+
var b :PeerConnection<signals.Message> = makePeerConnection('B')
7373

7474
// Connect the two signalling channels. Normally, these messages would be sent
7575
// over the internet.
76-
a.signalForPeerQueue.setSyncHandler((signal:SignallingMessage) => {
77-
log.info('a: sending signal to b.');
78-
b.handleSignalMessage(signal);
76+
a.signalForPeerQueue.setSyncHandler((message:signals.Message) => {
77+
log.info('a: sending signalling message to b.');
78+
b.handleSignalMessage(message);
7979
});
80-
b.signalForPeerQueue.setSyncHandler((signal:SignallingMessage) => {
81-
log.info('b: sending signal to a.');
82-
a.handleSignalMessage(signal);
80+
b.signalForPeerQueue.setSyncHandler((message:signals.Message) => {
81+
log.info('b: sending signalling message to a.');
82+
a.handleSignalMessage(message);
8383
});
8484

8585
// Negotiate a peerconnection. Once negotiated, enable the UI and add

0 commit comments

Comments
 (0)