github.com/MetalBlockchain/metalgo@v1.11.9/utils/atomic_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package utils 5 6 import ( 7 "encoding/json" 8 "net/netip" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestAtomic(t *testing.T) { 15 require := require.New(t) 16 17 var a Atomic[bool] 18 require.Zero(a.Get()) 19 20 a.Set(false) 21 require.False(a.Get()) 22 23 a.Set(true) 24 require.True(a.Get()) 25 26 a.Set(false) 27 require.False(a.Get()) 28 } 29 30 func TestAtomicJSON(t *testing.T) { 31 tests := []struct { 32 name string 33 value *Atomic[netip.AddrPort] 34 expected string 35 }{ 36 { 37 name: "zero value", 38 value: new(Atomic[netip.AddrPort]), 39 expected: `""`, 40 }, 41 { 42 name: "ipv4 value", 43 value: NewAtomic(netip.AddrPortFrom( 44 netip.AddrFrom4([4]byte{1, 2, 3, 4}), 45 12345, 46 )), 47 expected: `"1.2.3.4:12345"`, 48 }, 49 { 50 name: "ipv6 loopback", 51 value: NewAtomic(netip.AddrPortFrom( 52 netip.IPv6Loopback(), 53 12345, 54 )), 55 expected: `"[::1]:12345"`, 56 }, 57 } 58 for _, test := range tests { 59 t.Run(test.name, func(t *testing.T) { 60 require := require.New(t) 61 62 b, err := json.Marshal(test.value) 63 require.NoError(err) 64 require.Equal(test.expected, string(b)) 65 66 var parsed Atomic[netip.AddrPort] 67 require.NoError(json.Unmarshal([]byte(test.expected), &parsed)) 68 require.Equal(test.value.Get(), parsed.Get()) 69 }) 70 } 71 }