Skip to content

Commit 15ad01f

Browse files
committed
test(framework): cover shielded api error branches
1 parent de25341 commit 15ad01f

4 files changed

Lines changed: 265 additions & 8 deletions

File tree

common/src/test/java/org/tron/core/config/args/NodeConfigTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ public void testLegacyAliasTakesPriorityOverModernKey() {
284284
}
285285

286286
@Test
287-
public void testShieldedApiDefaultsToTrueWhenNeitherKeySet() {
287+
public void testShieldedApiDefaultsToFalseWhenNeitherKeySet() {
288288
NodeConfig nc = NodeConfig.fromConfig(withRef());
289289
assertFalse(nc.isAllowShieldedTransactionApi());
290290
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.tron.core.exception;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
public class ZksnarkExceptionTest {
7+
8+
@Test
9+
public void testNoArgConstructor() {
10+
ZksnarkException e = new ZksnarkException();
11+
Assert.assertNull(e.getMessage());
12+
Assert.assertNull(e.getCause());
13+
}
14+
15+
@Test
16+
public void testMessageConstructor() {
17+
ZksnarkException e = new ZksnarkException("boom");
18+
Assert.assertEquals("boom", e.getMessage());
19+
Assert.assertNull(e.getCause());
20+
}
21+
22+
@Test
23+
public void testMessageAndCauseConstructor() {
24+
Throwable cause = new ArithmeticException("overflow");
25+
ZksnarkException e = new ZksnarkException("wrapped", cause);
26+
Assert.assertEquals("wrapped", e.getMessage());
27+
Assert.assertSame(cause, e.getCause());
28+
}
29+
}

framework/src/main/java/org/tron/core/Wallet.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,9 @@
263263
@Component
264264
public class Wallet {
265265

266-
private static final String SHIELDED_ID_NOT_ALLOWED = "ShieldedTransactionApi is not allowed";
266+
private static final String SHIELDED_ID_NOT_ALLOWED =
267+
"Shielded transaction API is disabled; "
268+
+ "set node.allowShieldedTransactionApi=true to enable.";
267269
private static final String PAYMENT_ADDRESS_FORMAT_WRONG = "paymentAddress format is wrong";
268270
private static final String SHIELDED_TRANSACTION_SCAN_RANGE =
269271
"request requires start_block_index >= 0 && end_block_index > "
@@ -2369,8 +2371,8 @@ public TransactionCapsule createShieldedTransaction(PrivateParameters request)
23692371
} catch (ArithmeticException e) {
23702372
throw new ZksnarkException("shielded amount overflow", e);
23712373
} catch (ZksnarkException e) {
2372-
logger.error("createShieldedTransaction except, error is " + e.toString());
2373-
throw new ZksnarkException(e.toString());
2374+
logger.error("createShieldedTransaction except, error is {}", e.toString());
2375+
throw e;
23742376
}
23752377
}
23762378

@@ -2473,8 +2475,8 @@ public TransactionCapsule createShieldedTransactionWithoutSpendAuthSig(
24732475
} catch (ArithmeticException e) {
24742476
throw new ZksnarkException("shielded amount overflow", e);
24752477
} catch (ZksnarkException e) {
2476-
logger.error("createShieldedTransaction exception, error is " + e.toString());
2477-
throw new ZksnarkException(e.toString());
2478+
logger.error("createShieldedTransaction exception, error is {}", e.toString());
2479+
throw e;
24782480
}
24792481
}
24802482

@@ -3658,7 +3660,7 @@ public ShieldedTRC20Parameters createShieldedContractParameters(
36583660
scaledToAmount, shieldedReceives.get(0).getNote().getValue(),
36593661
dbManager.getDynamicPropertiesStore().disableJavaLangMath()));
36603662
} catch (ArithmeticException e) {
3661-
throw new ZksnarkException("Unbalanced burn!");
3663+
throw new ZksnarkException("Unbalanced burn!", e);
36623664
}
36633665
}
36643666

@@ -3794,7 +3796,7 @@ public ShieldedTRC20Parameters createShieldedContractParametersWithoutAsk(
37943796
scaledToAmount, shieldedReceives.get(0).getNote().getValue(),
37953797
chainBaseManager.getDynamicPropertiesStore().disableJavaLangMath());
37963798
} catch (ArithmeticException e) {
3797-
throw new ZksnarkException("Unbalanced burn!");
3799+
throw new ZksnarkException("Unbalanced burn!", e);
37983800
}
37993801
}
38003802

