41 using namespace test::jtx;
43 char const credType[] =
"abcde";
44 char const uri[] =
"uri";
47 Account const subject{
"subject"};
50 Env env{*
this, features};
57 env.fund(
XRP(5000), subject, issuer, other);
65 auto const sleCred = env.le(credKey);
66 BEAST_EXPECT(
static_cast<bool>(sleCred));
70 BEAST_EXPECT(sleCred->getAccountID(sfSubject) == subject.id());
71 BEAST_EXPECT(sleCred->getAccountID(sfIssuer) == issuer.id());
72 BEAST_EXPECT(!sleCred->getFieldU32(sfFlags));
75 BEAST_EXPECT(
checkVL(sleCred, sfCredentialType, credType));
76 BEAST_EXPECT(
checkVL(sleCred, sfURI, uri));
80 jle.isObject() && jle.isMember(jss::result) &&
81 !jle[jss::result].isMember(jss::error) &&
82 jle[jss::result].isMember(jss::node) &&
83 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
84 jle[jss::result][jss::node][
"LedgerEntryType"] ==
86 jle[jss::result][jss::node][jss::Issuer] ==
88 jle[jss::result][jss::node][jss::Subject] ==
90 jle[jss::result][jss::node][
"CredentialType"] ==
99 auto const sleCred = env.le(credKey);
100 BEAST_EXPECT(
static_cast<bool>(sleCred));
104 BEAST_EXPECT(sleCred->getAccountID(sfSubject) == subject.id());
105 BEAST_EXPECT(sleCred->getAccountID(sfIssuer) == issuer.id());
108 BEAST_EXPECT(
checkVL(sleCred, sfCredentialType, credType));
109 BEAST_EXPECT(
checkVL(sleCred, sfURI, uri));
110 BEAST_EXPECT(sleCred->getFieldU32(sfFlags) ==
lsfAccepted);
116 BEAST_EXPECT(!env.le(credKey));
124 jle.isObject() && jle.isMember(jss::result) &&
125 jle[jss::result].isMember(jss::error) &&
126 jle[jss::result][jss::error] ==
"entryNotFound");
139 auto const sleCred = env.le(credKey);
140 BEAST_EXPECT(
static_cast<bool>(sleCred));
144 BEAST_EXPECT(sleCred->getAccountID(sfSubject) == issuer.id());
145 BEAST_EXPECT(sleCred->getAccountID(sfIssuer) == issuer.id());
146 BEAST_EXPECT((sleCred->getFieldU32(sfFlags) &
lsfAccepted));
148 sleCred->getFieldU64(sfIssuerNode) ==
149 sleCred->getFieldU64(sfSubjectNode));
151 BEAST_EXPECT(
checkVL(sleCred, sfCredentialType, credType));
152 BEAST_EXPECT(
checkVL(sleCred, sfURI, uri));
156 jle.isObject() && jle.isMember(jss::result) &&
157 !jle[jss::result].isMember(jss::error) &&
158 jle[jss::result].isMember(jss::node) &&
159 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
160 jle[jss::result][jss::node][
"LedgerEntryType"] ==
162 jle[jss::result][jss::node][jss::Issuer] ==
164 jle[jss::result][jss::node][jss::Subject] ==
166 jle[jss::result][jss::node][
"CredentialType"] ==
173 BEAST_EXPECT(!env.le(credKey));
180 jle.isObject() && jle.isMember(jss::result) &&
181 jle[jss::result].isMember(jss::error) &&
182 jle[jss::result][jss::error] ==
"entryNotFound");
190 using namespace test::jtx;
192 char const credType[] =
"abcde";
194 Account const issuer{
"issuer"};
195 Account const subject{
"subject"};
198 Env env{*
this, features};
201 env.fund(
XRP(5000), issuer, subject, other);
205 testcase(
"Delete issuer before accept");
213 int const delta = env.seq(issuer) + 255;
214 for (
int i = 0; i < delta; ++i)
216 auto const acctDelFee{
drops(env.current()->fees().increment)};
223 BEAST_EXPECT(!env.le(credKey));
230 jle.isObject() && jle.isMember(jss::result) &&
231 jle[jss::result].isMember(jss::error) &&
232 jle[jss::result][jss::error] ==
"entryNotFound");
236 env.fund(
XRP(5000), issuer);
241 testcase(
"Delete issuer after accept");
251 int const delta = env.seq(issuer) + 255;
252 for (
int i = 0; i < delta; ++i)
254 auto const acctDelFee{
drops(env.current()->fees().increment)};
261 BEAST_EXPECT(!env.le(credKey));
268 jle.isObject() && jle.isMember(jss::result) &&
269 jle[jss::result].isMember(jss::error) &&
270 jle[jss::result][jss::error] ==
"entryNotFound");
274 env.fund(
XRP(5000), issuer);
279 testcase(
"Delete subject before accept");
287 int const delta = env.seq(subject) + 255;
288 for (
int i = 0; i < delta; ++i)
290 auto const acctDelFee{
drops(env.current()->fees().increment)};
297 BEAST_EXPECT(!env.le(credKey));
304 jle.isObject() && jle.isMember(jss::result) &&
305 jle[jss::result].isMember(jss::error) &&
306 jle[jss::result][jss::error] ==
"entryNotFound");
310 env.fund(
XRP(5000), subject);
315 testcase(
"Delete subject after accept");
325 int const delta = env.seq(subject) + 255;
326 for (
int i = 0; i < delta; ++i)
328 auto const acctDelFee{
drops(env.current()->fees().increment)};
335 BEAST_EXPECT(!env.le(credKey));
342 jle.isObject() && jle.isMember(jss::result) &&
343 jle[jss::result].isMember(jss::error) &&
344 jle[jss::result][jss::error] ==
"entryNotFound");
348 env.fund(
XRP(5000), subject);
357 uint32_t
const t = env.current()
359 .parentCloseTime.time_since_epoch()
361 jv[sfExpiration.jsonName] = t + 20;
375 BEAST_EXPECT(!env.le(credKey));
383 jle.isObject() && jle.isMember(jss::result) &&
384 jle[jss::result].isMember(jss::error) &&
385 jle[jss::result][jss::error] ==
"entryNotFound");
401 BEAST_EXPECT(!env.le(credKey));
407 jle.isObject() && jle.isMember(jss::result) &&
408 jle[jss::result].isMember(jss::error) &&
409 jle[jss::result][jss::error] ==
"entryNotFound");
423 BEAST_EXPECT(!env.le(credKey));
429 jle.isObject() && jle.isMember(jss::result) &&
430 jle[jss::result].isMember(jss::error) &&
431 jle[jss::result][jss::error] ==
"entryNotFound");
439 using namespace test::jtx;
441 char const credType[] =
"abcde";
443 Account const issuer{
"issuer"};
444 Account const subject{
"subject"};
448 Env env{*
this, features};
450 env.fund(
XRP(5000), subject, issuer);
454 testcase(
"Credentials fail, no subject param.");
456 jv.removeMember(jss::Subject);
467 testcase(
"Credentials fail, no credentialType param.");
469 jv.removeMember(sfCredentialType.jsonName);
474 testcase(
"Credentials fail, empty credentialType param.");
481 "Credentials fail, credentialType length > "
482 "maxCredentialTypeLength.");
484 "abcdefghijklmnopqrstuvwxyz01234567890qwertyuiop[]"
485 "asdfghjkl;'zxcvbnm8237tr28weufwldebvfv8734t07p";
492 testcase(
"Credentials fail, URI length > 256.");
494 "abcdefghijklmnopqrstuvwxyz01234567890qwertyuiop[]"
495 "asdfghjkl;'zxcvbnm8237tr28weufwldebvfv8734t07p "
496 "9hfup;wDJFBVSD8f72 "
498 "djvbldafghwpEFHdjfaidfgio84763tfysgdvhjasbd "
499 "vujhgWQIE7F6WEUYFGWUKEYFVQW87FGWOEFWEFUYWVEF8723GFWEFB"
501 "fv28o37gfwEFB3872TFO8GSDSDVD";
509 testcase(
"Credentials fail, URI empty.");
516 testcase(
"Credentials fail, expiration in the past.");
519 uint32_t
const t = env.current()
521 .parentCloseTime.time_since_epoch()
524 jv[sfExpiration.jsonName] = t;
529 testcase(
"Credentials fail, invalid fee.");
537 testcase(
"Credentials fail, duplicate.");
548 jle.isObject() && jle.isMember(jss::result) &&
549 !jle[jss::result].isMember(jss::error) &&
550 jle[jss::result].isMember(jss::node) &&
551 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
552 jle[jss::result][jss::node][
"LedgerEntryType"] ==
554 jle[jss::result][jss::node][jss::Issuer] ==
556 jle[jss::result][jss::node][jss::Subject] ==
558 jle[jss::result][jss::node][
"CredentialType"] ==
563 testcase(
"Credentials fail, directory full");
598 Env env{*
this, features};
600 env.fund(
XRP(5000), issuer);
604 testcase(
"Credentials fail, subject doesn't exist.");
612 Env env{*
this, features};
614 auto const reserve =
drops(env.current()->fees().reserve);
615 env.fund(
reserve, subject, issuer);
618 testcase(
"Credentials fail, not enough reserve.");
632 char const credType[] =
"abcde";
633 Account const issuer{
"issuer"};
634 Account const subject{
"subject"};
638 Env env{*
this, features};
640 env.fund(
XRP(5000), subject, issuer);
643 testcase(
"CredentialsAccept fail, Credential doesn't exist.");
650 testcase(
"CredentialsAccept fail, invalid Issuer account.");
659 "CredentialsAccept fail, invalid credentialType param.");
666 Env env{*
this, features};
668 env.fund(
drops(env.current()->fees().accountReserve(1)), issuer);
669 env.fund(
drops(env.current()->fees().accountReserve(0)), subject);
673 testcase(
"CredentialsAccept fail, not enough reserve.");
685 jle.isObject() && jle.isMember(jss::result) &&
686 !jle[jss::result].isMember(jss::error) &&
687 jle[jss::result].isMember(jss::node) &&
688 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
689 jle[jss::result][jss::node][
"LedgerEntryType"] ==
691 jle[jss::result][jss::node][jss::Issuer] ==
693 jle[jss::result][jss::node][jss::Subject] ==
695 jle[jss::result][jss::node][
"CredentialType"] ==
702 Env env{*
this, features};
704 env.fund(
XRP(5000), subject, issuer);
711 testcase(
"CredentialsAccept fail, invalid fee.");
716 testcase(
"CredentialsAccept fail, lsfAccepted already set.");
727 jle.isObject() && jle.isMember(jss::result) &&
728 !jle[jss::result].isMember(jss::error) &&
729 jle[jss::result].isMember(jss::node) &&
730 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
731 jle[jss::result][jss::node][
"LedgerEntryType"] ==
733 jle[jss::result][jss::node][jss::Issuer] ==
735 jle[jss::result][jss::node][jss::Subject] ==
737 jle[jss::result][jss::node][
"CredentialType"] ==
742 char const credType2[] =
"efghi";
744 testcase(
"CredentialsAccept fail, expired credentials.");
746 uint32_t
const t = env.current()
748 .parentCloseTime.time_since_epoch()
750 jv[sfExpiration.jsonName] = t;
760 auto const jDelCred =
763 jDelCred.isObject() && jDelCred.isMember(jss::result) &&
764 jDelCred[jss::result].isMember(jss::error) &&
765 jDelCred[jss::result][jss::error] ==
"entryNotFound");
774 Env env{*
this, features};
776 env.fund(
XRP(5000), issuer, subject, other);
780 testcase(
"CredentialsAccept fail, issuer doesn't exist.");
786 int const delta = env.seq(issuer) + 255;
787 for (
int i = 0; i < delta; ++i)
789 auto const acctDelFee{
drops(env.current()->fees().increment)};
798 auto const jDelCred =
801 jDelCred.isObject() && jDelCred.isMember(jss::result) &&
802 jDelCred[jss::result].isMember(jss::error) &&
803 jDelCred[jss::result][jss::error] ==
"entryNotFound");
811 using namespace test::jtx;
813 char const credType[] =
"abcde";
814 Account const issuer{
"issuer"};
815 Account const subject{
"subject"};
820 Env env{*
this, features};
822 env.fund(
XRP(5000), subject, issuer, other);
826 testcase(
"CredentialsDelete fail, no Credentials.");
833 testcase(
"CredentialsDelete fail, invalid Subject account.");
842 testcase(
"CredentialsDelete fail, invalid Issuer account.");
852 "CredentialsDelete fail, invalid credentialType param.");
858 char const credType2[] =
"fghij";
872 jle.isObject() && jle.isMember(jss::result) &&
873 !jle[jss::result].isMember(jss::error) &&
874 jle[jss::result].isMember(jss::node) &&
875 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
876 jle[jss::result][jss::node][
"LedgerEntryType"] ==
878 jle[jss::result][jss::node][jss::Issuer] ==
880 jle[jss::result][jss::node][jss::Subject] ==
882 jle[jss::result][jss::node][
"CredentialType"] ==
887 testcase(
"CredentialsDelete fail, time not expired yet.");
891 uint32_t
const t = env.current()
893 .parentCloseTime.time_since_epoch()
896 jv[sfExpiration.jsonName] = t;
909 jle.isObject() && jle.isMember(jss::result) &&
910 !jle[jss::result].isMember(jss::error) &&
911 jle[jss::result].isMember(jss::node) &&
912 jle[jss::result][jss::node].isMember(
"LedgerEntryType") &&
913 jle[jss::result][jss::node][
"LedgerEntryType"] ==
915 jle[jss::result][jss::node][jss::Issuer] ==
917 jle[jss::result][jss::node][jss::Subject] ==
919 jle[jss::result][jss::node][
"CredentialType"] ==
924 testcase(
"CredentialsDelete fail, no Issuer and Subject.");
928 jv.removeMember(jss::Subject);
929 jv.removeMember(jss::Issuer);
935 testcase(
"CredentialsDelete fail, invalid fee.");
945 testcase(
"deleteSLE fail, bad SLE.");
986 using namespace test::jtx;
988 char const credType[] =
"abcde";
989 Account const issuer{
"issuer"};
990 Account const subject{
"subject"};
996 env.
fund(
XRP(5000), subject, issuer);
1010 params[jss::account] = subject.human();
1011 auto const jv = env.rpc(
1012 "json",
"account_tx",
to_string(params))[jss::result];
1014 BEAST_EXPECT(jv[jss::transactions].size() == 4);
1015 auto const& tx0(jv[jss::transactions][0u][jss::tx]);
1017 tx0[jss::TransactionType] == jss::CredentialAccept);
1018 auto const& tx1(jv[jss::transactions][1u][jss::tx]);
1020 tx1[jss::TransactionType] == jss::CredentialCreate);
1021 txHash0 = tx0[jss::hash].asString();
1022 txHash1 = tx1[jss::hash].asString();
1027 params[jss::account] = issuer.human();
1028 auto const jv = env.rpc(
1029 "json",
"account_tx",
to_string(params))[jss::result];
1031 BEAST_EXPECT(jv[jss::transactions].size() == 4);
1032 auto const& tx0(jv[jss::transactions][0u][jss::tx]);
1034 tx0[jss::TransactionType] == jss::CredentialAccept);
1035 auto const& tx1(jv[jss::transactions][1u][jss::tx]);
1037 tx1[jss::TransactionType] == jss::CredentialCreate);
1039 BEAST_EXPECT(txHash0 == tx0[jss::hash].asString());
1040 BEAST_EXPECT(txHash1 == tx1[jss::hash].asString());
1047 params[jss::account] = subject.human();
1049 "json",
"account_objects",
to_string(params))[jss::result];
1051 BEAST_EXPECT(jv[jss::account_objects].size() == 1);
1052 auto const& object(jv[jss::account_objects][0u]);
1055 object[
"LedgerEntryType"].asString() == jss::Credential);
1056 objectIdx =
object[jss::index].asString();
1061 params[jss::account] = issuer.human();
1063 "json",
"account_objects",
to_string(params))[jss::result];
1065 BEAST_EXPECT(jv[jss::account_objects].size() == 1);
1066 auto const& object(jv[jss::account_objects][0u]);
1069 object[
"LedgerEntryType"].asString() == jss::Credential);
1070 BEAST_EXPECT(objectIdx ==
object[jss::index].asString());