CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PrismarineJS

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.

GitHub Repository: PrismarineJS/mineflayer
Path: blob/master/test/externalTest.js
Views: 789
1
/* eslint-env mocha */
2
3
const assert = require('assert')
4
const mineflayer = require('../')
5
const commonTest = require('./externalTests/plugins/testCommon')
6
const mc = require('minecraft-protocol')
7
const fs = require('fs')
8
const path = require('path')
9
10
const { getPort } = require('./common/util')
11
12
// set this to false if you want to test without starting a server automatically
13
const START_THE_SERVER = true
14
// if you want to have time to look what's happening increase this (milliseconds)
15
const TEST_TIMEOUT_MS = 90000
16
17
const excludedTests = ['digEverything', 'book', 'anvil', 'placeEntity']
18
19
const propOverrides = {
20
'level-type': 'FLAT',
21
'spawn-npcs': 'true',
22
'spawn-animals': 'false',
23
'online-mode': 'false',
24
gamemode: '1',
25
'spawn-monsters': 'false',
26
'generate-structures': 'false',
27
'enable-command-block': 'true',
28
'use-native-transport': 'false' // java 16 throws errors without this, https://www.spigotmc.org/threads/unable-to-access-address-of-buffer.311602
29
}
30
31
const Wrap = require('minecraft-wrap').Wrap
32
const download = require('minecraft-wrap').download
33
34
const MC_SERVER_PATH = path.join(__dirname, 'server')
35
36
for (const supportedVersion of mineflayer.testedVersions) {
37
let PORT = 25565
38
const registry = require('prismarine-registry')(supportedVersion)
39
const version = registry.version
40
const MC_SERVER_JAR_DIR = process.env.MC_SERVER_JAR_DIR || `${process.cwd()}/server_jars`
41
const MC_SERVER_JAR = `${MC_SERVER_JAR_DIR}/minecraft_server.${version.minecraftVersion}.jar`
42
const wrap = new Wrap(MC_SERVER_JAR, `${MC_SERVER_PATH}_${supportedVersion}`)
43
wrap.on('line', (line) => {
44
console.log(line)
45
})
46
47
describe(`mineflayer_external ${supportedVersion}v`, function () {
48
let bot
49
this.timeout(10 * 60 * 1000)
50
before(async function () {
51
PORT = await getPort()
52
console.log(`Port chosen: ${PORT}`)
53
})
54
before(function (done) {
55
this.timeout(1000 * 60)
56
function begin () {
57
bot = mineflayer.createBot({
58
username: 'flatbot',
59
viewDistance: 'tiny',
60
port: PORT,
61
host: '127.0.0.1',
62
version: supportedVersion
63
})
64
commonTest(bot)
65
bot.test.port = PORT
66
67
console.log('starting bot')
68
bot.once('spawn', () => {
69
wrap.writeServer('op flatbot\n')
70
bot.once('messagestr', msg => {
71
if (msg.includes('Made flatbot a server operator') || msg === '[Server: Opped flatbot]') {
72
done()
73
}
74
})
75
})
76
}
77
78
if (START_THE_SERVER) {
79
console.log('downloading and starting server')
80
download(version.minecraftVersion, MC_SERVER_JAR, (err) => {
81
if (err) {
82
console.log(err)
83
done(err)
84
return
85
}
86
propOverrides['server-port'] = PORT
87
wrap.startServer(propOverrides, (err) => {
88
if (err) return done(err)
89
console.log(`pinging ${version.minecraftVersion} port : ${PORT}`)
90
mc.ping({
91
port: PORT,
92
host: '127.0.0.1',
93
version: supportedVersion
94
}, (err, results) => {
95
if (err) return done(err)
96
console.log('pong')
97
assert.ok(results.latency >= 0)
98
assert.ok(results.latency <= 1000)
99
begin()
100
})
101
})
102
})
103
} else begin()
104
})
105
106
beforeEach(async () => {
107
console.log('reset state')
108
await bot.test.resetState()
109
})
110
111
after((done) => {
112
bot.quit()
113
wrap.stopServer((err) => {
114
if (err) {
115
console.log(err)
116
}
117
wrap.deleteServerData((err) => {
118
if (err) {
119
console.log(err)
120
}
121
done(err)
122
})
123
})
124
})
125
126
const externalTestsFolder = path.resolve(__dirname, './externalTests')
127
fs.readdirSync(externalTestsFolder)
128
.filter(file => fs.statSync(path.join(externalTestsFolder, file)).isFile())
129
.forEach((test) => {
130
test = path.basename(test, '.js')
131
const testFunctions = require(`./externalTests/${test}`)(supportedVersion)
132
const runTest = (testName, testFunction) => {
133
return function (done) {
134
this.timeout(TEST_TIMEOUT_MS)
135
bot.test.sayEverywhere(`### Starting ${testName}`)
136
testFunction(bot, done).then(res => done()).catch(e => done(e))
137
}
138
}
139
if (excludedTests.indexOf(test) === -1) {
140
if (typeof testFunctions === 'object') {
141
for (const testFunctionName in testFunctions) {
142
if (testFunctions[testFunctionName] !== undefined) {
143
it(`${test} ${testFunctionName}`, (testFunctionName => runTest(`${test} ${testFunctionName}`, testFunctions[testFunctionName]))(testFunctionName))
144
}
145
}
146
} else {
147
it(test, runTest(test, testFunctions))
148
}
149
}
150
})
151
})
152
}
153
154