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 }