run error
cput k=k v=v cond=v2 ts=123
----
>> at end:
<no data>
error: (*kvpb.ConditionFailedError:) unexpected value: <nil>

# Verify the difference between missing value and empty value.

run error
cput k=k v=v cond= ts=123,1
----
>> at end:
<no data>
error: (*kvpb.ConditionFailedError:) unexpected value: <nil>

# Do a conditional put with expectation that the value is completely missing; will succeed.

run stats ok
cput k=k v=v ts=123,2
----
>> cput k=k v=v ts=123,2
stats: key_count=+1 key_bytes=+14 val_count=+1 val_bytes=+6 live_count=+1 live_bytes=+20
>> at end:
data: "k"/123.000000000,2 -> /BYTES/v
stats: key_count=1 key_bytes=14 val_count=1 val_bytes=6 live_count=1 live_bytes=20

# Another conditional put expecting value missing will fail, now that value1 is written.

run error
cput k=k v=v ts=123,3
----
>> at end:
data: "k"/123.000000000,2 -> /BYTES/v
error: (*kvpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003v" timestamp:<wall_time:123000000000 logical:2 > 

# Conditional put expecting wrong value2, will fail.

run error
cput k=k v=v cond=v2 ts=123,4
----
>> at end:
data: "k"/123.000000000,2 -> /BYTES/v
error: (*kvpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003v" timestamp:<wall_time:123000000000 logical:2 > 

# Move to an empty value. Will succeed.

run stats ok
cput k=k v= cond=v ts=123,5
----
>> cput k=k v= cond=v ts=123,5
stats: key_bytes=+12 val_count=+1 val_bytes=+5 live_bytes=-1 gc_bytes_age=-414
>> at end:
data: "k"/123.000000000,5 -> /BYTES/
data: "k"/123.000000000,2 -> /BYTES/v
stats: key_count=1 key_bytes=26 val_count=2 val_bytes=11 live_count=1 live_bytes=19 gc_bytes_age=-414

# Move key2 (which does not exist) to from value1 to value2.
# Expect it to fail since it does not exist with value1.

run error
cput k=k2 v=v2 cond=v ts=123,6
----
>> at end:
data: "k"/123.000000000,5 -> /BYTES/
data: "k"/123.000000000,2 -> /BYTES/v
error: (*kvpb.ConditionFailedError:) unexpected value: <nil>

# Move key2 (which does not yet exist) to from value1 to value2, but
# allowing for it not existing.

run stats ok
cput k=k2 v=v2 cond=v ts=123,7 allow_missing
----
>> cput k=k2 v=v2 cond=v ts=123,7 allow_missing
stats: key_count=+1 key_bytes=+15 val_count=+1 val_bytes=+7 live_count=+1 live_bytes=+22
>> at end:
data: "k"/123.000000000,5 -> /BYTES/
data: "k"/123.000000000,2 -> /BYTES/v
data: "k2"/123.000000000,7 -> /BYTES/v2
stats: key_count=2 key_bytes=41 val_count=3 val_bytes=18 live_count=2 live_bytes=41 gc_bytes_age=-414

# Try to move key2 (which has value2) from value1 to empty. Expect error.

run error
cput k=k2 v= cond=v allow_missing ts=123,8
----
>> at end:
data: "k"/123.000000000,5 -> /BYTES/
data: "k"/123.000000000,2 -> /BYTES/v
data: "k2"/123.000000000,7 -> /BYTES/v2
error: (*kvpb.ConditionFailedError:) unexpected value: raw_bytes:"\000\000\000\000\003v2" timestamp:<wall_time:123000000000 logical:7 > 

# Try to move key2 (which has value2) from value2 to empty. Expect success.

run stats ok
cput k=k2 v= cond=v2 allow_missing ts=123,9
----
>> cput k=k2 v= cond=v2 allow_missing ts=123,9
stats: key_bytes=+12 val_count=+1 val_bytes=+5 live_bytes=-2 gc_bytes_age=-437
>> at end:
data: "k"/123.000000000,5 -> /BYTES/
data: "k"/123.000000000,2 -> /BYTES/v
data: "k2"/123.000000000,9 -> /BYTES/
data: "k2"/123.000000000,7 -> /BYTES/v2
stats: key_count=2 key_bytes=53 val_count=4 val_bytes=23 live_count=2 live_bytes=39 gc_bytes_age=-851

# Now move to value2 from expected empty value.

run stats ok
cput k=k v=v2 cond= ts=123,10
----
>> cput k=k v=v2 cond= ts=123,10
stats: key_bytes=+12 val_count=+1 val_bytes=+7 live_bytes=+2 gc_bytes_age=-391
>> at end:
data: "k"/123.000000000,10 -> /BYTES/v2
data: "k"/123.000000000,5 -> /BYTES/
data: "k"/123.000000000,2 -> /BYTES/v
data: "k2"/123.000000000,9 -> /BYTES/
data: "k2"/123.000000000,7 -> /BYTES/v2
stats: key_count=2 key_bytes=65 val_count=5 val_bytes=30 live_count=2 live_bytes=41 gc_bytes_age=-1242

# Verify we get value2 as expected.

run ok
get k=k ts=123,11
----
get: "k" -> /BYTES/v2 @123.000000000,10
