tests/index.jsView |
---|
1 | 1 … | const tape = require('tape') |
2 | 2 … | const IPFS = require('ipfs') |
3 | 3 … | const AbstractContainer = require('primea-abstract-container') |
| 4 … | +const Message = require('primea-message') |
4 | 5 … | const Hypervisor = require('../') |
5 | 6 … | |
6 | 7 … | |
7 | 8 … | const node = new IPFS({ |
8 | 9 … | start: false |
9 | 10 … | }) |
10 | 11 … | |
11 | 12 … | class BaseContainer extends AbstractContainer { |
12 | | - initialize (message) { |
| 13 … | + onCreation (message) { |
13 | 14 … | this.kernel.state.code = message.data.byteLength ? message.data : undefined |
14 | 15 … | const port = message.ports[0] |
15 | 16 … | if (port) { |
16 | 17 … | this.kernel.ports.bind('root', port) |
26 | 27 … | '/': 'zdpuB1wc9Pb6jUzfNt4nAxAEUxB7kNhg4vbq7YLcEyBUb6iAB' |
27 | 28 … | } |
28 | 29 … | |
29 | 30 … | class testVMContainer extends BaseContainer { |
30 | | - run (m) { |
| 31 … | + onMessage (m) { |
31 | 32 … | t.true(m === message, 'should recive a message') |
32 | 33 … | } |
33 | 34 … | } |
34 | 35 … | |
60 | 61 … | '/': 'zdpuAozDi6tKPbqmHJxo7aNES2xVt1MkaCLyxcioEKzz3M2WH' |
61 | 62 … | } |
62 | 63 … | |
63 | 64 … | class testVMContainer extends BaseContainer { |
64 | | - initialize () {} |
| 65 … | + onCreation () {} |
65 | 66 … | } |
66 | 67 … | |
67 | 68 … | const hypervisor = new Hypervisor(node.dag) |
68 | 69 … | hypervisor.registerContainer('test', testVMContainer) |
86 | 87 … | '/': 'zdpuAtVcH6MUnvt2RXnLsDXyLB3CBSQ7aydfh2ogSKGCejJCQ' |
87 | 88 … | } |
88 | 89 … | |
89 | 90 … | class testVMContainer2 extends BaseContainer { |
90 | | - run (m) { |
| 91 … | + onMessage (m) { |
91 | 92 … | t.true(m === message, 'should recive a message') |
92 | 93 … | } |
93 | 94 … | } |
94 | 95 … | |
95 | 96 … | class testVMContainer extends BaseContainer { |
96 | | - run (m) { |
| 97 … | + onMessage (m) { |
97 | 98 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
98 | 99 … | this.kernel.createInstance('test2', this.kernel.createMessage({ |
99 | 100 … | ports: [portRef2] |
100 | 101 … | })) |
132 | 133 … | } |
133 | 134 … | let hasResolved = false |
134 | 135 … | |
135 | 136 … | class testVMContainer2 extends BaseContainer { |
136 | | - run (m) { |
| 137 … | + onMessage (m) { |
137 | 138 … | t.true(m === message, 'should recive a message') |
138 | 139 … | return new Promise((resolve, reject) => { |
139 | 140 … | setTimeout(() => { |
140 | 141 … | this.kernel.incrementTicks(1) |
145 | 146 … | } |
146 | 147 … | } |
147 | 148 … | |
148 | 149 … | class testVMContainer extends BaseContainer { |
149 | | - run (m) { |
| 150 … | + onMessage (m) { |
150 | 151 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
151 | 152 … | this.kernel.createInstance('test2', this.kernel.createMessage({ |
152 | 153 … | ports: [portRef2] |
153 | 154 … | })) |
177 | 178 … | t.deepEquals(stateRoot, expectedState, 'expected state') |
178 | 179 … | |
179 | 180 … | |
180 | 181 … | class testVMContainer3 extends BaseContainer { |
181 | | - run (m) { |
| 182 … | + onMessage (m) { |
182 | 183 … | const port = this.kernel.ports.get('child') |
183 | 184 … | this.kernel.send(port, m) |
184 | 185 … | this.kernel.incrementTicks(1) |
185 | 186 … | } |
193 | 194 … | |
194 | 195 … | tape('traps', async t => { |
195 | 196 … | t.plan(1) |
196 | 197 … | class Root extends BaseContainer { |
197 | | - async run (m) { |
| 198 … | + async onMessage (m) { |
198 | 199 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
199 | 200 … | const [portRef3, portRef4] = this.kernel.ports.createChannel() |
200 | 201 … | const [portRef5, portRef6] = this.kernel.ports.createChannel() |
201 | 202 … | |
224 | 225 … | const hypervisor = new Hypervisor(node.dag) |
225 | 226 … | |
226 | 227 … | hypervisor.registerContainer('root', Root) |
227 | 228 … | const root = await hypervisor.createInstance('root') |
228 | | - await root.run(root.createMessage()) |
| 229 … | + await root.message(root.createMessage()) |
229 | 230 … | const stateRoot = await hypervisor.createStateRoot() |
230 | 231 … | |
231 | 232 … | t.deepEquals(stateRoot, { |
232 | 233 … | '/': 'zdpuAwrMmQXqFusve7zcRYxVUuji4NVzZR5GyjwyStsjteCoW' |
237 | 238 … | t.plan(2) |
238 | 239 … | let runs = 0 |
239 | 240 … | |
240 | 241 … | class Root extends BaseContainer { |
241 | | - run (m) { |
| 242 … | + onMessage (m) { |
242 | 243 … | if (!runs) { |
243 | 244 … | runs++ |
244 | 245 … | |
245 | 246 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
269 | 270 … | } |
270 | 271 … | } |
271 | 272 … | |
272 | 273 … | class First extends BaseContainer { |
273 | | - run (m) { |
| 274 … | + onMessage (m) { |
274 | 275 … | this.kernel.incrementTicks(2) |
275 | 276 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
276 | 277 … | data: 'first' |
277 | 278 … | })) |
278 | 279 … | } |
279 | 280 … | } |
280 | 281 … | |
281 | 282 … | class Second extends BaseContainer { |
282 | | - run (m) { |
| 283 … | + onMessage (m) { |
283 | 284 … | this.kernel.incrementTicks(3) |
284 | 285 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
285 | 286 … | data: 'second' |
286 | 287 … | })) |
309 | 310 … | t.plan(2) |
310 | 311 … | let runs = 0 |
311 | 312 … | |
312 | 313 … | class Root extends BaseContainer { |
313 | | - run (m) { |
| 314 … | + onMessage (m) { |
314 | 315 … | if (!runs) { |
315 | 316 … | runs++ |
316 | 317 … | |
317 | 318 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
341 | 342 … | } |
342 | 343 … | } |
343 | 344 … | |
344 | 345 … | class First extends BaseContainer { |
345 | | - run (m) { |
| 346 … | + onMessage (m) { |
346 | 347 … | this.kernel.incrementTicks(2) |
347 | 348 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
348 | 349 … | data: 'first' |
349 | 350 … | })) |
350 | 351 … | } |
351 | 352 … | } |
352 | 353 … | |
353 | 354 … | class Second extends BaseContainer { |
354 | | - run (m) { |
| 355 … | + onMessage (m) { |
355 | 356 … | this.kernel.incrementTicks(1) |
356 | 357 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
357 | 358 … | data: 'second' |
358 | 359 … | })) |
381 | 382 … | t.plan(2) |
382 | 383 … | let runs = 0 |
383 | 384 … | |
384 | 385 … | class Root extends BaseContainer { |
385 | | - run (m) { |
| 386 … | + onMessage (m) { |
386 | 387 … | if (!runs) { |
387 | 388 … | runs++ |
388 | 389 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
389 | 390 … | const [portRef3, portRef4] = this.kernel.ports.createChannel() |
414 | 415 … | } |
415 | 416 … | } |
416 | 417 … | |
417 | 418 … | class First extends BaseContainer { |
418 | | - run (m) { |
| 419 … | + onMessage (m) { |
419 | 420 … | this.kernel.incrementTicks(1) |
420 | 421 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
421 | 422 … | data: 'first' |
422 | 423 … | })) |
423 | 424 … | } |
424 | 425 … | } |
425 | 426 … | |
426 | 427 … | class Second extends BaseContainer { |
427 | | - run (m) { |
| 428 … | + onMessage (m) { |
428 | 429 … | this.kernel.incrementTicks(2) |
429 | 430 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
430 | 431 … | data: 'second' |
431 | 432 … | })) |
453 | 454 … | t.plan(2) |
454 | 455 … | let runs = 0 |
455 | 456 … | |
456 | 457 … | class Root extends BaseContainer { |
457 | | - run (m) { |
| 458 … | + onMessage (m) { |
458 | 459 … | if (!runs) { |
459 | 460 … | runs++ |
460 | 461 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
461 | 462 … | const [portRef3, portRef4] = this.kernel.ports.createChannel() |
487 | 488 … | } |
488 | 489 … | } |
489 | 490 … | |
490 | 491 … | class First extends BaseContainer { |
491 | | - run (m) { |
| 492 … | + onMessage (m) { |
492 | 493 … | this.kernel.incrementTicks(2) |
493 | 494 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
494 | 495 … | data: 'first' |
495 | 496 … | })) |
496 | 497 … | } |
497 | 498 … | } |
498 | 499 … | |
499 | 500 … | class Second extends BaseContainer { |
500 | | - run (m) { |
| 501 … | + onMessage (m) { |
501 | 502 … | this.kernel.incrementTicks(3) |
502 | 503 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
503 | 504 … | data: 'second' |
504 | 505 … | })) |
505 | 506 … | } |
506 | 507 … | } |
507 | 508 … | |
508 | 509 … | class Waiter extends BaseContainer { |
509 | | - initialize () { |
| 510 … | + onCreation () { |
510 | 511 … | return new Promise((resolve, reject) => { |
511 | 512 … | setTimeout(() => { |
512 | 513 … | resolve() |
513 | 514 … | }, 200) |
548 | 549 … | |
549 | 550 … | let runs = 0 |
550 | 551 … | |
551 | 552 … | class Root extends BaseContainer { |
552 | | - run (m) { |
| 553 … | + onMessage (m) { |
553 | 554 … | if (!runs) { |
554 | 555 … | runs++ |
555 | 556 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
556 | 557 … | const [portRef3, portRef4] = this.kernel.ports.createChannel() |
581 | 582 … | } |
582 | 583 … | } |
583 | 584 … | |
584 | 585 … | class First extends BaseContainer { |
585 | | - run (m) { |
| 586 … | + onMessage (m) { |
586 | 587 … | this.kernel.incrementTicks(2) |
587 | 588 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
588 | 589 … | data: 'first' |
589 | 590 … | })) |
590 | 591 … | } |
591 | 592 … | } |
592 | 593 … | |
593 | 594 … | class Second extends BaseContainer { |
594 | | - run (m) { |
| 595 … | + onMessage (m) { |
595 | 596 … | this.kernel.incrementTicks(2) |
596 | 597 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
597 | 598 … | data: 'second' |
598 | 599 … | })) |
621 | 622 … | |
622 | 623 … | let runs = 0 |
623 | 624 … | |
624 | 625 … | class Root extends BaseContainer { |
625 | | - run (m) { |
| 626 … | + onMessage (m) { |
626 | 627 … | if (!runs) { |
627 | 628 … | runs++ |
628 | 629 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
629 | 630 … | const [portRef3, portRef4] = this.kernel.ports.createChannel() |
654 | 655 … | } |
655 | 656 … | } |
656 | 657 … | |
657 | 658 … | class First extends BaseContainer { |
658 | | - run (m) { |
| 659 … | + onMessage (m) { |
659 | 660 … | this.kernel.incrementTicks(2) |
660 | 661 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
661 | 662 … | data: 'first' |
662 | 663 … | })) |
663 | 664 … | } |
664 | 665 … | } |
665 | 666 … | |
666 | 667 … | class Second extends BaseContainer { |
667 | | - run (m) { |
| 668 … | + onMessage (m) { |
668 | 669 … | this.kernel.incrementTicks(2) |
669 | 670 … | this.kernel.send(m.fromPort, this.kernel.createMessage({ |
670 | 671 … | data: 'second' |
671 | 672 … | })) |
695 | 696 … | let runs = 0 |
696 | 697 … | let instance |
697 | 698 … | |
698 | 699 … | class Root extends BaseContainer { |
699 | | - run (m) { |
| 700 … | + onMessage (m) { |
700 | 701 … | let one = this.kernel.ports.get('one') |
701 | 702 … | if (!one) { |
702 | 703 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
703 | 704 … | this.kernel.ports.bind('one', portRef1) |
712 | 713 … | } |
713 | 714 … | } |
714 | 715 … | |
715 | 716 … | class First extends BaseContainer { |
716 | | - run (m) { |
| 717 … | + onMessage (m) { |
717 | 718 … | ++runs |
718 | 719 … | if (runs === 2) { |
719 | 720 … | t.equals(instance, this, 'should have same instances') |
720 | 721 … | } else { |
788 | 789 … | const expectedSr = { |
789 | 790 … | '/': 'zdpuB2QXxn1KQtLFfBqaritTRoe5BuKP5sNFSrPtRT6sxkY7Z' |
790 | 791 … | } |
791 | 792 … | class Root extends BaseContainer { |
792 | | - run (m) { |
| 793 … | + onMessage (m) { |
793 | 794 … | const [portRef1, portRef2] = this.kernel.ports.createChannel() |
794 | 795 … | this.kernel.ports.bind('one', portRef1) |
795 | 796 … | const message1 = this.kernel.createMessage({ |
796 | 797 … | ports: [portRef2] |
802 | 803 … | } |
803 | 804 … | } |
804 | 805 … | |
805 | 806 … | class First extends BaseContainer { |
806 | | - run (m) { |
| 807 … | + onMessage (m) { |
807 | 808 … | this.kernel.incrementTicks(2) |
808 | 809 … | this.kernel.ports.delete('root') |
809 | 810 … | } |
810 | 811 … | } |
834 | 835 … | const expectedSr = { |
835 | 836 … | '/': 'zdpuB2QXxn1KQtLFfBqaritTRoe5BuKP5sNFSrPtRT6sxkY7Z' |
836 | 837 … | } |
837 | 838 … | class Root extends BaseContainer { |
838 | | - run (m) { |
| 839 … | + onMessage (m) { |
839 | 840 … | this.kernel.createInstance('root') |
840 | 841 … | } |
841 | 842 … | } |
842 | 843 … | |
863 | 864 … | const expectedSr = { |
864 | 865 … | '/': 'zdpuB2QXxn1KQtLFfBqaritTRoe5BuKP5sNFSrPtRT6sxkY7Z' |
865 | 866 … | } |
866 | 867 … | class Root extends BaseContainer { |
867 | | - run (m) { |
| 868 … | + onMessage (m) { |
868 | 869 … | const [, portRef2] = this.kernel.ports.createChannel() |
869 | 870 … | this.kernel.createInstance('sub', this.kernel.createMessage({ |
870 | 871 … | ports: [portRef2] |
871 | 872 … | })) |
872 | 873 … | } |
873 | 874 … | } |
874 | 875 … | |
875 | 876 … | class Sub extends BaseContainer { |
876 | | - initailize (message) { |
| 877 … | + onInitailize (message) { |
877 | 878 … | this.kernel.ports.bind('root', message.ports[0]) |
878 | 879 … | const [portRef1, portRef2] = root.ports.createChannel() |
879 | 880 … | root.ports.bind('child', portRef1) |
880 | 881 … | root.createInstance('root', root.createMessage({ |
906 | 907 … | const expectedSr = { |
907 | 908 … | '/': 'zdpuAwsZTd5mRZBCYA1FJSHrpYDPgSZSiaTQp9xkUeajaoMHM' |
908 | 909 … | } |
909 | 910 … | class Root extends BaseContainer { |
910 | | - run (m) { |
| 911 … | + onMessage (m) { |
911 | 912 … | if (m.ports.length) { |
912 | 913 … | const port = this.kernel.ports.get('test1') |
913 | 914 … | this.kernel.send(port, m) |
914 | 915 … | this.kernel.ports.unbind('test1') |
931 | 932 … | } |
932 | 933 … | } |
933 | 934 … | |
934 | 935 … | class Sub extends BaseContainer { |
935 | | - run (message) { |
| 936 … | + onMessage (message) { |
936 | 937 … | if (message.data === 'getChannel') { |
937 | 938 … | const ports = this.kernel.ports.createChannel() |
938 | 939 … | this.kernel.ports.bind('channel', ports[0]) |
939 | 940 … | this.kernel.send(message.fromPort, this.kernel.createMessage({ |
970 | 971 … | const expectedSr = { |
971 | 972 … | '/': 'zdpuAmi9tkYTpoVsZvqQgxpQFRhCgYFVv4W3fjjfVhf1j8swv' |
972 | 973 … | } |
973 | 974 … | class Root extends BaseContainer { |
|
974 | | - run (m) { |
| 975 … | + onMessage (m) { |
975 | 976 … | if (m.ports.length) { |
976 | 977 … | const port = this.kernel.ports.get('test1') |
977 | 978 … | this.kernel.send(port, m) |
978 | 979 … | this.kernel.ports.unbind('test1') |
996 | 997 … | } |
997 | 998 … | } |
998 | 999 … | |
999 | 1000 … | class Sub extends BaseContainer { |
1000 | | - run (message) { |
| 1001 … | + onMessage (message) { |
1001 | 1002 … | if (message.data === 'getChannel') { |
1002 | 1003 … | const ports = this.kernel.ports.createChannel() |
1003 | 1004 … | this.kernel.ports.bind('channel', ports[0]) |
1004 | 1005 … | this.kernel.send(message.fromPort, this.kernel.createMessage({ |
1037 | 1038 … | let runs = 0 |
1038 | 1039 … | const returnValue = 'this is a test' |
1039 | 1040 … | |
1040 | 1041 … | class testVMContainer extends BaseContainer { |
1041 | | - run (m) { |
| 1042 … | + onMessage (m) { |
1042 | 1043 … | runs++ |
1043 | 1044 … | if (runs === 1) { |
1044 | 1045 … | return returnValue |
1045 | 1046 … | } else { |
1070 | 1071 … | |
1071 | 1072 … | rootContainer.send(portRef1, message) |
1072 | 1073 … | rootContainer.ports.bind('response', rPort) |
1073 | 1074 … | }) |
| 1075 … | + |
| 1076 … | + tape('start up', async t => { |
| 1077 … | + t.plan(1) |
| 1078 … | + class testVMContainer extends BaseContainer { |
| 1079 … | + onMessage () {} |
| 1080 … | + onStartup () { |
| 1081 … | + t.true(true, 'should start up') |
| 1082 … | + } |
| 1083 … | + } |
| 1084 … | + |
| 1085 … | + const hypervisor = new Hypervisor(node.dag) |
| 1086 … | + hypervisor.registerContainer('test', testVMContainer) |
| 1087 … | + await hypervisor.createInstance('test') |
| 1088 … | + hypervisor.getInstance(hypervisor.ROOT_ID) |
| 1089 … | + }) |
| 1090 … | + |
| 1091 … | + tape('large code size', async t => { |
| 1092 … | + t.plan(1) |
| 1093 … | + const content = Buffer.from(new ArrayBuffer(1000000)) |
| 1094 … | + class testVMContainer extends BaseContainer { |
| 1095 … | + onMessage () {} |
| 1096 … | + } |
| 1097 … | + |
| 1098 … | + const hypervisor = new Hypervisor(node.dag) |
| 1099 … | + hypervisor.registerContainer('test', testVMContainer) |
| 1100 … | + await hypervisor.createInstance('test', new Message({data: content})) |
| 1101 … | + const instance = await hypervisor.getInstance(hypervisor.ROOT_ID) |
| 1102 … | + t.equals(content.length, instance.code.length) |
| 1103 … | + }) |
1074 | 1104 … | }) |