github.com/cloudberrydb/gpbackup@v1.0.3-0.20240118031043-5410fd45eed6/utils/progress_bar_test.go (about)

     1  package utils_test
     2  
     3  import (
     4  	"io"
     5  	"os"
     6  	"os/user"
     7  	"time"
     8  
     9  	"github.com/cloudberrydb/gp-common-go-libs/gplog"
    10  	"github.com/cloudberrydb/gp-common-go-libs/operating"
    11  	"github.com/cloudberrydb/gp-common-go-libs/testhelper"
    12  	"github.com/cloudberrydb/gpbackup/utils"
    13  	"gopkg.in/cheggaaa/pb.v1"
    14  
    15  	. "github.com/onsi/ginkgo/v2"
    16  	. "github.com/onsi/gomega"
    17  )
    18  
    19  var _ = Describe("utils/log tests", func() {
    20  	var (
    21  		fakeInfo os.FileInfo
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		err := operating.System.MkdirAll("/tmp/log_dir", 0755)
    26  		Expect(err).ToNot(HaveOccurred())
    27  		fakeInfo, err = os.Stat("/tmp/log_dir")
    28  		Expect(err).ToNot(HaveOccurred())
    29  
    30  		operating.System.OpenFileWrite = func(name string, flag int, perm os.FileMode) (io.WriteCloser, error) { return buffer, nil }
    31  		operating.System.CurrentUser = func() (*user.User, error) { return &user.User{Username: "testUser", HomeDir: "testDir"}, nil }
    32  		operating.System.Getpid = func() int { return 0 }
    33  		operating.System.Hostname = func() (string, error) { return "testHost", nil }
    34  		operating.System.IsNotExist = func(err error) bool { return false }
    35  		operating.System.Now = func() time.Time { return time.Date(2017, time.January, 1, 1, 1, 1, 1, time.Local) }
    36  		operating.System.Stat = func(name string) (os.FileInfo, error) { return fakeInfo, nil }
    37  	})
    38  	AfterEach(func() {
    39  		operating.System = operating.InitializeSystemFunctions()
    40  	})
    41  
    42  	Describe("NewProgressBar", func() {
    43  		Context("PB_NONE", func() {
    44  			It("will not print when passed a none value", func() {
    45  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_NONE)
    46  				infoPb, ok := progressBar.(*pb.ProgressBar)
    47  				Expect(ok).To(BeTrue())
    48  				Expect(infoPb.NotPrint).To(Equal(true))
    49  			})
    50  		})
    51  		Context("PB_INFO", func() {
    52  			It("will create a pb.ProgressBar when passed an info value", func() {
    53  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_INFO)
    54  				_, ok := progressBar.(*pb.ProgressBar)
    55  				Expect(ok).To(BeTrue())
    56  			})
    57  			It("will not print with verbosity LOGERROR", func() {
    58  				gplog.SetVerbosity(gplog.LOGERROR)
    59  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_INFO)
    60  				infoPb, _ := progressBar.(*pb.ProgressBar)
    61  				Expect(infoPb.NotPrint).To(Equal(true))
    62  			})
    63  			It("will print with verbosity LOGINFO", func() {
    64  				gplog.SetVerbosity(gplog.LOGINFO)
    65  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_INFO)
    66  				infoPb, _ := progressBar.(*pb.ProgressBar)
    67  				Expect(infoPb.NotPrint).To(Equal(false))
    68  			})
    69  			It("will not print with verbosity LOGVERBOSE", func() {
    70  				gplog.SetVerbosity(gplog.LOGVERBOSE)
    71  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_INFO)
    72  				infoPb, _ := progressBar.(*pb.ProgressBar)
    73  				Expect(infoPb.NotPrint).To(Equal(true))
    74  			})
    75  		})
    76  		Context("PB_VERBOSE", func() {
    77  			It("will create a verboseProgressBar when passed a verbose value", func() {
    78  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_VERBOSE)
    79  				_, ok := progressBar.(*utils.VerboseProgressBar)
    80  				Expect(ok).To(BeTrue())
    81  			})
    82  			It("verboseProgressBar's infoPb will not print with verbosity LOGERROR", func() {
    83  				gplog.SetVerbosity(gplog.LOGERROR)
    84  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_VERBOSE)
    85  				vPb, _ := progressBar.(*utils.VerboseProgressBar)
    86  				Expect(vPb.ProgressBar.NotPrint).To(Equal(true))
    87  			})
    88  			It("verboseProgressBar's infoPb will print with verbosity LOGINFO", func() {
    89  				gplog.SetVerbosity(gplog.LOGINFO)
    90  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_VERBOSE)
    91  				vPb, _ := progressBar.(*utils.VerboseProgressBar)
    92  				Expect(vPb.ProgressBar.NotPrint).To(Equal(false))
    93  			})
    94  			It("verboseProgressBar's infoPb will not print with verbosity LOGVERBOSE", func() {
    95  				gplog.SetVerbosity(gplog.LOGVERBOSE)
    96  				progressBar := utils.NewProgressBar(10, "test progress bar", utils.PB_VERBOSE)
    97  				vPb, _ := progressBar.(*utils.VerboseProgressBar)
    98  				Expect(vPb.ProgressBar.NotPrint).To(Equal(true))
    99  			})
   100  		})
   101  	})
   102  	Describe("Increment", func() {
   103  		var vPb *utils.VerboseProgressBar
   104  		BeforeEach(func() {
   105  			progressBar := utils.NewProgressBar(10, "test progress bar:", utils.PB_VERBOSE)
   106  			vPb, _ = progressBar.(*utils.VerboseProgressBar)
   107  		})
   108  		It("writes to the log file at 10% increments", func() {
   109  			progressBar := utils.NewProgressBar(10, "test progress bar:", utils.PB_VERBOSE)
   110  			vPb, _ = progressBar.(*utils.VerboseProgressBar)
   111  			vPb.Increment()
   112  			expectedMessage := "test progress bar: 10% (1/10)"
   113  			testhelper.ExpectRegexp(logfile, expectedMessage)
   114  			vPb.Increment()
   115  			expectedMessage = "test progress bar: 20% (2/10)"
   116  			testhelper.ExpectRegexp(logfile, expectedMessage)
   117  		})
   118  		It("only logs when it hits a new % marker", func() {
   119  			progressBar := utils.NewProgressBar(20, "test progress bar:", utils.PB_VERBOSE)
   120  			vPb, _ = progressBar.(*utils.VerboseProgressBar)
   121  
   122  			expectedMessage := "test progress bar: 10% (2/20)"
   123  			vPb.Increment()
   124  			testhelper.NotExpectRegexp(logfile, expectedMessage)
   125  			vPb.Increment()
   126  			testhelper.ExpectRegexp(logfile, expectedMessage)
   127  			expectedMessage = "test progress bar: 20% (4/20)"
   128  			vPb.Increment()
   129  			testhelper.NotExpectRegexp(logfile, expectedMessage)
   130  			vPb.Increment()
   131  			testhelper.ExpectRegexp(logfile, expectedMessage)
   132  		})
   133  		It("writes accurate percentages if < 10 items", func() {
   134  			progressBar := utils.NewProgressBar(5, "test progress bar:", utils.PB_VERBOSE)
   135  			vPb, _ = progressBar.(*utils.VerboseProgressBar)
   136  			vPb.Increment()
   137  			expectedMessage := "test progress bar: 20% (1/5)"
   138  			testhelper.ExpectRegexp(logfile, expectedMessage)
   139  			vPb.Increment()
   140  			expectedMessage = "test progress bar: 40% (2/5)"
   141  			testhelper.ExpectRegexp(logfile, expectedMessage)
   142  		})
   143  		It("does not log if called again after hitting 100%", func() {
   144  			progressBar := utils.NewProgressBar(1, "test progress bar:", utils.PB_VERBOSE)
   145  			vPb, _ = progressBar.(*utils.VerboseProgressBar)
   146  			vPb.Increment()
   147  			expectedMessage := "test progress bar: 100% (1/1)"
   148  			testhelper.ExpectRegexp(logfile, expectedMessage)
   149  			vPb.Increment()
   150  			testhelper.NotExpectRegexp(logfile, expectedMessage)
   151  		})
   152  	})
   153  })