mtcute/packages/core/tests/fuzz/fuzz-transport.spec.ts
2021-06-15 03:12:22 +03:00

113 lines
2.8 KiB
TypeScript

import { describe, it } from 'mocha'
import { expect } from 'chai'
import {
BaseTelegramClient,
defaultDcs,
ICuteTransport,
randomBytes,
tl,
TransportState,
} from '../../src'
import { EventEmitter } from 'events'
import { sleep } from '../../src/utils/misc-utils'
require('dotenv-flow').config()
class RandomBytesTransport extends EventEmitter implements ICuteTransport {
dc: tl.RawDcOption
interval: NodeJS.Timeout | null
close(): void {
clearInterval(this.interval!)
this.emit('close')
this.interval = null
}
connect(dc: tl.RawDcOption): void {
this.dc = dc
setTimeout(() => this.emit('ready'), 0)
this.interval = setInterval(() => {
this.emit('message', randomBytes(64))
}, 100)
}
currentDc(): tl.RawDcOption | null {
return this.dc
}
send(data: Buffer): Promise<void> {
return Promise.resolve()
}
state(): TransportState {
return this.interval ? TransportState.Ready : TransportState.Idle
}
}
describe('fuzz : transport', function () {
this.timeout(30000)
it('RandomBytesTransport (no auth)', async () => {
const client = new BaseTelegramClient({
transport: () => new RandomBytesTransport(),
apiId: 0,
apiHash: '',
primaryDc: defaultDcs.defaultTestDc,
})
const errors: Error[] = []
client.onError((err) => {
errors.push(err)
})
await client.connect()
await sleep(15000)
await client.close()
expect(errors.length).gt(0)
errors.forEach((err) => {
expect(err.message).match(/unknown object id/i)
})
})
it('RandomBytesTransport (with auth)', async () => {
const client = new BaseTelegramClient({
transport: () => new RandomBytesTransport(),
apiId: 0,
apiHash: '',
primaryDc: defaultDcs.defaultTestDc,
})
// random key just to make it think it already has one
await client.storage.setAuthKeyFor(2, randomBytes(256))
// in this case, there will be no actual errors, only
// warnings like 'received message with unknown authKey'
//
// to test for that, we hook into `decryptMessage` and make
// sure that it returns `null`
await client.connect()
let hadNonNull = false
const decryptMessage =
client.primaryConnection['_mtproto'].decryptMessage
client.primaryConnection[
'_mtproto'
].decryptMessage = async function () {
const res = await decryptMessage.apply(this, arguments)
if (res !== null) hadNonNull = true
return res
}
await sleep(15000)
await client.close()
expect(hadNonNull).false
})
})