aboutsummaryrefslogtreecommitdiff
path: root/internal/storage/pebble_store_batch_test.go
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-26 14:46:02 -0800
committerFuwn <[email protected]>2026-02-26 14:48:52 -0800
commit0099d621e97b6048971fadb5c71918cc9f2b5a09 (patch)
treea38ba31585200bacd61f453ef7158de7f0aaf7a3 /internal/storage/pebble_store_batch_test.go
parentInitial commit (diff)
downloadplutia-test-0099d621e97b6048971fadb5c71918cc9f2b5a09.tar.xz
plutia-test-0099d621e97b6048971fadb5c71918cc9f2b5a09.zip
feat: initial Plutia release — verifiable high-performance PLC mirror (mirror + resolver modes)
Diffstat (limited to 'internal/storage/pebble_store_batch_test.go')
-rw-r--r--internal/storage/pebble_store_batch_test.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/internal/storage/pebble_store_batch_test.go b/internal/storage/pebble_store_batch_test.go
new file mode 100644
index 0000000..85afc92
--- /dev/null
+++ b/internal/storage/pebble_store_batch_test.go
@@ -0,0 +1,74 @@
+package storage
+
+import (
+ "testing"
+ "time"
+
+ "github.com/Fuwn/plutia/internal/types"
+)
+
+func TestPebbleStoreApplyOperationBatch(t *testing.T) {
+ tmp := t.TempDir()
+ store, err := OpenPebble(tmp)
+ if err != nil {
+ t.Fatalf("open pebble: %v", err)
+ }
+ defer store.Close()
+
+ state := types.StateV1{
+ Version: 1,
+ DID: "did:plc:test",
+ DIDDocument: []byte(`{"id":"did:plc:test"}`),
+ ChainTipHash: "bafy-state-tip",
+ LatestOpSeq: 42,
+ UpdatedAt: time.Now().UTC(),
+ }
+ ref := &types.BlockRefV1{
+ Version: 1,
+ BlockID: 9,
+ Offset: 123,
+ Length: 456,
+ OpSeq: 42,
+ DID: "did:plc:test",
+ CID: "bafy-op-cid",
+ OpHash: "bafy-op-hash",
+ }
+
+ if err := store.ApplyOperationBatch(state, ref, true); err != nil {
+ t.Fatalf("apply operation batch: %v", err)
+ }
+
+ gotState, ok, err := store.GetState(state.DID)
+ if err != nil || !ok {
+ t.Fatalf("get state: ok=%v err=%v", ok, err)
+ }
+ if gotState.ChainTipHash != state.ChainTipHash || gotState.LatestOpSeq != state.LatestOpSeq {
+ t.Fatalf("state mismatch: got tip=%s seq=%d", gotState.ChainTipHash, gotState.LatestOpSeq)
+ }
+
+ head, ok, err := store.GetChainHead(state.DID)
+ if err != nil || !ok || head != state.LatestOpSeq {
+ t.Fatalf("chain head mismatch: head=%d ok=%v err=%v", head, ok, err)
+ }
+
+ seqs, err := store.ListDIDSequences(state.DID)
+ if err != nil {
+ t.Fatalf("list did sequences: %v", err)
+ }
+ if len(seqs) != 1 || seqs[0] != state.LatestOpSeq {
+ t.Fatalf("did sequence mismatch: %v", seqs)
+ }
+
+ gotRef, ok, err := store.GetOpSeqRef(state.LatestOpSeq)
+ if err != nil || !ok {
+ t.Fatalf("get opseq ref: ok=%v err=%v", ok, err)
+ }
+ if gotRef.BlockID != ref.BlockID || gotRef.CID != ref.CID {
+ t.Fatalf("op ref mismatch: got block=%d cid=%s", gotRef.BlockID, gotRef.CID)
+ }
+
+ globalSeq, err := store.GetGlobalSeq()
+ if err != nil || globalSeq != state.LatestOpSeq {
+ t.Fatalf("global seq mismatch: seq=%d err=%v", globalSeq, err)
+ }
+}