framework/src/test/java/org/tron/core/ShieldWalletTest.java

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,18 @@
44
import static org.mockito.Mockito.spy;
55
import static org.tron.core.zen.ZksnarkInitService.librustzcashInitZksnarkParams;
66

7+
import com.google.protobuf.ByteString;
78
import java.math.BigInteger;
89
import javax.annotation.Resource;
910
import org.junit.Assert;
1011
import org.junit.BeforeClass;
1112
import org.junit.Test;
13+
import org.tron.api.GrpcAPI;
1214
import org.tron.api.GrpcAPI.PrivateParameters;
1315
import org.tron.api.GrpcAPI.PrivateParametersWithoutAsk;
1416
import org.tron.api.GrpcAPI.PrivateShieldedTRC20Parameters;
1517
import org.tron.api.GrpcAPI.PrivateShieldedTRC20ParametersWithoutAsk;
18+
import org.tron.api.GrpcAPI.ReceiveNote;
1619
import org.tron.api.GrpcAPI.ShieldedAddressInfo;
1720
import org.tron.api.GrpcAPI.ShieldedTRC20Parameters;
1821
import org.tron.common.BaseTest;
@@ -22,6 +25,7 @@
2225
import org.tron.core.config.args.Args;
2326
import org.tron.core.exception.ContractExeException;
2427
import org.tron.core.exception.ContractValidateException;
28+
import org.tron.core.exception.ZksnarkException;
2529
import org.tron.core.services.http.JsonFormat;
2630
import org.tron.core.services.http.JsonFormat.ParseException;
2731

