repo_description: Talos Linux is a modern Linux distribution built for Kubernetes.
repo_topics: cloud-native containerd go grpc kubernetes kubernetes-distribution linux linux-distribution musl
code: // This Source Code Form is subject to the terms of the Mozilla Public
  // License, v. 2.0. If a copy of the MPL was not distributed with this
  // file, You can obtain one at http://mozilla.org/MPL/2.0/.
  
  package bytesize_test
  
  import (
  	"testing"
  
  	"github.com/stretchr/testify/assert"
  
  	"github.com/siderolabs/talos/pkg/bytesize"
  )
  
  func TestBytesizeNoDefaultUnit(t *testing.T) {
  	t.Run("empty input", func(t *testing.T) {
  		bs := bytesize.New()
  		assert.NoError(t, bs.Set(""))
  
  		assert.EqualValues(t, 0, bs.Bytes())
  		assert.Equal(t, "0", bs.String())
  
  		assert.NoError(t, bs.Set("0"))
  		assert.EqualValues(t, 0, bs.Bytes())
  		assert.Equal(t, "0", bs.String())
  	})
  
  	t.Run("no unit specified", func(t *testing.T) {
  		bs := bytesize.New()
  		assert.ErrorContains(t, bs.Set("10"), "no unit specified")
  	})
  
  	t.Run("explicit unit provided", func(t *testing.T) {
  		bs := bytesize.New()
  		assert.NoError(t, bs.Set("0.5mb"))
  		assert.Equal(t, "0.5mb", bs.String())
  		assert.Equal(t, uint64(500000), bs.Bytes())
  	})
  }
  
  func TestBytesizeWithDefaultUnit(t *testing.T) {
  	t.Run("empty input", func(t *testing.T) {
  		bs := bytesize.WithDefaultUnit("mb")
  		assert.NoError(t, bs.Set(""))
  
  		assert.EqualValues(t, 0, bs.Bytes())
  		assert.Equal(t, "0", bs.String())
  
  		assert.NoError(t, bs.Set("0"))
  		assert.EqualValues(t, 0, bs.Bytes())
  		assert.Equal(t, "0", bs.String())
  	})
  
  	t.Run("no unit specified", func(t *testing.T) {
  		bs := bytesize.WithDefaultUnit("mb")
  		assert.NoError(t, bs.Set("10"))
  
  		assert.Equal(t, "10mb", bs.String())
  		assert.EqualValues(t, 10*1000*1000, bs.Bytes())
  	})
  
  	t.Run("explicit unit provided", func(t *testing.T) {
  		bs := bytesize.WithDefaultUnit("mb")
  		assert.NoError(t, bs.Set("0.5gb"))
  
  		assert.Equal(t, "0.5gb", bs.String())
  		assert.EqualValues(t, 500000000, bs.Bytes())
  	})
  }
  
  func TestByteSizeUnits(t *testing.T) {
  	bs := bytesize.New()
  	assert.NoError(t, bs.Set("3000000000b"))
  
  	assert.EqualValues(t, 3000, bs.Megabytes())
  	assert.EqualValues(t, 3, bs.Gigabytes())
  
  	assert.EqualValues(t, 2861, bs.Mebibytetes()) // 3,000,000,000 / 1024^2 = 2861 MiB
  	assert.EqualValues(t, 2, bs.Gibibytes())      // 3,000,000,000 / 1024^3 = 2 GiB
  }
  