gitlab.com/SkynetLabs/skyd@v1.6.9/skymodules/renter/contractor/maintenancechecks_test.go (about)

     1  package contractor
     2  
     3  import (
     4  	"io/ioutil"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"gitlab.com/SkynetLabs/skyd/skymodules"
     9  	"go.sia.tech/siad/modules"
    10  	"go.sia.tech/siad/persist"
    11  	"go.sia.tech/siad/types"
    12  )
    13  
    14  // TestUtilityUpdateStatusMerge is a unit test for the utilityUpdateStatus.Merge
    15  // method.
    16  func TestUtilityUpdateStatusMerge(t *testing.T) {
    17  	t.Parallel()
    18  
    19  	// Declare testcases.
    20  	tests := []struct {
    21  		us1    utilityUpdateStatus
    22  		us2    utilityUpdateStatus
    23  		result utilityUpdateStatus
    24  	}{
    25  		{
    26  			us1:    noUpdate,
    27  			us2:    suggestedUtilityUpdate,
    28  			result: suggestedUtilityUpdate,
    29  		},
    30  		{
    31  			us1:    suggestedUtilityUpdate,
    32  			us2:    necessaryUtilityUpdate,
    33  			result: necessaryUtilityUpdate,
    34  		},
    35  		{
    36  			us1:    noUpdate,
    37  			us2:    necessaryUtilityUpdate,
    38  			result: necessaryUtilityUpdate,
    39  		},
    40  		{
    41  			us1:    noUpdate,
    42  			us2:    noUpdate,
    43  			result: noUpdate,
    44  		},
    45  		{
    46  			us1:    suggestedUtilityUpdate,
    47  			us2:    suggestedUtilityUpdate,
    48  			result: suggestedUtilityUpdate,
    49  		},
    50  		{
    51  			us1:    necessaryUtilityUpdate,
    52  			us2:    necessaryUtilityUpdate,
    53  			result: necessaryUtilityUpdate,
    54  		},
    55  	}
    56  
    57  	// Run tests.
    58  	for _, test := range tests {
    59  		us1 := test.us1
    60  		us2 := test.us2
    61  		result := us1.Merge(us2)
    62  		if result != test.result {
    63  			t.Fatal("wrong resulte", result, test.result)
    64  		}
    65  		result = us2.Merge(us1)
    66  		if result != test.result {
    67  			t.Fatal("wrong resulte", result, test.result)
    68  		}
    69  	}
    70  }
    71  
    72  // TestDeadScoreCheck is a unit test for deadScoreCheck.
    73  func TestDeadScoreCheck(t *testing.T) {
    74  	t.Parallel()
    75  
    76  	// create discard logger
    77  	logger, err := persist.NewLogger(ioutil.Discard)
    78  	if err != nil {
    79  		t.Fatal(err)
    80  	}
    81  
    82  	goodUtility := skymodules.ContractUtility{
    83  		GoodForUpload:  true,
    84  		GoodForRefresh: true,
    85  		GoodForRenew:   true,
    86  	}
    87  	badUtility := skymodules.ContractUtility{}
    88  	contract := skymodules.RenterContract{
    89  		Utility: goodUtility,
    90  	}
    91  
    92  	utility, uus := deadScoreCheck(contract, types.NewCurrency64(0), logger)
    93  	if uus != necessaryUtilityUpdate {
    94  		t.Fatal(uus)
    95  	}
    96  	if !reflect.DeepEqual(utility, badUtility) {
    97  		t.Fatal("wrong utility")
    98  	}
    99  	utility, uus = deadScoreCheck(contract, types.NewCurrency64(1), logger)
   100  	if uus != necessaryUtilityUpdate {
   101  		t.Fatal(uus)
   102  	}
   103  	if !reflect.DeepEqual(utility, badUtility) {
   104  		t.Fatal("wrong utility")
   105  	}
   106  	utility, uus = deadScoreCheck(contract, types.NewCurrency64(2), logger)
   107  	if uus != noUpdate {
   108  		t.Fatal(uus)
   109  	}
   110  	if !reflect.DeepEqual(utility, goodUtility) {
   111  		t.Fatal("wrong utility")
   112  	}
   113  }
   114  
   115  // TestStorageGougingCheck is a unit test for storageGougingCheck.
   116  func TestStorageGougingCheck(t *testing.T) {
   117  	t.Parallel()
   118  
   119  	// create discard logger
   120  	logger, err := persist.NewLogger(ioutil.Discard)
   121  	if err != nil {
   122  		t.Fatal(err)
   123  	}
   124  
   125  	allowance := skymodules.DefaultAllowance
   126  	host :=
   127  		skymodules.DecoratedHostDBEntry{
   128  			HostDBEntry: skymodules.HostDBEntry{
   129  				HostExternalSettings: modules.HostExternalSettings{
   130  					StoragePrice: allowance.MaxStoragePrice,
   131  				},
   132  			},
   133  			PriceTable: &modules.RPCPriceTable{},
   134  		}
   135  	goodUtility := skymodules.ContractUtility{
   136  		GoodForUpload:  true,
   137  		GoodForRefresh: true,
   138  		GoodForRenew:   true,
   139  	}
   140  	badUtility := skymodules.ContractUtility{}
   141  	goodContract := skymodules.RenterContract{Utility: goodUtility}
   142  
   143  	// Below max price cases first.
   144  	u, uus := udsGougingCheck(goodContract, allowance, host, 0, goodContract.EndHeight, logger)
   145  	if uus != noUpdate {
   146  		t.Fatal("wrong uus", uus)
   147  	}
   148  	if !reflect.DeepEqual(u, goodUtility) {
   149  		t.Fatal("wrong utility", u, goodUtility)
   150  	}
   151  	u, uus = udsGougingCheck(goodContract, allowance, host, 1, goodContract.EndHeight, logger)
   152  	if uus != noUpdate {
   153  		t.Fatal("wrong uus", uus)
   154  	}
   155  	if !reflect.DeepEqual(u, goodUtility) {
   156  		t.Fatal("wrong utility", u)
   157  	}
   158  
   159  	// Above max price cases.
   160  	host.PriceTable.InitBaseCost = types.SiacoinPrecision
   161  	u, uus = udsGougingCheck(goodContract, allowance, host, 0, goodContract.EndHeight, logger)
   162  	if uus != necessaryUtilityUpdate {
   163  		t.Fatal("wrong uus", uus)
   164  	}
   165  	if !reflect.DeepEqual(u, skymodules.ContractUtility{GoodForRenew: true, GoodForRefresh: true}) {
   166  		t.Fatal("wrong utility", u)
   167  	}
   168  	u, uus = udsGougingCheck(goodContract, allowance, host, 1, goodContract.EndHeight, logger)
   169  	if uus != necessaryUtilityUpdate {
   170  		t.Fatal("wrong uus", uus)
   171  	}
   172  	if !reflect.DeepEqual(u, skymodules.ContractUtility{GoodForRefresh: true}) {
   173  		t.Fatal("wrong utility", u)
   174  	}
   175  	u, uus = udsGougingCheck(goodContract, allowance, host, 1, goodContract.EndHeight+1, logger)
   176  	if uus != necessaryUtilityUpdate {
   177  		t.Fatal("wrong uus", uus)
   178  	}
   179  	if !reflect.DeepEqual(u, badUtility) {
   180  		t.Fatal("wrong utility", u)
   181  	}
   182  }
   183  
   184  // TestUpForRenewalCheck is a unit test for upForRenwalCheck.
   185  func TestUpForRenewalCheck(t *testing.T) {
   186  	t.Parallel()
   187  
   188  	logger, err := persist.NewLogger(ioutil.Discard)
   189  	if err != nil {
   190  		t.Fatal(err)
   191  	}
   192  
   193  	tests := []struct {
   194  		renewWindow types.BlockHeight
   195  		blockHeight types.BlockHeight
   196  		endHeight   types.BlockHeight
   197  
   198  		gfu   bool
   199  		gfRef bool
   200  		gfr   bool
   201  		uus   utilityUpdateStatus
   202  	}{
   203  		// Not renewing.
   204  		{
   205  			blockHeight: 0,
   206  			endHeight:   100,
   207  			renewWindow: 10,
   208  
   209  			gfu:   true,
   210  			gfRef: true,
   211  			gfr:   true,
   212  			uus:   noUpdate,
   213  		},
   214  		// One block before second half of renew window.
   215  		{
   216  			blockHeight: 0,
   217  			endHeight:   11,
   218  			renewWindow: 20,
   219  
   220  			gfu:   true,
   221  			gfRef: true,
   222  			gfr:   true,
   223  			uus:   noUpdate,
   224  		},
   225  		// Beginning of second half.
   226  		{
   227  			blockHeight: 1,
   228  			endHeight:   11,
   229  			renewWindow: 20,
   230  
   231  			gfu:   false,
   232  			gfRef: true,
   233  			gfr:   true,
   234  			uus:   necessaryUtilityUpdate,
   235  		},
   236  		// One block in second half.
   237  		{
   238  			blockHeight: 2,
   239  			endHeight:   11,
   240  			renewWindow: 20,
   241  
   242  			gfu:   false,
   243  			gfRef: true,
   244  			gfr:   true,
   245  			uus:   necessaryUtilityUpdate,
   246  		},
   247  	}
   248  
   249  	for i, test := range tests {
   250  		u, uus := upForRenewalCheck(skymodules.RenterContract{
   251  			EndHeight: test.endHeight,
   252  			Utility: skymodules.ContractUtility{
   253  				GoodForUpload:  true,
   254  				GoodForRefresh: true,
   255  				GoodForRenew:   true,
   256  			},
   257  		}, test.renewWindow, test.blockHeight, logger)
   258  
   259  		if uus != test.uus {
   260  			t.Errorf("%v (update): %v != %v", i, uus, test.uus)
   261  		}
   262  		if u.GoodForRefresh != test.gfRef {
   263  			t.Errorf("%v (gfRef): %v != %v", i, u.GoodForRefresh, test.gfRef)
   264  		}
   265  		if u.GoodForRenew != test.gfr {
   266  			t.Errorf("%v (gfr): %v != %v", i, u.GoodForRenew, test.gfr)
   267  		}
   268  		if u.GoodForUpload != test.gfu {
   269  			t.Errorf("%v (gfu): %v != %v", i, u.GoodForUpload, test.gfu)
   270  		}
   271  	}
   272  }