@@ -450,4 +454,226 @@ public void testCreateShieldedContractParametersWithoutAsk() throws ContractExeE
450454
Assert.fail();
451455
}
452456
}
457+
458+
private static final byte[] SHIELDED_CONTRACT_ADDRESS =
459+
ByteArray.fromHexString("4144007979359ECAC395BBD3CEF8060D3DF2DC3F01");
460+
private static final String VALID_PAYMENT_ADDR =
461+
"ztron1y99u6ejqenupvfkp5g6q6yqkp0a44c48cta0dd5gejtqa4v27hqa2cghfvdxnmneh6qqq03fa75";
462+
463+
private Wallet newSpyWallet() throws ContractExeException {
464+
Args.getInstance().setAllowShieldedTransactionApi(true);
465+
Wallet wallet1 = spy(new Wallet());
466+
doReturn(BigInteger.valueOf(1).toByteArray())
467+
.when(wallet1).getShieldedContractScalingFactor(SHIELDED_CONTRACT_ADDRESS);
468+
return wallet1;
469+
}
470+
471+
private GrpcAPI.SpendNoteTRC20 spendNoteOfValue(long value) {
472+
GrpcAPI.Note note = GrpcAPI.Note.newBuilder()
473+
.setValue(value)
474+
.setPaymentAddress(VALID_PAYMENT_ADDR)
475+
.setRcm(ByteString.copyFrom(new byte[32]))
476+
.setMemo(ByteString.copyFrom(new byte[512]))
477+
.build();
478+
return GrpcAPI.SpendNoteTRC20.newBuilder()
479+
.setNote(note)
480+
.setAlpha(ByteString.copyFrom(new byte[32]))
481+
.setRoot(ByteString.copyFrom(new byte[32]))
482+
.setPath(ByteString.copyFrom(new byte[1024]))
483+
.setPos(0)
484+
.build();
485+
}
486+
487+
private ReceiveNote receiveNoteOfValue(long value) {
488+
GrpcAPI.Note note = GrpcAPI.Note.newBuilder()
489+
.setValue(value)
490+
.setPaymentAddress(VALID_PAYMENT_ADDR)
491+
.setRcm(ByteString.copyFrom(new byte[32]))
492+
.setMemo(ByteString.copyFrom(new byte[512]))
493+
.build();
494+
return ReceiveNote.newBuilder().setNote(note).build();
495+
}
496+
497+
@Test
498+
public void testCreateShieldedContractParameters_invalidParams()
499+
throws ContractExeException {
500+
Wallet wallet1 = newSpyWallet();
501+
PrivateShieldedTRC20Parameters request = PrivateShieldedTRC20Parameters.newBuilder()
502+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
503+
.build();
504+
Exception e = Assert.assertThrows(Exception.class,
505+
() -> wallet1.createShieldedContractParameters(request));
506+
Assert.assertTrue(e instanceof ContractValidateException);
507+
Assert.assertEquals("invalid shielded TRC-20 parameters", e.getMessage());
508+
}
509+
510+
@Test
511+
public void testCreateShieldedContractParameters_TRANSFER_missingKeys()
512+
throws ContractExeException {
513+
Wallet wallet1 = newSpyWallet();
514+
PrivateShieldedTRC20Parameters request = PrivateShieldedTRC20Parameters.newBuilder()
515+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
516+
.addShieldedSpends(spendNoteOfValue(100))
517+
.addShieldedReceives(receiveNoteOfValue(100))
518+
.build();
519+
Exception e = Assert.assertThrows(Exception.class,
520+
() -> wallet1.createShieldedContractParameters(request));
521+
Assert.assertTrue(e instanceof ContractValidateException);
522+
Assert.assertEquals("No shielded TRC-20 ask, nsk or ovk", e.getMessage());
523+
}
524+
525+
@Test
526+
public void testCreateShieldedContractParameters_BURN_missingKeys()
527+
throws ContractExeException {
528+
Wallet wallet1 = newSpyWallet();
529+
PrivateShieldedTRC20Parameters request = PrivateShieldedTRC20Parameters.newBuilder()
530+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
531+
.addShieldedSpends(spendNoteOfValue(100))
532+
.setToAmount("100")
533+
.build();
534+
Exception e = Assert.assertThrows(Exception.class,
535+
() -> wallet1.createShieldedContractParameters(request));
536+
Assert.assertTrue(e instanceof ContractValidateException);
537+
Assert.assertEquals("No shielded TRC-20 ask, nsk or ovk", e.getMessage());
538+
}
539+
540+
@Test
541+
public void testCreateShieldedContractParameters_BURN_missingTransparentTo()
542+
throws ContractExeException {
543+
Wallet wallet1 = newSpyWallet();
544+
PrivateShieldedTRC20Parameters request = PrivateShieldedTRC20Parameters.newBuilder()
545+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
546+
.addShieldedSpends(spendNoteOfValue(100))
547+
.setToAmount("100")
548+
.setAsk(ByteString.copyFrom(new byte[32]))
549+
.setNsk(ByteString.copyFrom(new byte[32]))
550+
.setOvk(ByteString.copyFrom(new byte[32]))
551+
.build();
552+
Exception e = Assert.assertThrows(Exception.class,
553+
() -> wallet1.createShieldedContractParameters(request));
554+
Assert.assertTrue(e instanceof ContractValidateException);
555+
Assert.assertEquals("No valid transparent TRC-20 output address", e.getMessage());
556+
}
557+
558+
@Test
559+
public void testCreateShieldedContractParameters_TRANSFER_arithmeticOverflow()
560+
throws ContractExeException {
561+
Wallet wallet1 = newSpyWallet();
562+
PrivateShieldedTRC20Parameters request = PrivateShieldedTRC20Parameters.newBuilder()
563+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
564+
.addShieldedSpends(spendNoteOfValue(Long.MAX_VALUE))
565+
.addShieldedSpends(spendNoteOfValue(Long.MAX_VALUE))
566+
.addShieldedReceives(receiveNoteOfValue(0))
567+
.setAsk(ByteString.copyFrom(new byte[32]))
568+
.setNsk(ByteString.copyFrom(new byte[32]))
569+
.setOvk(ByteString.copyFrom(new byte[32]))
570+
.build();
571+
Exception e = Assert.assertThrows(Exception.class,
572+
() -> wallet1.createShieldedContractParameters(request));
573+
Assert.assertTrue(e instanceof ZksnarkException);
574+
Assert.assertEquals("shielded amount overflow", e.getMessage());
575+
}
576+
577+
@Test
578+
public void testCreateShieldedContractParametersWithoutAsk_invalidParams()
579+
throws ContractExeException {
580+
Wallet wallet1 = newSpyWallet();
581+
PrivateShieldedTRC20ParametersWithoutAsk request =
582+
PrivateShieldedTRC20ParametersWithoutAsk.newBuilder()
583+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
584+
.build();
585+
Exception e = Assert.assertThrows(Exception.class,
586+
() -> wallet1.createShieldedContractParametersWithoutAsk(request));
587+
Assert.assertTrue(e instanceof ContractValidateException);
588+
Assert.assertEquals("invalid shielded TRC-20 parameters", e.getMessage());
589+
}
590+
591+
@Test
592+
public void testCreateShieldedContractParametersWithoutAsk_TRANSFER_missingKeys()
593+
throws ContractExeException {
594+
Wallet wallet1 = newSpyWallet();
595+
PrivateShieldedTRC20ParametersWithoutAsk request =
596+
PrivateShieldedTRC20ParametersWithoutAsk.newBuilder()
597+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
598+
.addShieldedSpends(spendNoteOfValue(100))
599+
.addShieldedReceives(receiveNoteOfValue(100))
600+
.build();
601+
Exception e = Assert.assertThrows(Exception.class,
602+
() -> wallet1.createShieldedContractParametersWithoutAsk(request));
603+
Assert.assertTrue(e instanceof ContractValidateException);
604+
Assert.assertEquals("No shielded TRC-20 ak, nsk or ovk", e.getMessage());
605+
}
606+
607+
@Test
608+
public void testCreateShieldedContractParametersWithoutAsk_BURN_missingKeys()
609+
throws ContractExeException {
610+
Wallet wallet1 = newSpyWallet();
611+
PrivateShieldedTRC20ParametersWithoutAsk request =
612+
PrivateShieldedTRC20ParametersWithoutAsk.newBuilder()
613+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
614+
.addShieldedSpends(spendNoteOfValue(100))
615+
.setToAmount("100")
616+
.build();
617+
Exception e = Assert.assertThrows(Exception.class,
618+
() -> wallet1.createShieldedContractParametersWithoutAsk(request));
619+
Assert.assertTrue(e instanceof ContractValidateException);
620+
Assert.assertEquals("No shielded TRC-20 ak, nsk or ovk", e.getMessage());
621+
}
622+
623+
@Test
624+
public void testCreateShieldedContractParametersWithoutAsk_BURN_missingTransparentTo()
625+
throws ContractExeException {
626+
Wallet wallet1 = newSpyWallet();
627+
PrivateShieldedTRC20ParametersWithoutAsk request =
628+
PrivateShieldedTRC20ParametersWithoutAsk.newBuilder()
629+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
630+
.addShieldedSpends(spendNoteOfValue(100))
631+
.setToAmount("100")
632+
.setAk(ByteString.copyFrom(new byte[32]))
633+
.setNsk(ByteString.copyFrom(new byte[32]))
634+
.setOvk(ByteString.copyFrom(new byte[32]))
635+
.build();
636+
Exception e = Assert.assertThrows(Exception.class,
637+
() -> wallet1.createShieldedContractParametersWithoutAsk(request));
638+
Assert.assertTrue(e instanceof ContractValidateException);
639+
Assert.assertEquals("No transparent TRC-20 output address", e.getMessage());
640+
}
641+
642+
@Test
643+
public void testCreateShieldedContractParametersWithoutAsk_MINT_emptyOvk()
644+
throws ContractExeException {
645+
Wallet wallet1 = newSpyWallet();
646+
PrivateShieldedTRC20ParametersWithoutAsk request =
647+
PrivateShieldedTRC20ParametersWithoutAsk.newBuilder()
648+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
649+
.setFromAmount("100")
650+
.addShieldedReceives(receiveNoteOfValue(100))
651+
.build();
652+
try {
653+
ShieldedTRC20Parameters params = wallet1.createShieldedContractParametersWithoutAsk(request);
654+
Assert.assertNotNull(params);
655+
} catch (Exception e) {
656+
Assert.fail("MINT with empty ovk should auto-generate one: " + e);
657+
}
658+
}
659+
660+
@Test
661+
public void testCreateShieldedContractParametersWithoutAsk_TRANSFER_arithmeticOverflow()
662+
throws ContractExeException {
663+
Wallet wallet1 = newSpyWallet();
664+
PrivateShieldedTRC20ParametersWithoutAsk request =
665+
PrivateShieldedTRC20ParametersWithoutAsk.newBuilder()
666+
.setShieldedTRC20ContractAddress(ByteString.copyFrom(SHIELDED_CONTRACT_ADDRESS))
667+
.addShieldedSpends(spendNoteOfValue(Long.MAX_VALUE))
668+
.addShieldedSpends(spendNoteOfValue(Long.MAX_VALUE))
669+
.addShieldedReceives(receiveNoteOfValue(0))
670+
.setAk(ByteString.copyFrom(new byte[32]))
671+
.setNsk(ByteString.copyFrom(new byte[32]))
672+
.setOvk(ByteString.copyFrom(new byte[32]))
673+
.build();
674+
Exception e = Assert.assertThrows(Exception.class,
675+
() -> wallet1.createShieldedContractParametersWithoutAsk(request));
676+
Assert.assertTrue(e instanceof ZksnarkException);
677+
Assert.assertEquals("shielded amount overflow", e.getMessage());
678+
}
453679
}

0 commit comments

Comments
 (0)