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  }