github.com/alexyer/taggedptr@v0.0.0-20160103160510-29e0338f9028/taggedptr_test.go (about) 1 package taggedptr 2 3 import ( 4 "testing" 5 "unsafe" 6 ) 7 8 type TestStruct struct { 9 Field int 10 } 11 12 func TestTag(t *testing.T) { 13 s := &TestStruct{42} 14 15 initialPtr := unsafe.Pointer(s) 16 newPtr, _ := Tag(unsafe.Pointer(s), 3) 17 s = (*TestStruct)(newPtr) 18 19 if unsafe.Pointer(s) != unsafe.Pointer(uintptr(initialPtr)|3) { 20 t.Fatal("wrong tag") 21 } 22 23 if _, err := Tag(unsafe.Pointer(s), 10); err == nil { 24 t.Fatal("expected error") 25 } 26 } 27 28 func TestGetPointer(t *testing.T) { 29 s := &TestStruct{42} 30 initialPtr := unsafe.Pointer(s) 31 newPtr, _ := Tag(unsafe.Pointer(s), 3) 32 s = (*TestStruct)(newPtr) 33 34 if ptr := GetPointer(unsafe.Pointer(s)); ptr != initialPtr { 35 t.Fatalf("got wrong pointer. expected: %p, got: %p", initialPtr, ptr) 36 } 37 } 38 39 func TestGetTag(t *testing.T) { 40 s := &TestStruct{42} 41 newPtr, _ := Tag(unsafe.Pointer(s), 3) 42 s = (*TestStruct)(newPtr) 43 44 if tag := GetTag(unsafe.Pointer(s)); tag != 3 { 45 t.Fatalf("got wrong pointer. expected: %d, got: %d", 3, tag) 46 } 47 } 48 49 func TestCompareAndSwap(t *testing.T) { 50 s := &TestStruct{42} 51 casPtr := unsafe.Pointer(s) 52 initialPtr := unsafe.Pointer(s) 53 54 if _ = CompareAndSwap(&casPtr, casPtr, casPtr, 0, 1); casPtr != unsafe.Pointer(uintptr(initialPtr)|1) { 55 t.Fatal("wrong cas") 56 } 57 } 58 59 func TestGet(t *testing.T) { 60 s := &TestStruct{42} 61 initialPtr := unsafe.Pointer(s) 62 newPtr, _ := Tag(unsafe.Pointer(s), 3) 63 s = (*TestStruct)(newPtr) 64 65 if ptr, tag := Get(unsafe.Pointer(s)); ptr != initialPtr || tag != 3 { 66 t.Fatalf("wrong get. expected: %p %d, got: %p %d", initialPtr, 3, ptr, tag) 67 } 68 } 69 70 func TestAttempTag(t *testing.T) { 71 s := &TestStruct{42} 72 casPtr := unsafe.Pointer(s) 73 initialPtr := unsafe.Pointer(s) 74 75 if _ = AttemptTag(&casPtr, casPtr, 1); casPtr != unsafe.Pointer(uintptr(initialPtr)|1) { 76 t.Fatal("wrong tag attempt") 77 } 78 }