/ test / contracts.js
contracts.js
  1  /*globals describe, it*/
  2  let ContractsManager = require('../lib/modules/contracts_manager/index.js');
  3  let Compiler = require('../lib/modules/compiler/');
  4  let Logger = require('../lib/core/logger.js');
  5  let File = require('../lib/core/file.js');
  6  let TestLogger = require('../lib/utils/test_logger');
  7  let Events = require('../lib/core/events');
  8  let Ipc = require('../lib/core/ipc.js');
  9  let assert = require('assert');
 10  
 11  //let SolidityCompiler = require('../lib/modules/solidity');
 12  let Plugins = require('../lib/core/plugins.js');
 13  
 14  let readFile = function(file) {
 15    return new File({filename: file, type: File.types.dapp_file, path: file});
 16  };
 17  
 18  const currentSolcVersion = require('../package.json').dependencies.solc;
 19  const TestEvents = {
 20    request: (cmd, cb) => {
 21      cb(currentSolcVersion);
 22    },
 23    emit: (_ev, _data) => {}
 24  };
 25  
 26  describe('embark.Contracts', function() {
 27    this.timeout(0);
 28    describe('simple', function() {
 29      let plugins = new Plugins({
 30        logger: new TestLogger({}),
 31        events: TestEvents,
 32        config: {
 33          contractDirectories: ['app/contracts/'],
 34          embarkConfig: {
 35            options: {
 36              solc: {
 37                "optimize": true,
 38                "optimize-runs": 200
 39              }
 40            }
 41          }
 42        }
 43      });
 44      let ipcObject = new Ipc({
 45        ipcRole: 'none'
 46      });
 47      plugins.loadInternalPlugin('solidity', {ipc: ipcObject});
 48  
 49      let events = new Events();
 50      let embarkObject = {
 51        events: events,
 52        logger: plugins.logger,
 53        embarkConfig: {
 54          options: {
 55            solc: {
 56              "optimize": true,
 57              "optimize-runs": 200
 58            }
 59          }
 60        }
 61      };
 62  
 63      let compiler = new Compiler(embarkObject, {plugins: plugins});
 64  
 65      events.setCommandHandler("config:contractsConfig", function(cb) {
 66        cb(contractsConfig);
 67      });
 68  
 69      events.setCommandHandler("config:contractsFiles", (cb) => {
 70        cb([
 71          readFile('test/contracts/simple_storage.sol'),
 72          readFile('test/contracts/token.sol')
 73        ]);
 74      });
 75  
 76      events.setCommandHandler("blockchain:gasPrice", (cb) => {
 77        cb(null, 100);
 78      });
 79  
 80      let contractsConfig = {
 81        "versions": {
 82          "web3.js": "1.0.0-beta",
 83          "solc": "0.4.17"
 84        },
 85        "deployment": {
 86          "host": "localhost",
 87          "port": 8545,
 88          "type": "rpc"
 89        },
 90        "dappConnection": [
 91          "$WEB3",
 92          "localhost:8545"
 93        ],
 94        "gas": "auto",
 95        "contracts": {
 96          "Token": {
 97            "args": [
 98              100
 99            ]
100          },
101          "SimpleStorage": {
102            "args": [
103              200
104            ]
105          }
106        }
107      };
108  
109      let embarkObj = {
110        logger: new Logger({}),
111        events: events
112      };
113  
114      let contractsManager = new ContractsManager(embarkObj, {
115        contractDirectories: ['app/contracts']
116      });
117  
118      describe('#build', function() {
119        it('generate contracts', function(done) {
120          contractsManager.build(function(err, result) {
121            if (err) {
122              throw err;
123            }
124  
125            let contracts = contractsManager.listContracts();
126            assert.equal(contracts.length, 2);
127  
128            assert.equal(contracts[0].deploy, true);
129            assert.deepEqual(contracts[0].args, [100]);
130            assert.equal(contracts[0].className, "Token");
131            //assert.deepEqual(contracts[0].gas, 725000);
132            assert.deepEqual(contracts[0].gas, 'auto');
133            //assert.equal(contracts[0].gasPrice, []); // TODO: test this one
134            assert.equal(contracts[0].type, 'file');
135            //assert.equal(contracts[0].abiDefinition, '');
136            //assert.equal(contracts[0].code, '');
137            //assert.equal(contracts[0].runtimeBytecode, '');
138  
139            assert.equal(contracts[1].deploy, true);
140            assert.deepEqual(contracts[1].args, [200]);
141            assert.equal(contracts[1].className, "SimpleStorage");
142            //assert.deepEqual(contracts[1].gas, 725000);
143            assert.deepEqual(contracts[1].gas, 'auto');
144            //assert.equal(contracts[1].gasPrice, []); // TODO: test this one
145            assert.equal(contracts[1].type, 'file');
146            //assert.equal(contracts[1].abiDefinition, '');
147            //assert.equal(contracts[1].code, '');
148            //assert.equal(contracts[1].runtimeBytecode, '');
149            done();
150          });
151        });
152      });
153    });
154  
155    describe('config with contract instances', function() {
156      let plugins = new Plugins({
157        logger: new TestLogger({}),
158        events: TestEvents,
159        config: {
160          contractDirectories: ['app/contracts/'],
161          embarkConfig: {
162            options: {
163              solc: {
164                "optimize": true,
165                "optimize-runs": 200
166              }
167            }
168          }
169        }
170      });
171      let ipcObject = new Ipc({
172        ipcRole: 'none'
173      });
174      plugins.loadInternalPlugin('solidity', {ipc: ipcObject});
175  
176      let events = new Events();
177      let compiler = new Compiler({events: events, logger: plugins.logger}, {plugins: plugins});
178  
179      events.setCommandHandler("config:contractsConfig", function(cb) {
180        cb(contractsConfig);
181      });
182  
183      events.setCommandHandler("config:contractsFiles", (cb) => {
184        cb([
185          readFile('test/contracts/simple_storage.sol'),
186          readFile('test/contracts/token_storage.sol')
187        ]);
188      });
189  
190      events.setCommandHandler("blockchain:gasPrice", (cb) => {
191        cb(null, 100);
192      });
193  
194      let contractsConfig = {
195        "versions": {
196          "web3.js": "1.0.0-beta",
197          "solc": "0.4.17"
198        },
199        "deployment": {
200          "host": "localhost",
201          "port": 8545,
202          "type": "rpc"
203        },
204        "dappConnection": [
205          "$WEB3",
206          "localhost:8545"
207        ],
208        "gas": "auto",
209        "contracts": {
210          "TokenStorage": {
211            "args": [
212              100,
213              "$SimpleStorage"
214            ]
215          },
216          "MySimpleStorage": {
217            "instanceOf": "SimpleStorage",
218            "args": [
219              300
220            ]
221          },
222          "SimpleStorage": {
223            "args": [
224              200
225            ]
226          },
227          "AnotherSimpleStorage": {
228            "instanceOf": "SimpleStorage"
229          }
230        }
231      }
232  
233      let embarkObj = {
234        logger: new Logger({}),
235        events: events
236      }
237  
238      let contractsManager = new ContractsManager(embarkObj, {
239        contractDirectories: ['app/contracts']
240      });
241  
242      describe('#build', function() {
243        it('generate contracts', function(done) {
244          contractsManager.build(function(err, result) {
245            if (err) {
246              throw err;
247            }
248  
249            let contracts = contractsManager.listContracts();
250            assert.equal(contracts.length, 4);
251  
252            assert.equal(contracts[0].className, "MySimpleStorage");
253            assert.equal(contracts[1].className, "AnotherSimpleStorage");
254            assert.equal(contracts[2].className, "SimpleStorage");
255            assert.equal(contracts[3].className, "TokenStorage");
256  
257            // TokenStorage
258            assert.equal(contracts[3].deploy, true);
259            assert.deepEqual(contracts[3].args, [100, '$SimpleStorage']);
260            //assert.deepEqual(contracts[3].gas, 725000);
261            assert.deepEqual(contracts[3].gas, 'auto');
262            assert.equal(contracts[3].type, 'file');
263            //assert.equal(contracts[3].abiDefinition, '');
264            //assert.equal(contracts[3].code, '');
265            //assert.equal(contracts[3].runtimeBytecode, '');
266  
267            let parentContract = contracts[2];
268  
269            //MySimpleStorage
270            assert.equal(contracts[0].deploy, true);
271            assert.deepEqual(contracts[0].args, [300]);
272            //assert.deepEqual(contracts[0].gas, 725000);
273            assert.deepEqual(contracts[0].gas, 'auto');
274            assert.equal(contracts[0].type, 'instance');
275            assert.equal(contracts[0].abiDefinition, parentContract.abiDefinition);
276            assert.equal(contracts[0].code, parentContract.code);
277            assert.equal(contracts[0].runtimeBytecode, parentContract.runtimeBytecode);
278  
279            // SimpleStorage
280            assert.equal(contracts[2].deploy, true);
281            assert.deepEqual(contracts[2].args, [200]);
282            //assert.deepEqual(contracts[2].gas, 725000);
283            assert.deepEqual(contracts[2].gas, 'auto');
284            assert.equal(contracts[2].type, 'file');
285            //assert.equal(contracts[2].abiDefinition, '');
286            //assert.equal(contracts[2].code, '');
287            //assert.equal(contracts[2].runtimeBytecode, '');
288  
289            // AnotherSimpleStorage
290            assert.equal(contracts[1].deploy, true);
291            assert.deepEqual(contracts[1].args, [200]);
292            //assert.deepEqual(contracts[1].gas, 725000);
293            assert.deepEqual(contracts[1].gas, 'auto');
294            assert.equal(contracts[1].type, 'instance');
295            assert.equal(contracts[1].abiDefinition, parentContract.abiDefinition);
296            assert.equal(contracts[1].code, parentContract.code);
297            assert.equal(contracts[1].runtimeBytecode, parentContract.runtimeBytecode);
298            done();
299          });
300        });
301      });
302    });
303  
304  });