git ssb

0+

wanderer🌟 / js-primea-hypervisor



Tree: e0d0380c051f78c76923c1d39111ee94896e3a8d

Files: e0d0380c051f78c76923c1d39111ee94896e3a8d / tests / index.js

4067 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('ping pong', async t => {
115 class Ping extends BaseContainer {
116 async run (m) {
117 console.log('ping')
118 let port = this.kernel.ports.getRef('child')
119 if (!port) {
120 port = await this.kernel.createPort('pong', 'child')
121 }
122
123 if (this.kernel.ticks < 100) {
124 this.kernel.incrementTicks(1)
125 console.log('here')
126 return this.kernel.send(port, new Message())
127 }
128 }
129 }
130
131 class Pong extends BaseContainer {
132 run (m) {
133 console.log('pong')
134 const port = m.fromPort
135 return this.kernel.send(port, new Message())
136 }
137 }
138
139 const hypervisor = new Hypervisor({
140 dag: node.dag
141 })
142
143 try {
144 hypervisor.registerContainer('ping', Ping)
145 hypervisor.registerContainer('pong', Pong)
146 const root = await hypervisor.createInstance('pong')
147 const port = await root.createPort('ping', 'child')
148
149 await root.send(port, new Message())
150 } catch (e) {
151 console.log(e)
152 }
153 })
154})
155

Built with git-ssb-web