1
0
Fork 0

TokenDao: Lift out nondeterminism (date)

* src/server/daemon/controller.js (getUnixTimestamp): New method.  Not
  ideal, but better than where it was.
  (_initExportService): Pass to TokenDao constructor.
* src/server/token/TokenDao.ts (_getTimestamp): New field.
  (constructor)[get_timestamp]: New param.
  (updateToken): Use it.
* test/server/token/TokenDaoTest.ts: Provide stub timestamp function.
master
Mike Gerwitz 2019-09-09 16:23:15 -04:00
parent 9dd1ae3428
commit 9ea66c0440
3 changed files with 41 additions and 20 deletions

View File

@ -246,7 +246,7 @@ function _initExportService( db, callback )
ExportService ExportService
.use( TokenedService( .use( TokenedService(
'c1import', 'c1import',
new TokenDao( collection, "exports" ), new TokenDao( collection, "exports", getUnixTimestamp ),
function tokgen() function tokgen()
{ {
var shasum = crypto.createHash( 'sha1' ); var shasum = crypto.createHash( 'sha1' );
@ -268,6 +268,15 @@ function _initExportService( db, callback )
} }
/**
* Retrieve current date as a Unix timestamp
*/
function getUnixTimestamp()
{
return Math.floor( ( new Date() ).getTime() / 1000 );
}
/** /**
* Create server cache * Create server cache
* *

View File

@ -56,16 +56,30 @@ export default class TokenDao
*/ */
private readonly _rootField: string; private readonly _rootField: string;
/**
* Retrieve a Unix timestamp
*
* This is used for timestampping token updates.
*/
private readonly _getTimestamp: () => number;
/** /**
* Initialize connection * Initialize connection
* *
* @param collection Mongo collection * @param collection Mongo collection
* @param root_field topmost field in mongo document
* @param date_ctor Date constructor
*/ */
constructor( collection: MongoCollection, root_field: string ) constructor(
collection: MongoCollection,
root_field: string,
getTimestamp: () => number,
)
{ {
this._collection = collection; this._collection = collection;
this._rootField = root_field; this._rootField = root_field;
this._getTimestamp = getTimestamp;
} }
@ -91,12 +105,9 @@ export default class TokenDao
{ {
const root = this._genRoot( ns ) + '.'; const root = this._genRoot( ns ) + '.';
// XXX: nondeterminism
const current_ts = Math.floor( ( new Date() ).getTime() / 1000 );
const token_entry: TokenStatus = { const token_entry: TokenStatus = {
type: type, type: type,
timestamp: current_ts, timestamp: this._getTimestamp(),
data: data, data: data,
}; };

View File

@ -39,12 +39,13 @@ describe( 'server.token.TokenDao', () =>
{ {
it( 'updates token with given data', () => it( 'updates token with given data', () =>
{ {
const field = 'foo_field'; const field = 'foo_field';
const qid = 12345; const qid = 12345;
const ns = 'namespace'; const ns = 'namespace';
const tok_id = 'tok123'; const tok_id = 'tok123';
const tok_type = 'DONE'; const tok_type = 'DONE';
const data = "some data"; const data = "some data";
const timestamp = 12345;
const root = field + '.' + ns; const root = field + '.' + ns;
@ -54,10 +55,9 @@ describe( 'server.token.TokenDao', () =>
expect( given_data.$set[ `${root}.lastStatus` ].timestamp ) expect( given_data.$set[ `${root}.lastStatus` ].timestamp )
.to.be.greaterThan( 0 ); .to.be.greaterThan( 0 );
// TODO: ts is nondeterministic; pass in
const expected_entry: TokenStatus = { const expected_entry: TokenStatus = {
type: tok_type, type: tok_type,
timestamp: given_data.$set[ `${root}.lastStatus` ].timestamp, timestamp: timestamp,
data: data, data: data,
}; };
@ -83,7 +83,7 @@ describe( 'server.token.TokenDao', () =>
findOne() {}, findOne() {},
}; };
return new Sut( coll, field ) return new Sut( coll, field, () => timestamp )
.updateToken( qid, ns, tok_id, tok_type, data ); .updateToken( qid, ns, tok_id, tok_type, data );
} ); } );
@ -102,7 +102,8 @@ describe( 'server.token.TokenDao', () =>
}; };
return expect( return expect(
new Sut( coll, 'foo' ).updateToken( 0, 'ns', 'id', 'DONE', null ) new Sut( coll, 'foo', () => 0 )
.updateToken( 0, 'ns', 'id', 'DONE', null )
).to.eventually.be.rejectedWith( expected_error ); ).to.eventually.be.rejectedWith( expected_error );
} ); } );
} ); } );
@ -206,7 +207,7 @@ describe( 'server.token.TokenDao', () =>
}; };
return expect( return expect(
new Sut( coll, field ).getToken( qid, ns, tok_id ) new Sut( coll, field, () => 0 ).getToken( qid, ns, tok_id )
).to.eventually.deep.equal( expected ); ).to.eventually.deep.equal( expected );
} ) } )
); );
@ -226,7 +227,7 @@ describe( 'server.token.TokenDao', () =>
}; };
return expect( return expect(
new Sut( coll, 'foo' ).getToken( 0, 'ns', 'id' ) new Sut( coll, 'foo', () => 0 ).getToken( 0, 'ns', 'id' )
).to.eventually.be.rejectedWith( expected_error ); ).to.eventually.be.rejectedWith( expected_error );
} ); } );
} ); } );