/*
* Copyright (c) [2016] [ <ether.camp> ]
* This file is part of the ethereumJ library.
*
* The ethereumJ library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The ethereumJ library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.ethereum.util;
import org.ethereum.config.SystemProperties;
import org.ethereum.crypto.ECKey;
import org.ethereum.util.blockchain.SolidityContract;
import org.ethereum.util.blockchain.StandaloneBlockchain;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Test;
import org.spongycastle.util.encoders.Hex;
import java.math.BigInteger;
import static org.ethereum.util.blockchain.EtherUtil.Unit.ETHER;
import static org.ethereum.util.blockchain.EtherUtil.convert;
/**
* Created by Anton Nashatyrev on 06.07.2016.
*/
public class StandaloneBlockchainTest {
@AfterClass
public static void cleanup() {
SystemProperties.resetToDefault();
}
@Test
public void constructorTest() {
StandaloneBlockchain sb = new StandaloneBlockchain().withAutoblock(true);
SolidityContract a = sb.submitNewContract(
"contract A {" +
" uint public a;" +
" uint public b;" +
" function A(uint a_, uint b_) {a = a_; b = b_; }" +
"}",
"A", 555, 777
);
Assert.assertEquals(BigInteger.valueOf(555), a.callConstFunction("a")[0]);
Assert.assertEquals(BigInteger.valueOf(777), a.callConstFunction("b")[0]);
SolidityContract b = sb.submitNewContract(
"contract A {" +
" string public a;" +
" uint public b;" +
" function A(string a_, uint b_) {a = a_; b = b_; }" +
"}",
"A", "This string is longer than 32 bytes...", 777
);
Assert.assertEquals("This string is longer than 32 bytes...", b.callConstFunction("a")[0]);
Assert.assertEquals(BigInteger.valueOf(777), b.callConstFunction("b")[0]);
}
@Test
public void fixedSizeArrayTest() {
StandaloneBlockchain sb = new StandaloneBlockchain().withAutoblock(true);
{
SolidityContract a = sb.submitNewContract(
"contract A {" +
" uint public a;" +
" uint public b;" +
" address public c;" +
" address public d;" +
" function f(uint[2] arr, address[2] arr2) {a = arr[0]; b = arr[1]; c = arr2[0]; d = arr2[1];}" +
"}");
ECKey addr1 = new ECKey();
ECKey addr2 = new ECKey();
a.callFunction("f", new Integer[]{111, 222}, new byte[][] {addr1.getAddress(), addr2.getAddress()});
Assert.assertEquals(BigInteger.valueOf(111), a.callConstFunction("a")[0]);
Assert.assertEquals(BigInteger.valueOf(222), a.callConstFunction("b")[0]);
Assert.assertArrayEquals(addr1.getAddress(), (byte[])a.callConstFunction("c")[0]);
Assert.assertArrayEquals(addr2.getAddress(), (byte[])a.callConstFunction("d")[0]);
}
{
ECKey addr1 = new ECKey();
ECKey addr2 = new ECKey();
SolidityContract a = sb.submitNewContract(
"contract A {" +
" uint public a;" +
" uint public b;" +
" address public c;" +
" address public d;" +
" function A(uint[2] arr, address a1, address a2) {a = arr[0]; b = arr[1]; c = a1; d = a2;}" +
"}", "A",
new Integer[]{111, 222}, addr1.getAddress(), addr2.getAddress());
Assert.assertEquals(BigInteger.valueOf(111), a.callConstFunction("a")[0]);
Assert.assertEquals(BigInteger.valueOf(222), a.callConstFunction("b")[0]);
Assert.assertArrayEquals(addr1.getAddress(), (byte[]) a.callConstFunction("c")[0]);
Assert.assertArrayEquals(addr2.getAddress(), (byte[]) a.callConstFunction("d")[0]);
String a1 = "0x1111111111111111111111111111111111111111";
String a2 = "0x2222222222222222222222222222222222222222";
}
}
@Test
public void encodeTest1() {
StandaloneBlockchain sb = new StandaloneBlockchain().withAutoblock(true);
SolidityContract a = sb.submitNewContract(
"contract A {" +
" uint public a;" +
" function f(uint a_) {a = a_;}" +
"}");
a.callFunction("f", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
BigInteger r = (BigInteger) a.callConstFunction("a")[0];
System.out.println(r.toString(16));
Assert.assertEquals(new BigInteger(Hex.decode("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")), r);
}
@Test
public void invalidTxTest() {
// check that invalid tx doesn't break implementation
StandaloneBlockchain sb = new StandaloneBlockchain();
ECKey alice = sb.getSender();
ECKey bob = new ECKey();
sb.sendEther(bob.getAddress(), BigInteger.valueOf(1000));
sb.setSender(bob);
sb.sendEther(alice.getAddress(), BigInteger.ONE);
sb.setSender(alice);
sb.sendEther(bob.getAddress(), BigInteger.valueOf(2000));
sb.createBlock();
}
@Test
public void initBalanceTest() {
// check StandaloneBlockchain.withAccountBalance method
StandaloneBlockchain sb = new StandaloneBlockchain();
ECKey alice = sb.getSender();
ECKey bob = new ECKey();
sb.withAccountBalance(bob.getAddress(), convert(123, ETHER));
BigInteger aliceInitBal = sb.getBlockchain().getRepository().getBalance(alice.getAddress());
BigInteger bobInitBal = sb.getBlockchain().getRepository().getBalance(bob.getAddress());
assert convert(123, ETHER).equals(bobInitBal);
sb.setSender(bob);
sb.sendEther(alice.getAddress(), BigInteger.ONE);
sb.createBlock();
assert convert(123, ETHER).compareTo(sb.getBlockchain().getRepository().getBalance(bob.getAddress())) > 0;
assert aliceInitBal.add(BigInteger.ONE).equals(sb.getBlockchain().getRepository().getBalance(alice.getAddress()));
}
}