tigerbeetle-node 0.11.8 → 0.11.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.client.node.sha256 +1 -1
- package/package.json +4 -3
- package/scripts/build_lib.sh +41 -0
- package/src/node.zig +1 -1
- package/src/tigerbeetle/scripts/validate_docs.sh +7 -1
- package/src/tigerbeetle/src/benchmark.zig +3 -3
- package/src/tigerbeetle/src/config.zig +31 -16
- package/src/tigerbeetle/src/constants.zig +48 -9
- package/src/tigerbeetle/src/ewah.zig +5 -5
- package/src/tigerbeetle/src/ewah_fuzz.zig +1 -1
- package/src/tigerbeetle/src/lsm/binary_search.zig +1 -1
- package/src/tigerbeetle/src/lsm/bloom_filter.zig +1 -1
- package/src/tigerbeetle/src/lsm/compaction.zig +34 -21
- package/src/tigerbeetle/src/lsm/forest_fuzz.zig +84 -104
- package/src/tigerbeetle/src/lsm/grid.zig +19 -13
- package/src/tigerbeetle/src/lsm/manifest_log.zig +8 -10
- package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +18 -13
- package/src/tigerbeetle/src/lsm/merge_iterator.zig +1 -1
- package/src/tigerbeetle/src/lsm/segmented_array.zig +17 -17
- package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +1 -1
- package/src/tigerbeetle/src/lsm/set_associative_cache.zig +1 -1
- package/src/tigerbeetle/src/lsm/table.zig +8 -20
- package/src/tigerbeetle/src/lsm/table_immutable.zig +1 -1
- package/src/tigerbeetle/src/lsm/table_iterator.zig +3 -3
- package/src/tigerbeetle/src/lsm/table_mutable.zig +14 -2
- package/src/tigerbeetle/src/lsm/test.zig +5 -4
- package/src/tigerbeetle/src/lsm/tree.zig +1 -2
- package/src/tigerbeetle/src/lsm/tree_fuzz.zig +85 -115
- package/src/tigerbeetle/src/message_bus.zig +4 -4
- package/src/tigerbeetle/src/message_pool.zig +7 -10
- package/src/tigerbeetle/src/ring_buffer.zig +22 -12
- package/src/tigerbeetle/src/simulator.zig +366 -239
- package/src/tigerbeetle/src/state_machine/auditor.zig +5 -5
- package/src/tigerbeetle/src/state_machine/workload.zig +3 -3
- package/src/tigerbeetle/src/state_machine.zig +190 -178
- package/src/tigerbeetle/src/{util.zig → stdx.zig} +2 -0
- package/src/tigerbeetle/src/storage.zig +13 -6
- package/src/tigerbeetle/src/{test → testing/cluster}/message_bus.zig +3 -3
- package/src/tigerbeetle/src/{test → testing/cluster}/network.zig +46 -22
- package/src/tigerbeetle/src/testing/cluster/state_checker.zig +169 -0
- package/src/tigerbeetle/src/testing/cluster/storage_checker.zig +202 -0
- package/src/tigerbeetle/src/testing/cluster.zig +443 -0
- package/src/tigerbeetle/src/{test → testing}/fuzz.zig +0 -0
- package/src/tigerbeetle/src/testing/hash_log.zig +66 -0
- package/src/tigerbeetle/src/{test → testing}/id.zig +0 -0
- package/src/tigerbeetle/src/testing/packet_simulator.zig +365 -0
- package/src/tigerbeetle/src/{test → testing}/priority_queue.zig +1 -1
- package/src/tigerbeetle/src/testing/reply_sequence.zig +139 -0
- package/src/tigerbeetle/src/{test → testing}/state_machine.zig +3 -1
- package/src/tigerbeetle/src/testing/storage.zig +757 -0
- package/src/tigerbeetle/src/{test → testing}/table.zig +21 -0
- package/src/tigerbeetle/src/{test → testing}/time.zig +0 -0
- package/src/tigerbeetle/src/tigerbeetle.zig +2 -0
- package/src/tigerbeetle/src/tracer.zig +3 -3
- package/src/tigerbeetle/src/unit_tests.zig +4 -4
- package/src/tigerbeetle/src/vopr.zig +2 -2
- package/src/tigerbeetle/src/vsr/client.zig +5 -2
- package/src/tigerbeetle/src/vsr/clock.zig +93 -53
- package/src/tigerbeetle/src/vsr/journal.zig +109 -98
- package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +2 -2
- package/src/tigerbeetle/src/vsr/replica.zig +1983 -1430
- package/src/tigerbeetle/src/vsr/replica_format.zig +13 -13
- package/src/tigerbeetle/src/vsr/superblock.zig +240 -142
- package/src/tigerbeetle/src/vsr/superblock_client_table.zig +7 -7
- package/src/tigerbeetle/src/vsr/superblock_free_set.zig +1 -1
- package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +1 -1
- package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +49 -14
- package/src/tigerbeetle/src/vsr/superblock_manifest.zig +38 -19
- package/src/tigerbeetle/src/vsr/superblock_quorums.zig +48 -48
- package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +51 -51
- package/src/tigerbeetle/src/vsr.zig +99 -33
- package/src/tigerbeetle/src/demo.zig +0 -132
- package/src/tigerbeetle/src/demo_01_create_accounts.zig +0 -35
- package/src/tigerbeetle/src/demo_02_lookup_accounts.zig +0 -7
- package/src/tigerbeetle/src/demo_03_create_transfers.zig +0 -37
- package/src/tigerbeetle/src/demo_04_create_pending_transfers.zig +0 -61
- package/src/tigerbeetle/src/demo_05_post_pending_transfers.zig +0 -37
- package/src/tigerbeetle/src/demo_06_void_pending_transfers.zig +0 -24
- package/src/tigerbeetle/src/demo_07_lookup_transfers.zig +0 -7
- package/src/tigerbeetle/src/test/cluster.zig +0 -352
- package/src/tigerbeetle/src/test/conductor.zig +0 -366
- package/src/tigerbeetle/src/test/packet_simulator.zig +0 -398
- package/src/tigerbeetle/src/test/state_checker.zig +0 -169
- package/src/tigerbeetle/src/test/storage.zig +0 -864
- package/src/tigerbeetle/src/test/storage_checker.zig +0 -204
|
@@ -71,6 +71,8 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
71
71
|
};
|
|
72
72
|
|
|
73
73
|
pub const constants = struct {
|
|
74
|
+
pub const message_body_size_max = constants_.message_body_size_max;
|
|
75
|
+
|
|
74
76
|
/// The maximum number of objects within a batch, by operation.
|
|
75
77
|
pub const batch_max = struct {
|
|
76
78
|
pub const create_accounts = operation_batch_max(.create_accounts);
|
|
@@ -86,7 +88,7 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
fn operation_batch_max(comptime operation: Operation) usize {
|
|
89
|
-
return @divFloor(
|
|
91
|
+
return @divFloor(message_body_size_max, std.math.max(
|
|
90
92
|
@sizeOf(Event(operation)),
|
|
91
93
|
@sizeOf(Result(operation)),
|
|
92
94
|
));
|
|
@@ -185,32 +187,14 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
185
187
|
.reserved => unreachable,
|
|
186
188
|
.root => unreachable,
|
|
187
189
|
.register => {},
|
|
188
|
-
.create_accounts => self.
|
|
189
|
-
.create_transfers => self.
|
|
190
|
+
.create_accounts => self.prepare_timestamp += mem.bytesAsSlice(Account, input).len,
|
|
191
|
+
.create_transfers => self.prepare_timestamp += mem.bytesAsSlice(Transfer, input).len,
|
|
190
192
|
.lookup_accounts => {},
|
|
191
193
|
.lookup_transfers => {},
|
|
192
194
|
}
|
|
193
195
|
return self.prepare_timestamp;
|
|
194
196
|
}
|
|
195
197
|
|
|
196
|
-
fn prepare_timestamps(
|
|
197
|
-
self: *StateMachine,
|
|
198
|
-
comptime operation: Operation,
|
|
199
|
-
input: []u8,
|
|
200
|
-
) void {
|
|
201
|
-
var sum_reserved_timestamps: usize = 0;
|
|
202
|
-
var events = mem.bytesAsSlice(Event(operation), input);
|
|
203
|
-
for (events) |*event| {
|
|
204
|
-
sum_reserved_timestamps += event.timestamp;
|
|
205
|
-
self.prepare_timestamp += 1;
|
|
206
|
-
event.timestamp = self.prepare_timestamp;
|
|
207
|
-
}
|
|
208
|
-
// The client is responsible for ensuring that timestamps are reserved:
|
|
209
|
-
// Use a single branch condition to detect non-zero reserved timestamps.
|
|
210
|
-
// Summing then branching once is faster than branching every iteration of the loop.
|
|
211
|
-
assert(sum_reserved_timestamps == 0);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
198
|
pub fn prefetch(
|
|
215
199
|
self: *StateMachine,
|
|
216
200
|
callback: fn (*StateMachine) void,
|
|
@@ -222,6 +206,8 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
222
206
|
assert(self.prefetch_input == null);
|
|
223
207
|
assert(self.prefetch_callback == null);
|
|
224
208
|
|
|
209
|
+
// NOTE: prefetch(.register)'s callback should end up calling commit()
|
|
210
|
+
// (which is always async) instead of recursing, so this inline callback is fine.
|
|
225
211
|
if (operation == .register) {
|
|
226
212
|
callback(self);
|
|
227
213
|
return;
|
|
@@ -384,12 +370,14 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
384
370
|
self: *StateMachine,
|
|
385
371
|
client: u128,
|
|
386
372
|
op: u64,
|
|
373
|
+
timestamp: u64,
|
|
387
374
|
operation: Operation,
|
|
388
375
|
input: []align(16) const u8,
|
|
389
|
-
output:
|
|
376
|
+
output: *align(16) [constants.message_body_size_max]u8,
|
|
390
377
|
) usize {
|
|
391
378
|
_ = client;
|
|
392
379
|
assert(op != 0);
|
|
380
|
+
assert(timestamp > self.commit_timestamp);
|
|
393
381
|
|
|
394
382
|
tracer.start(
|
|
395
383
|
&self.tracer_slot,
|
|
@@ -401,8 +389,8 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
401
389
|
const result = switch (operation) {
|
|
402
390
|
.root => unreachable,
|
|
403
391
|
.register => 0,
|
|
404
|
-
.create_accounts => self.execute(.create_accounts, input, output),
|
|
405
|
-
.create_transfers => self.execute(.create_transfers, input, output),
|
|
392
|
+
.create_accounts => self.execute(.create_accounts, timestamp, input, output),
|
|
393
|
+
.create_transfers => self.execute(.create_transfers, timestamp, input, output),
|
|
406
394
|
.lookup_accounts => self.execute_lookup_accounts(input, output),
|
|
407
395
|
.lookup_transfers => self.execute_lookup_transfers(input, output),
|
|
408
396
|
else => unreachable,
|
|
@@ -464,8 +452,9 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
464
452
|
fn execute(
|
|
465
453
|
self: *StateMachine,
|
|
466
454
|
comptime operation: Operation,
|
|
455
|
+
timestamp: u64,
|
|
467
456
|
input: []align(16) const u8,
|
|
468
|
-
output:
|
|
457
|
+
output: *align(16) [constants.message_body_size_max]u8,
|
|
469
458
|
) usize {
|
|
470
459
|
comptime assert(operation != .lookup_accounts and operation != .lookup_transfers);
|
|
471
460
|
|
|
@@ -476,7 +465,9 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
476
465
|
var chain: ?usize = null;
|
|
477
466
|
var chain_broken = false;
|
|
478
467
|
|
|
479
|
-
for (events) |*
|
|
468
|
+
for (events) |*event_, index| {
|
|
469
|
+
var event = event_.*;
|
|
470
|
+
|
|
480
471
|
const result = blk: {
|
|
481
472
|
if (event.flags.linked) {
|
|
482
473
|
if (chain == null) {
|
|
@@ -487,9 +478,14 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
487
478
|
if (index == events.len - 1) break :blk .linked_event_chain_open;
|
|
488
479
|
}
|
|
489
480
|
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
481
|
+
if (chain_broken) break :blk .linked_event_failed;
|
|
482
|
+
if (event.timestamp != 0) break :blk .timestamp_must_be_zero;
|
|
483
|
+
|
|
484
|
+
event.timestamp = timestamp - events.len + index + 1;
|
|
485
|
+
|
|
486
|
+
break :blk switch (operation) {
|
|
487
|
+
.create_accounts => self.create_account(&event),
|
|
488
|
+
.create_transfers => self.create_transfer(&event),
|
|
493
489
|
else => unreachable,
|
|
494
490
|
};
|
|
495
491
|
};
|
|
@@ -571,7 +567,11 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
571
567
|
}
|
|
572
568
|
|
|
573
569
|
// Accounts that do not fit in the response are omitted.
|
|
574
|
-
fn execute_lookup_accounts(
|
|
570
|
+
fn execute_lookup_accounts(
|
|
571
|
+
self: *StateMachine,
|
|
572
|
+
input: []const u8,
|
|
573
|
+
output: *align(16) [constants.message_body_size_max]u8,
|
|
574
|
+
) usize {
|
|
575
575
|
const batch = mem.bytesAsSlice(u128, input);
|
|
576
576
|
const output_len = @divFloor(output.len, @sizeOf(Account)) * @sizeOf(Account);
|
|
577
577
|
const results = mem.bytesAsSlice(Account, output[0..output_len]);
|
|
@@ -586,7 +586,11 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
|
|
|
586
586
|
}
|
|
587
587
|
|
|
588
588
|
// Transfers that do not fit in the response are omitted.
|
|
589
|
-
fn execute_lookup_transfers(
|
|
589
|
+
fn execute_lookup_transfers(
|
|
590
|
+
self: *StateMachine,
|
|
591
|
+
input: []const u8,
|
|
592
|
+
output: *align(16) [constants.message_body_size_max]u8,
|
|
593
|
+
) usize {
|
|
590
594
|
const batch = mem.bytesAsSlice(u128, input);
|
|
591
595
|
const output_len = @divFloor(output.len, @sizeOf(Transfer)) * @sizeOf(Transfer);
|
|
592
596
|
const results = mem.bytesAsSlice(Transfer, output[0..output_len]);
|
|
@@ -1111,7 +1115,7 @@ test "sum_overflows" {
|
|
|
1111
1115
|
}
|
|
1112
1116
|
|
|
1113
1117
|
const TestContext = struct {
|
|
1114
|
-
const Storage = @import("
|
|
1118
|
+
const Storage = @import("testing/storage.zig").Storage;
|
|
1115
1119
|
const MessagePool = @import("message_pool.zig").MessagePool;
|
|
1116
1120
|
const data_file_size_min = @import("vsr/superblock.zig").data_file_size_min;
|
|
1117
1121
|
const SuperBlock = @import("vsr/superblock.zig").SuperBlockType(Storage);
|
|
@@ -1221,6 +1225,7 @@ const TestCreateAccount = struct {
|
|
|
1221
1225
|
debits_posted: u64 = 0,
|
|
1222
1226
|
credits_pending: u64 = 0,
|
|
1223
1227
|
credits_posted: u64 = 0,
|
|
1228
|
+
timestamp: u64 = 0,
|
|
1224
1229
|
result: CreateAccountResult,
|
|
1225
1230
|
|
|
1226
1231
|
fn event(a: TestCreateAccount) Account {
|
|
@@ -1243,7 +1248,7 @@ const TestCreateAccount = struct {
|
|
|
1243
1248
|
.debits_posted = a.debits_posted,
|
|
1244
1249
|
.credits_pending = a.credits_pending,
|
|
1245
1250
|
.credits_posted = a.credits_posted,
|
|
1246
|
-
.timestamp =
|
|
1251
|
+
.timestamp = a.timestamp,
|
|
1247
1252
|
};
|
|
1248
1253
|
}
|
|
1249
1254
|
};
|
|
@@ -1264,6 +1269,7 @@ const TestCreateTransfer = struct {
|
|
|
1264
1269
|
flags_void_pending_transfer: ?enum { VOI } = null,
|
|
1265
1270
|
flags_padding: u12 = 0,
|
|
1266
1271
|
amount: u64 = 0,
|
|
1272
|
+
timestamp: u64 = 0,
|
|
1267
1273
|
result: CreateTransferResult,
|
|
1268
1274
|
|
|
1269
1275
|
fn event(t: TestCreateTransfer) Transfer {
|
|
@@ -1285,7 +1291,7 @@ const TestCreateTransfer = struct {
|
|
|
1285
1291
|
.padding = t.flags_padding,
|
|
1286
1292
|
},
|
|
1287
1293
|
.amount = t.amount,
|
|
1288
|
-
.timestamp =
|
|
1294
|
+
.timestamp = t.timestamp,
|
|
1289
1295
|
};
|
|
1290
1296
|
}
|
|
1291
1297
|
};
|
|
@@ -1295,7 +1301,7 @@ fn check(comptime test_table: []const u8) !void {
|
|
|
1295
1301
|
// `test_actions.constSlice()`. Most likely a comptime bug that will be resolved by 0.10.
|
|
1296
1302
|
if (@import("builtin").os.tag == .macos) return;
|
|
1297
1303
|
|
|
1298
|
-
const parse_table = @import("
|
|
1304
|
+
const parse_table = @import("testing/table.zig").parse;
|
|
1299
1305
|
const allocator = std.testing.allocator;
|
|
1300
1306
|
|
|
1301
1307
|
var context: TestContext = undefined;
|
|
@@ -1389,7 +1395,9 @@ fn check(comptime test_table: []const u8) !void {
|
|
|
1389
1395
|
|
|
1390
1396
|
.commit => |commit_operation| {
|
|
1391
1397
|
assert(operation == null or operation.? == commit_operation);
|
|
1392
|
-
|
|
1398
|
+
|
|
1399
|
+
context.state_machine.prepare_timestamp += 1;
|
|
1400
|
+
const timestamp = context.state_machine.prepare(commit_operation, request.items);
|
|
1393
1401
|
|
|
1394
1402
|
const reply_actual_buffer = try allocator.alignedAlloc(u8, 16, 4096);
|
|
1395
1403
|
defer allocator.free(reply_actual_buffer);
|
|
@@ -1397,9 +1405,10 @@ fn check(comptime test_table: []const u8) !void {
|
|
|
1397
1405
|
const reply_actual_size = context.state_machine.commit(
|
|
1398
1406
|
0,
|
|
1399
1407
|
1,
|
|
1408
|
+
timestamp,
|
|
1400
1409
|
commit_operation,
|
|
1401
1410
|
request.items,
|
|
1402
|
-
reply_actual_buffer,
|
|
1411
|
+
reply_actual_buffer[0..TestContext.message_body_size_max],
|
|
1403
1412
|
);
|
|
1404
1413
|
var reply_actual = reply_actual_buffer[0..reply_actual_size];
|
|
1405
1414
|
|
|
@@ -1454,24 +1463,25 @@ fn print_results(
|
|
|
1454
1463
|
|
|
1455
1464
|
test "create_accounts" {
|
|
1456
1465
|
try check(
|
|
1457
|
-
\\ account A1 U2 _ L3 C4 _ _ _ _ 0 0 0 0 ok
|
|
1458
|
-
\\ account A0 _ 1 L0 C0 _ D<C C<D 1 1 1 1 1
|
|
1459
|
-
\\ account A0 _ 1 L0 C0 _ D<C C<D
|
|
1460
|
-
\\ account A0 _
|
|
1461
|
-
\\ account
|
|
1462
|
-
\\ account
|
|
1463
|
-
\\ account A1 U1 _
|
|
1464
|
-
\\ account A1 U1 _ L9
|
|
1465
|
-
\\ account A1 U1 _ L9 C9 _ D<C
|
|
1466
|
-
\\ account A1 U1 _ L9 C9 _ D<C _ _
|
|
1467
|
-
\\ account A1 U1 _ L9 C9 _ D<C _ _ 0
|
|
1468
|
-
\\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0
|
|
1469
|
-
\\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 0
|
|
1470
|
-
\\ account A1 U1 _ L9 C9 _ _
|
|
1471
|
-
\\ account A1 U1 _ L9 C9 _ _
|
|
1472
|
-
\\ account A1
|
|
1473
|
-
\\ account A1 U2 _
|
|
1474
|
-
\\ account A1 U2 _ L3
|
|
1466
|
+
\\ account A1 U2 _ L3 C4 _ _ _ _ 0 0 0 0 _ ok
|
|
1467
|
+
\\ account A0 _ 1 L0 C0 _ D<C C<D 1 1 1 1 1 1 timestamp_must_be_zero
|
|
1468
|
+
\\ account A0 _ 1 L0 C0 _ D<C C<D 1 1 1 1 1 _ reserved_flag
|
|
1469
|
+
\\ account A0 _ 1 L0 C0 _ D<C C<D _ 1 1 1 1 _ reserved_field
|
|
1470
|
+
\\ account A0 _ _ L0 C0 _ D<C C<D _ 1 1 1 1 _ id_must_not_be_zero
|
|
1471
|
+
\\ account -0 _ _ L0 C0 _ D<C C<D _ 1 1 1 1 _ id_must_not_be_int_max
|
|
1472
|
+
\\ account A1 U1 _ L0 C0 _ D<C C<D _ 1 1 1 1 _ ledger_must_not_be_zero
|
|
1473
|
+
\\ account A1 U1 _ L9 C0 _ D<C C<D _ 1 1 1 1 _ code_must_not_be_zero
|
|
1474
|
+
\\ account A1 U1 _ L9 C9 _ D<C C<D _ -0 -0 -0 -0 _ mutually_exclusive_flags
|
|
1475
|
+
\\ account A1 U1 _ L9 C9 _ D<C _ _ 1 1 1 1 _ debits_pending_must_be_zero
|
|
1476
|
+
\\ account A1 U1 _ L9 C9 _ D<C _ _ 0 1 1 1 _ debits_posted_must_be_zero
|
|
1477
|
+
\\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 1 1 _ credits_pending_must_be_zero
|
|
1478
|
+
\\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 0 1 _ credits_posted_must_be_zero
|
|
1479
|
+
\\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 0 0 _ exists_with_different_flags
|
|
1480
|
+
\\ account A1 U1 _ L9 C9 _ _ C<D _ 0 0 0 0 _ exists_with_different_flags
|
|
1481
|
+
\\ account A1 U1 _ L9 C9 _ _ _ _ 0 0 0 0 _ exists_with_different_user_data
|
|
1482
|
+
\\ account A1 U2 _ L9 C9 _ _ _ _ 0 0 0 0 _ exists_with_different_ledger
|
|
1483
|
+
\\ account A1 U2 _ L3 C9 _ _ _ _ 0 0 0 0 _ exists_with_different_code
|
|
1484
|
+
\\ account A1 U2 _ L3 C4 _ _ _ _ 0 0 0 0 _ exists
|
|
1475
1485
|
\\ commit create_accounts
|
|
1476
1486
|
\\
|
|
1477
1487
|
\\ lookup_account -0 _
|
|
@@ -1490,32 +1500,32 @@ test "create_accounts: empty" {
|
|
|
1490
1500
|
|
|
1491
1501
|
test "linked accounts" {
|
|
1492
1502
|
try check(
|
|
1493
|
-
\\ account A7 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok // An individual event (successful):
|
|
1503
|
+
\\ account A7 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok // An individual event (successful):
|
|
1494
1504
|
|
|
1495
1505
|
// A chain of 4 events (the last event in the chain closes the chain with linked=false):
|
|
1496
|
-
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed // Commit/rollback.
|
|
1497
|
-
\\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed // Commit/rollback.
|
|
1498
|
-
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 exists // Fail with .exists.
|
|
1499
|
-
\\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 linked_event_failed // Fail without committing.
|
|
1506
|
+
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed // Commit/rollback.
|
|
1507
|
+
\\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed // Commit/rollback.
|
|
1508
|
+
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ exists // Fail with .exists.
|
|
1509
|
+
\\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ linked_event_failed // Fail without committing.
|
|
1500
1510
|
|
|
1501
1511
|
// An individual event (successful):
|
|
1502
1512
|
// This does not see any effect from the failed chain above.
|
|
1503
|
-
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1513
|
+
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1504
1514
|
|
|
1505
1515
|
// A chain of 2 events (the first event fails the chain):
|
|
1506
|
-
\\ account A1 _ _ L1 C2 LNK _ _ _ 0 0 0 0 exists_with_different_flags
|
|
1507
|
-
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 linked_event_failed
|
|
1516
|
+
\\ account A1 _ _ L1 C2 LNK _ _ _ 0 0 0 0 _ exists_with_different_flags
|
|
1517
|
+
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ linked_event_failed
|
|
1508
1518
|
|
|
1509
1519
|
// An individual event (successful):
|
|
1510
|
-
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1520
|
+
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1511
1521
|
|
|
1512
1522
|
// A chain of 2 events (the last event fails the chain):
|
|
1513
|
-
\\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed
|
|
1514
|
-
\\ account A1 _ _ L2 C1 _ _ _ _ 0 0 0 0 exists_with_different_ledger
|
|
1523
|
+
\\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed
|
|
1524
|
+
\\ account A1 _ _ L2 C1 _ _ _ _ 0 0 0 0 _ exists_with_different_ledger
|
|
1515
1525
|
|
|
1516
1526
|
// A chain of 2 events (successful):
|
|
1517
|
-
\\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 ok
|
|
1518
|
-
\\ account A4 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1527
|
+
\\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ ok
|
|
1528
|
+
\\ account A4 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1519
1529
|
\\ commit create_accounts
|
|
1520
1530
|
\\
|
|
1521
1531
|
\\ lookup_account A7 0 0 0 0
|
|
@@ -1527,13 +1537,13 @@ test "linked accounts" {
|
|
|
1527
1537
|
);
|
|
1528
1538
|
|
|
1529
1539
|
try check(
|
|
1530
|
-
\\ account A7 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok // An individual event (successful):
|
|
1540
|
+
\\ account A7 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok // An individual event (successful):
|
|
1531
1541
|
|
|
1532
1542
|
// A chain of 4 events:
|
|
1533
|
-
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed // Commit/rollback.
|
|
1534
|
-
\\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed // Commit/rollback.
|
|
1535
|
-
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 exists // Fail with .exists.
|
|
1536
|
-
\\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 linked_event_failed // Fail without committing.
|
|
1543
|
+
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed // Commit/rollback.
|
|
1544
|
+
\\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed // Commit/rollback.
|
|
1545
|
+
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ exists // Fail with .exists.
|
|
1546
|
+
\\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ linked_event_failed // Fail without committing.
|
|
1537
1547
|
\\ commit create_accounts
|
|
1538
1548
|
\\
|
|
1539
1549
|
\\ lookup_account A7 0 0 0 0
|
|
@@ -1550,13 +1560,13 @@ test "linked accounts" {
|
|
|
1550
1560
|
test "linked_event_chain_open" {
|
|
1551
1561
|
try check(
|
|
1552
1562
|
// A chain of 3 events (the last event in the chain closes the chain with linked=false):
|
|
1553
|
-
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 ok
|
|
1554
|
-
\\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 ok
|
|
1555
|
-
\\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1563
|
+
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ ok
|
|
1564
|
+
\\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ ok
|
|
1565
|
+
\\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1556
1566
|
|
|
1557
1567
|
// An open chain of 2 events:
|
|
1558
|
-
\\ account A4 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed
|
|
1559
|
-
\\ account A5 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_chain_open
|
|
1568
|
+
\\ account A4 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed
|
|
1569
|
+
\\ account A5 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_chain_open
|
|
1560
1570
|
\\ commit create_accounts
|
|
1561
1571
|
\\
|
|
1562
1572
|
\\ lookup_account A1 0 0 0 0
|
|
@@ -1571,12 +1581,12 @@ test "linked_event_chain_open" {
|
|
|
1571
1581
|
test "linked_event_chain_open for an already failed batch" {
|
|
1572
1582
|
try check(
|
|
1573
1583
|
// An individual event (successful):
|
|
1574
|
-
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1584
|
+
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1575
1585
|
|
|
1576
1586
|
// An open chain of 3 events (the second one fails):
|
|
1577
|
-
\\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed
|
|
1578
|
-
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 exists_with_different_flags
|
|
1579
|
-
\\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_chain_open
|
|
1587
|
+
\\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed
|
|
1588
|
+
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ exists_with_different_flags
|
|
1589
|
+
\\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_chain_open
|
|
1580
1590
|
\\ commit create_accounts
|
|
1581
1591
|
\\
|
|
1582
1592
|
\\ lookup_account A1 0 0 0 0
|
|
@@ -1588,7 +1598,7 @@ test "linked_event_chain_open for an already failed batch" {
|
|
|
1588
1598
|
|
|
1589
1599
|
test "linked_event_chain_open for a batch of 1" {
|
|
1590
1600
|
try check(
|
|
1591
|
-
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_chain_open
|
|
1601
|
+
\\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_chain_open
|
|
1592
1602
|
\\ commit create_accounts
|
|
1593
1603
|
\\
|
|
1594
1604
|
\\ lookup_account A1 _
|
|
@@ -1602,11 +1612,11 @@ test "linked_event_chain_open for a batch of 1" {
|
|
|
1602
1612
|
// 3. state machine logic cannot be reordered in any way, breaking determinism.
|
|
1603
1613
|
test "create_transfers/lookup_transfers" {
|
|
1604
1614
|
try check(
|
|
1605
|
-
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1606
|
-
\\ account A2 _ _ L2 C2 _ _ _ _ 0 0 0 0 ok
|
|
1607
|
-
\\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1608
|
-
\\ account A4 _ _ L1 C1 _ D<C _ _ 0 0 0 0 ok
|
|
1609
|
-
\\ account A5 _ _ L1 C1 _ _ C<D _ 0 0 0 0 ok
|
|
1615
|
+
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1616
|
+
\\ account A2 _ _ L2 C2 _ _ _ _ 0 0 0 0 _ ok
|
|
1617
|
+
\\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1618
|
+
\\ account A4 _ _ L1 C1 _ D<C _ _ 0 0 0 0 _ ok
|
|
1619
|
+
\\ account A5 _ _ L1 C1 _ _ C<D _ 0 0 0 0 _ ok
|
|
1610
1620
|
\\ commit create_accounts
|
|
1611
1621
|
|
|
1612
1622
|
// Set up initial balances.
|
|
@@ -1617,47 +1627,48 @@ test "create_transfers/lookup_transfers" {
|
|
|
1617
1627
|
\\ setup A5 0 -1000 10 -1100
|
|
1618
1628
|
|
|
1619
1629
|
// Test errors by descending precedence.
|
|
1620
|
-
\\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ P1 0
|
|
1621
|
-
\\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _
|
|
1622
|
-
\\ transfer T0 A0 A0 _
|
|
1623
|
-
\\ transfer
|
|
1624
|
-
\\ transfer
|
|
1625
|
-
\\ transfer T1
|
|
1626
|
-
\\ transfer T1
|
|
1627
|
-
\\ transfer T1 A8
|
|
1628
|
-
\\ transfer T1 A8
|
|
1629
|
-
\\ transfer T1 A8
|
|
1630
|
-
\\ transfer T1 A8 A9 _ _
|
|
1631
|
-
\\ transfer T1 A8 A9 _ _ _ -0 L0 C0 _
|
|
1632
|
-
\\ transfer T1 A8 A9 _ _ _ -0
|
|
1633
|
-
\\ transfer T1 A8 A9 _ _ _ -0 L9
|
|
1634
|
-
\\ transfer T1 A8 A9 _ _ _ -0 L9 C1 _ PEN _ _ _
|
|
1635
|
-
\\ transfer T1
|
|
1636
|
-
\\ transfer T1 A1
|
|
1637
|
-
\\ transfer T1 A1
|
|
1638
|
-
\\ transfer T1 A1 A3 _ _ _ -0
|
|
1639
|
-
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _
|
|
1640
|
-
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -
|
|
1641
|
-
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -
|
|
1642
|
-
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -
|
|
1643
|
-
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -
|
|
1644
|
-
\\ transfer T1
|
|
1645
|
-
\\ transfer T1 A4 A5 _ _ _
|
|
1646
|
-
\\ transfer T1 A4 A5 _ _ _ _ L1 C1 _ _ _ _ _
|
|
1647
|
-
\\ transfer T1
|
|
1630
|
+
\\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ P1 0 1 timestamp_must_be_zero
|
|
1631
|
+
\\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ P1 0 _ reserved_flag
|
|
1632
|
+
\\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ _ 0 _ reserved_field
|
|
1633
|
+
\\ transfer T0 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ id_must_not_be_zero
|
|
1634
|
+
\\ transfer -0 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ id_must_not_be_int_max
|
|
1635
|
+
\\ transfer T1 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ debit_account_id_must_not_be_zero
|
|
1636
|
+
\\ transfer T1 -0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ debit_account_id_must_not_be_int_max
|
|
1637
|
+
\\ transfer T1 A8 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ credit_account_id_must_not_be_zero
|
|
1638
|
+
\\ transfer T1 A8 -0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ credit_account_id_must_not_be_int_max
|
|
1639
|
+
\\ transfer T1 A8 A8 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ accounts_must_be_different
|
|
1640
|
+
\\ transfer T1 A8 A9 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ pending_id_must_be_zero
|
|
1641
|
+
\\ transfer T1 A8 A9 _ _ _ -0 L0 C0 _ _ _ _ _ 0 _ timeout_reserved_for_pending_transfer
|
|
1642
|
+
\\ transfer T1 A8 A9 _ _ _ -0 L0 C0 _ PEN _ _ _ 0 _ ledger_must_not_be_zero
|
|
1643
|
+
\\ transfer T1 A8 A9 _ _ _ -0 L9 C0 _ PEN _ _ _ 0 _ code_must_not_be_zero
|
|
1644
|
+
\\ transfer T1 A8 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 0 _ amount_must_not_be_zero
|
|
1645
|
+
\\ transfer T1 A8 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 9 _ debit_account_not_found
|
|
1646
|
+
\\ transfer T1 A1 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 9 _ credit_account_not_found
|
|
1647
|
+
\\ transfer T1 A1 A2 _ _ _ -0 L9 C1 _ PEN _ _ _ 1 _ accounts_must_have_the_same_ledger
|
|
1648
|
+
\\ transfer T1 A1 A3 _ _ _ -0 L9 C1 _ PEN _ _ _ 1 _ transfer_must_have_the_same_ledger_as_accounts
|
|
1649
|
+
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -99 _ overflows_debits_pending // amount = max - A1.debits_pending + 1
|
|
1650
|
+
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -109 _ overflows_credits_pending // amount = max - A3.credits_pending + 1
|
|
1651
|
+
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -199 _ overflows_debits_posted // amount = max - A1.debits_posted + 1
|
|
1652
|
+
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -209 _ overflows_credits_posted // amount = max - A3.credits_posted + 1
|
|
1653
|
+
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -299 _ overflows_debits // amount = max - A1.debits_pending - A1.debits_posted + 1
|
|
1654
|
+
\\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -319 _ overflows_credits // amount = max - A3.credits_pending - A3.credits_posted + 1
|
|
1655
|
+
\\ transfer T1 A4 A5 _ _ _ -0 L1 C1 _ PEN _ _ _ 199 _ overflows_timeout // amount = A4.credits_posted - A4.debits_pending - A4.debits_posted + 1
|
|
1656
|
+
\\ transfer T1 A4 A5 _ _ _ _ L1 C1 _ _ _ _ _ 199 _ exceeds_credits // amount = A4.credits_posted - A4.debits_pending - A4.debits_posted + 1
|
|
1657
|
+
\\ transfer T1 A4 A5 _ _ _ _ L1 C1 _ _ _ _ _ 91 _ exceeds_debits // amount = A5.debits_posted - A5.credits_pending - A5.credits_posted + 1
|
|
1658
|
+
\\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ 123 _ ok
|
|
1648
1659
|
|
|
1649
1660
|
// Ensure that idempotence is only checked after validation.
|
|
1650
|
-
\\ transfer T1 A1 A3 _ _ _ 999 L2 C1 _ PEN _ _ _ 123 transfer_must_have_the_same_ledger_as_accounts
|
|
1651
|
-
\\ transfer T1 A1 A3 U1 _ _ _ L1 C2 _ _ _ _ _ -0 exists_with_different_flags
|
|
1652
|
-
\\ transfer T1 A3 A1 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 exists_with_different_debit_account_id
|
|
1653
|
-
\\ transfer T1 A1 A4 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 exists_with_different_credit_account_id
|
|
1654
|
-
\\ transfer T1 A1 A3 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 exists_with_different_user_data
|
|
1655
|
-
\\ transfer T1 A1 A3 _ _ _ 998 L1 C2 _ PEN _ _ _ -0 exists_with_different_timeout
|
|
1656
|
-
\\ transfer T1 A1 A3 _ _ _ 999 L1 C2 _ PEN _ _ _ -0 exists_with_different_code
|
|
1657
|
-
\\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ -0 exists_with_different_amount
|
|
1658
|
-
\\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ 123 exists
|
|
1659
|
-
\\ transfer T2 A3 A1 _ _ _ _ L1 C2 _ _ _ _ _ 7 ok
|
|
1660
|
-
\\ transfer T3 A1 A3 _ _ _ _ L1 C2 _ _ _ _ _ 3 ok
|
|
1661
|
+
\\ transfer T1 A1 A3 _ _ _ 999 L2 C1 _ PEN _ _ _ 123 _ transfer_must_have_the_same_ledger_as_accounts
|
|
1662
|
+
\\ transfer T1 A1 A3 U1 _ _ _ L1 C2 _ _ _ _ _ -0 _ exists_with_different_flags
|
|
1663
|
+
\\ transfer T1 A3 A1 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_debit_account_id
|
|
1664
|
+
\\ transfer T1 A1 A4 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_credit_account_id
|
|
1665
|
+
\\ transfer T1 A1 A3 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_user_data
|
|
1666
|
+
\\ transfer T1 A1 A3 _ _ _ 998 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_timeout
|
|
1667
|
+
\\ transfer T1 A1 A3 _ _ _ 999 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_code
|
|
1668
|
+
\\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ -0 _ exists_with_different_amount
|
|
1669
|
+
\\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ 123 _ exists
|
|
1670
|
+
\\ transfer T2 A3 A1 _ _ _ _ L1 C2 _ _ _ _ _ 7 _ ok
|
|
1671
|
+
\\ transfer T3 A1 A3 _ _ _ _ L1 C2 _ _ _ _ _ 3 _ ok
|
|
1661
1672
|
\\ commit create_transfers
|
|
1662
1673
|
\\
|
|
1663
1674
|
\\ lookup_account A1 223 203 0 7
|
|
@@ -1674,17 +1685,17 @@ test "create_transfers/lookup_transfers" {
|
|
|
1674
1685
|
|
|
1675
1686
|
test "create/lookup 2-phase transfers" {
|
|
1676
1687
|
try check(
|
|
1677
|
-
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1678
|
-
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1688
|
+
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1689
|
+
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1679
1690
|
\\ commit create_accounts
|
|
1680
1691
|
|
|
1681
1692
|
// First phase.
|
|
1682
|
-
\\ transfer T1 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 ok // Not pending!
|
|
1683
|
-
\\ transfer T2 A1 A2 _ _ _ 1000 L1 C1 _ PEN _ _ _ 15 ok
|
|
1684
|
-
\\ transfer T3 A1 A2 _ _ _ 50 L1 C1 _ PEN _ _ _ 15 ok
|
|
1685
|
-
\\ transfer T4 A1 A2 _ _ _ 1 L1 C1 _ PEN _ _ _ 15 ok
|
|
1686
|
-
\\ transfer T5 A1 A2 U9 _ _ 50 L1 C1 _ PEN _ _ _ 7 ok
|
|
1687
|
-
\\ transfer T6 A1 A2 _ _ _ 0 L1 C1 _ PEN _ _ _ 1 ok
|
|
1693
|
+
\\ transfer T1 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 _ ok // Not pending!
|
|
1694
|
+
\\ transfer T2 A1 A2 _ _ _ 1000 L1 C1 _ PEN _ _ _ 15 _ ok
|
|
1695
|
+
\\ transfer T3 A1 A2 _ _ _ 50 L1 C1 _ PEN _ _ _ 15 _ ok
|
|
1696
|
+
\\ transfer T4 A1 A2 _ _ _ 1 L1 C1 _ PEN _ _ _ 15 _ ok
|
|
1697
|
+
\\ transfer T5 A1 A2 U9 _ _ 50 L1 C1 _ PEN _ _ _ 7 _ ok
|
|
1698
|
+
\\ transfer T6 A1 A2 _ _ _ 0 L1 C1 _ PEN _ _ _ 1 _ ok
|
|
1688
1699
|
\\ commit create_transfers
|
|
1689
1700
|
|
|
1690
1701
|
// Check balances before resolving.
|
|
@@ -1693,34 +1704,35 @@ test "create/lookup 2-phase transfers" {
|
|
|
1693
1704
|
\\ commit lookup_accounts
|
|
1694
1705
|
|
|
1695
1706
|
// Second phase.
|
|
1696
|
-
\\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 ok
|
|
1697
|
-
\\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN POS VOI _ 16
|
|
1698
|
-
\\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN
|
|
1699
|
-
\\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ _
|
|
1700
|
-
\\ transfer T101 A8 A9 U2 _ T0
|
|
1701
|
-
\\ transfer T101 A8 A9 U2 _
|
|
1702
|
-
\\ transfer T101 A8 A9 U2 _
|
|
1703
|
-
\\ transfer T101 A8 A9 U2 _
|
|
1704
|
-
\\ transfer T101 A8 A9 U2 _
|
|
1705
|
-
\\ transfer T101 A8 A9 U2 _
|
|
1706
|
-
\\ transfer T101
|
|
1707
|
-
\\ transfer T101 A1
|
|
1708
|
-
\\ transfer T101 A1 A2 U2 _ T2 _
|
|
1709
|
-
\\ transfer T101 A1 A2 U2 _ T2 _ L1
|
|
1710
|
-
\\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _
|
|
1711
|
-
\\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _
|
|
1712
|
-
\\ transfer T101 A1 A2 U2 _
|
|
1713
|
-
\\ transfer T101 A1 A2 U2 _
|
|
1714
|
-
\\ transfer T101 A1 A2
|
|
1715
|
-
\\ transfer T101 A1 A2
|
|
1716
|
-
\\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _
|
|
1717
|
-
\\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _
|
|
1718
|
-
\\ transfer
|
|
1719
|
-
\\ transfer
|
|
1720
|
-
\\ transfer
|
|
1721
|
-
\\ transfer T102 A1 A2 U1 _
|
|
1722
|
-
\\ transfer
|
|
1723
|
-
\\ transfer
|
|
1707
|
+
\\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 _ ok
|
|
1708
|
+
\\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN POS VOI _ 16 1 timestamp_must_be_zero
|
|
1709
|
+
\\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN POS VOI _ 16 _ cannot_post_and_void_pending_transfer
|
|
1710
|
+
\\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN _ VOI _ 16 _ pending_transfer_cannot_post_or_void_another
|
|
1711
|
+
\\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ _ _ VOI _ 16 _ timeout_reserved_for_pending_transfer
|
|
1712
|
+
\\ transfer T101 A8 A9 U2 _ T0 _ L6 C7 _ _ _ VOI _ 16 _ pending_id_must_not_be_zero
|
|
1713
|
+
\\ transfer T101 A8 A9 U2 _ -0 _ L6 C7 _ _ _ VOI _ 16 _ pending_id_must_not_be_int_max
|
|
1714
|
+
\\ transfer T101 A8 A9 U2 _ 101 _ L6 C7 _ _ _ VOI _ 16 _ pending_id_must_be_different
|
|
1715
|
+
\\ transfer T101 A8 A9 U2 _ 102 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_not_found
|
|
1716
|
+
\\ transfer T101 A8 A9 U2 _ T1 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_not_pending
|
|
1717
|
+
\\ transfer T101 A8 A9 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_has_different_debit_account_id
|
|
1718
|
+
\\ transfer T101 A1 A9 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_has_different_credit_account_id
|
|
1719
|
+
\\ transfer T101 A1 A2 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_has_different_ledger
|
|
1720
|
+
\\ transfer T101 A1 A2 U2 _ T2 _ L1 C7 _ _ _ VOI _ 16 _ pending_transfer_has_different_code
|
|
1721
|
+
\\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 16 _ exceeds_pending_transfer_amount
|
|
1722
|
+
\\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 14 _ pending_transfer_has_different_amount
|
|
1723
|
+
\\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 15 _ exists_with_different_flags
|
|
1724
|
+
\\ transfer T101 A1 A2 U2 _ T3 _ L1 C1 _ _ POS _ _ 14 _ exists_with_different_pending_id
|
|
1725
|
+
\\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ POS _ _ 14 _ exists_with_different_user_data
|
|
1726
|
+
\\ transfer T101 A1 A2 U0 _ T2 _ L1 C1 _ _ POS _ _ 14 _ exists_with_different_user_data
|
|
1727
|
+
\\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 14 _ exists_with_different_amount
|
|
1728
|
+
\\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ _ _ exists_with_different_amount
|
|
1729
|
+
\\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 _ exists
|
|
1730
|
+
\\ transfer T102 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 _ pending_transfer_already_posted
|
|
1731
|
+
\\ transfer T103 A1 A2 U1 _ T3 _ L1 C1 _ _ _ VOI _ 15 _ ok
|
|
1732
|
+
\\ transfer T102 A1 A2 U1 _ T3 _ L1 C1 _ _ POS _ _ 13 _ pending_transfer_already_voided
|
|
1733
|
+
\\ transfer T102 A1 A2 U1 _ T4 _ L1 C1 _ _ _ VOI _ 15 _ pending_transfer_expired
|
|
1734
|
+
\\ transfer T105 A0 A0 U0 _ T5 _ L0 C0 _ _ POS _ _ _ _ ok
|
|
1735
|
+
\\ transfer T106 A0 A0 U0 _ T6 _ L1 C1 _ _ POS _ _ 0 _ ok
|
|
1724
1736
|
\\ commit create_transfers
|
|
1725
1737
|
|
|
1726
1738
|
// Check balances after resolving.
|
|
@@ -1738,12 +1750,12 @@ test "create_transfers: empty" {
|
|
|
1738
1750
|
|
|
1739
1751
|
test "create_transfers/lookup_transfers: failed transfer does not exist" {
|
|
1740
1752
|
try check(
|
|
1741
|
-
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1742
|
-
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1753
|
+
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1754
|
+
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1743
1755
|
\\ commit create_accounts
|
|
1744
1756
|
\\
|
|
1745
|
-
\\ transfer T1 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 ok
|
|
1746
|
-
\\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 ledger_must_not_be_zero
|
|
1757
|
+
\\ transfer T1 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 _ ok
|
|
1758
|
+
\\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 _ ledger_must_not_be_zero
|
|
1747
1759
|
\\ commit create_transfers
|
|
1748
1760
|
\\
|
|
1749
1761
|
\\ lookup_account A1 0 15 0 0
|
|
@@ -1758,16 +1770,16 @@ test "create_transfers/lookup_transfers: failed transfer does not exist" {
|
|
|
1758
1770
|
|
|
1759
1771
|
test "create_transfers: failed linked-chains are undone" {
|
|
1760
1772
|
try check(
|
|
1761
|
-
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1762
|
-
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1773
|
+
\\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1774
|
+
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1763
1775
|
\\ commit create_accounts
|
|
1764
1776
|
\\
|
|
1765
|
-
\\ transfer T1 A1 A2 _ _ _ _ L1 C1 LNK _ _ _ _ 15 linked_event_failed
|
|
1766
|
-
\\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 ledger_must_not_be_zero
|
|
1777
|
+
\\ transfer T1 A1 A2 _ _ _ _ L1 C1 LNK _ _ _ _ 15 _ linked_event_failed
|
|
1778
|
+
\\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 _ ledger_must_not_be_zero
|
|
1767
1779
|
\\ commit create_transfers
|
|
1768
1780
|
\\
|
|
1769
|
-
\\ transfer T3 A1 A2 _ _ _ 1 L1 C1 LNK PEN _ _ _ 15 linked_event_failed
|
|
1770
|
-
\\ transfer T4 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 ledger_must_not_be_zero
|
|
1781
|
+
\\ transfer T3 A1 A2 _ _ _ 1 L1 C1 LNK PEN _ _ _ 15 _ linked_event_failed
|
|
1782
|
+
\\ transfer T4 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 _ ledger_must_not_be_zero
|
|
1771
1783
|
\\ commit create_transfers
|
|
1772
1784
|
\\
|
|
1773
1785
|
\\ lookup_account A1 0 0 0 0
|
|
@@ -1784,15 +1796,15 @@ test "create_transfers: failed linked-chains are undone" {
|
|
|
1784
1796
|
|
|
1785
1797
|
test "create_transfers: failed linked-chains are undone within a commit" {
|
|
1786
1798
|
try check(
|
|
1787
|
-
\\ account A1 _ _ L1 C1 _ D<C _ _ 0 0 0 0 ok
|
|
1788
|
-
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
|
|
1799
|
+
\\ account A1 _ _ L1 C1 _ D<C _ _ 0 0 0 0 _ ok
|
|
1800
|
+
\\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
|
|
1789
1801
|
\\ commit create_accounts
|
|
1790
1802
|
\\
|
|
1791
1803
|
\\ setup A1 0 0 0 20
|
|
1792
1804
|
\\
|
|
1793
|
-
\\ transfer T1 A1 A2 _ _ _ _ L1 C1 LNK _ _ _ _ 15 linked_event_failed
|
|
1794
|
-
\\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 5 ledger_must_not_be_zero
|
|
1795
|
-
\\ transfer T3 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 ok
|
|
1805
|
+
\\ transfer T1 A1 A2 _ _ _ _ L1 C1 LNK _ _ _ _ 15 _ linked_event_failed
|
|
1806
|
+
\\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 5 _ ledger_must_not_be_zero
|
|
1807
|
+
\\ transfer T3 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 _ ok
|
|
1796
1808
|
\\ commit create_transfers
|
|
1797
1809
|
\\
|
|
1798
1810
|
\\ lookup_account A1 0 15 0 20
|