git ssb

0+

wanderer🌟 / js-primea-hypervisor



Tree: 420c091edd500452248946f7f519a3f0bd7b3a3e

Files: 420c091edd500452248946f7f519a3f0bd7b3a3e / tests / index.js

4688 bytesRaw
1const tape = require('tape')
2const IPFS = require('ipfs')
3const Hypervisor = require('../')
4const Message = require('primea-message')
5
6const node = new IPFS()
7
8class BaseContainer {
9 constructor (kernel) {
10 this.kernel = kernel
11 }
12
13 static createState (code) {
14 return {
15 nonce: [0],
16 ports: {}
17 }
18 }
19}
20
21node.on('error', err => {
22 console.log(err)
23})
24
25node.on('start', () => {
26 tape('basic', async t => {
27 const message = new Message()
28 const expectedState = {
29 '/': 'zdpuAntkdU7yBJojcBT5Q9wBhrK56NmLnwpHPKaEGMFnAXpv7'
30 }
31
32 class testVMContainer extends BaseContainer {
33 run (m) {
34 t.true(m === message, 'should recive a message')
35 }
36 }
37
38 const hypervisor = new Hypervisor({dag: node.dag})
39 hypervisor.registerContainer('test', testVMContainer)
40
41 const rootContainer = await hypervisor.createInstance('test')
42 const port = await rootContainer.createPort('test', 'first')
43
44 await rootContainer.send(port, message)
45
46 const stateRoot = await hypervisor.createStateRoot(rootContainer, Infinity)
47 t.deepEquals(stateRoot, expectedState, 'expected root!')
48 t.end()
49 })
50
51 tape('one child contract', async t => {
52 let message = new Message()
53 const expectedState = {
54 '/': 'zdpuAofSzrBqwYs6z1r28fMeb8z5oSKF6CcWA6m22RqazgoTB'
55 }
56 let hasResolved = false
57
58 class testVMContainer2 extends BaseContainer {
59 run (m) {
60 t.true(m === message, 'should recive a message 2')
61 return new Promise((resolve, reject) => {
62 setTimeout(() => {
63 this.kernel.incrementTicks(1)
64 hasResolved = true
65 resolve()
66 }, 200)
67 })
68 }
69 }
70
71 class testVMContainer extends BaseContainer {
72 async run (m) {
73 const port = await this.kernel.createPort('test2', 'child')
74 await this.kernel.send(port, m)
75 this.kernel.incrementTicks(1)
76 }
77 }
78
79 const hypervisor = new Hypervisor({dag: node.dag})
80 hypervisor.registerContainer('test', testVMContainer)
81 hypervisor.registerContainer('test2', testVMContainer2)
82
83 let root = await hypervisor.createInstance('test')
84 let port = await root.createPort('test', 'first')
85
86 await root.send(port, message)
87 const stateRoot = await hypervisor.createStateRoot(root, Infinity)
88 t.true(hasResolved, 'should resolve before generating the state root')
89 t.deepEquals(stateRoot, expectedState, 'expected state')
90
91 // test reviving the state
92 class testVMContainer3 extends BaseContainer {
93 async run (m) {
94 const port = this.kernel.ports.getRef('child')
95 await this.kernel.send(port, m)
96 this.kernel.incrementTicks(1)
97 }
98 }
99
100 hypervisor.registerContainer('test', testVMContainer3)
101 root = await hypervisor.createInstance('test', stateRoot)
102 port = await root.ports.getRef('first')
103
104 await root.send(port, message)
105 await hypervisor.createStateRoot(root, Infinity)
106
107 t.end()
108
109 node.stop(() => {
110 process.exit()
111 })
112 })
113
114 tape.skip('should wait on parent', async t => {
115 let r
116 const lock = new Promise((resolve, reject) => {
117 r = resolve
118 })
119
120 let parentHasFinished = false
121 let childHasFinished = false
122 class testVMContainer extends BaseContainer {
123 async run (m) {
124 console.log('in parent')
125 const port = await this.kernel.createPort(this.kernel.ports, 'test2', 'child')
126 await this.kernel.send(port, m)
127 await lock
128 return new Promise((resolve, reject) => {
129 setTimeout(() => {
130 console.log('parent done')
131 this.kernel.incrementTicks(1)
132 parentHasFinished = true
133 t.equals(childHasFinished, false, 'child should not have finished at this point')
134 resolve()
135 }, 200)
136 })
137 }
138 }
139
140 // test reviving the state
141 class testVMContainer2 extends BaseContainer {
142 async run (m) {
143 console.log('in child')
144 childHasFinished = true
145 r()
146 this.kernel.incrementTicks(1)
147 try {
148 await this.kernel.ports.getNextMessage()
149 } catch (e) {
150 console.log(e)
151 }
152 t.equals(parentHasFinished, true, 'parent should have finished at this point')
153 }
154 }
155
156 const hypervisor = new Hypervisor({dag: node.dag})
157 hypervisor.addVM('test', testVMContainer)
158 hypervisor.addVM('test2', testVMContainer2)
159 const port = hypervisor.createPort('test')
160
161 let message = new Message()
162 try {
163 await hypervisor.send(port, message)
164 await hypervisor.createStateRoot(port, Infinity)
165 } catch (e) {
166 console.log(e)
167 }
168
169 t.end()
170 })
171})
172

Built with git-ssb-web