code.vegaprotocol.io/vega@v0.79.0/datanode/entities/data_source_definition_test.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package entities_test 17 18 import ( 19 "testing" 20 "time" 21 22 dstypes "code.vegaprotocol.io/vega/core/datasource/common" 23 "code.vegaprotocol.io/vega/datanode/entities" 24 "code.vegaprotocol.io/vega/protos/vega" 25 vegapb "code.vegaprotocol.io/vega/protos/vega" 26 datapb "code.vegaprotocol.io/vega/protos/vega/data/v1" 27 v1 "code.vegaprotocol.io/vega/protos/vega/data/v1" 28 29 "github.com/stretchr/testify/assert" 30 "google.golang.org/protobuf/types/known/structpb" 31 ) 32 33 func TestDataSourceDefinitionGetOracle(t *testing.T) { 34 t.Run("nil source definition", func(t *testing.T) { 35 ds := &entities.DataSourceDefinition{} 36 r, err := ds.GetOracle() 37 38 assert.Nil(t, err) 39 assert.IsType(t, r, &entities.DataSourceSpecConfiguration{}) 40 assert.NotNil(t, r) 41 assert.Equal(t, 0, len(r.Signers)) 42 assert.Equal(t, 0, len(r.Filters)) 43 }) 44 45 t.Run("empty source definition", func(t *testing.T) { 46 ds := &entities.DataSourceDefinition{&vega.DataSourceDefinition{}} 47 r, err := ds.GetOracle() 48 49 assert.Nil(t, err) 50 assert.IsType(t, r, &entities.DataSourceSpecConfiguration{}) 51 assert.NotNil(t, r) 52 assert.Equal(t, 0, len(r.Signers)) 53 assert.Equal(t, 0, len(r.Filters)) 54 }) 55 56 t.Run("non-empty external data source definition", func(t *testing.T) { 57 t.Run("data source oracle", func(t *testing.T) { 58 ds := &entities.DataSourceDefinition{ 59 vega.NewDataSourceDefinition( 60 vegapb.DataSourceContentTypeOracle, 61 ).SetOracleConfig( 62 &vega.DataSourceDefinitionExternal_Oracle{ 63 Oracle: &vegapb.DataSourceSpecConfiguration{ 64 Signers: dstypes.SignersIntoProto( 65 []*dstypes.Signer{dstypes.CreateSignerFromString("0xTESTSIGN", dstypes.SignerTypePubKey)}, 66 ), 67 Filters: []*datapb.Filter{ 68 { 69 Key: &datapb.PropertyKey{ 70 Name: "trading.terminated", 71 Type: datapb.PropertyKey_TYPE_BOOLEAN, 72 }, 73 Conditions: []*datapb.Condition{ 74 { 75 Operator: datapb.Condition_OPERATOR_EQUALS, 76 Value: "12", 77 }, 78 }, 79 }, 80 }, 81 }, 82 }, 83 ), 84 } 85 86 r, err := ds.GetOracle() 87 assert.Nil(t, err) 88 assert.IsType(t, r, &entities.DataSourceSpecConfiguration{}) 89 assert.NotNil(t, r) 90 assert.Equal(t, 1, len(r.Signers)) 91 assert.Equal(t, "\x00TESTSIGN", string(r.Signers[0])) 92 93 assert.Equal(t, 1, len(r.Filters)) 94 filters := r.Filters 95 assert.Equal(t, 1, len(filters)) 96 assert.Equal(t, 1, len(filters[0].Conditions)) 97 assert.Equal(t, datapb.Condition_Operator(1), filters[0].Conditions[0].Operator) 98 assert.Equal(t, "12", filters[0].Conditions[0].Value) 99 assert.Equal(t, "trading.terminated", filters[0].Key.Name) 100 assert.Equal(t, datapb.PropertyKey_TYPE_BOOLEAN, filters[0].Key.Type) 101 }) 102 103 t.Run("data source ethereum oracle", func(t *testing.T) { 104 timeNow := uint64(time.Now().UnixNano()) 105 ds := &entities.DataSourceDefinition{ 106 vega.NewDataSourceDefinition( 107 vegapb.DataSourceContentTypeEthOracle, 108 ).SetOracleConfig( 109 &vega.DataSourceDefinitionExternal_EthOracle{ 110 EthOracle: &vegapb.EthCallSpec{ 111 Address: "test-eth-address", 112 Abi: "5", 113 Method: "test-method", 114 Args: []*structpb.Value{ 115 structpb.NewStringValue("test-arg-value"), 116 }, 117 Trigger: &vegapb.EthCallTrigger{ 118 Trigger: &vegapb.EthCallTrigger_TimeTrigger{ 119 TimeTrigger: &vegapb.EthTimeTrigger{ 120 Initial: &timeNow, 121 }, 122 }, 123 }, 124 Filters: []*v1.Filter{ 125 { 126 Key: &v1.PropertyKey{ 127 Name: "test-key", 128 Type: v1.PropertyKey_Type(1), 129 }, 130 Conditions: []*datapb.Condition{ 131 { 132 Operator: datapb.Condition_OPERATOR_EQUALS, 133 Value: "12", 134 }, 135 }, 136 }, 137 }, 138 Normalisers: []*vegapb.Normaliser{ 139 { 140 Name: "test-normaliser-name", 141 Expression: "test-normaliser-expression", 142 }, 143 }, 144 }, 145 }, 146 ), 147 } 148 149 r, err := ds.GetEthOracle() 150 assert.Nil(t, err) 151 assert.IsType(t, r, &entities.EthCallSpec{}) 152 assert.NotNil(t, r) 153 assert.Equal(t, "test-eth-address", r.Address) 154 assert.Equal(t, []byte("5"), r.Abi) 155 assert.Equal(t, "test-method", r.Method) 156 assert.Equal(t, []string{"\"test-arg-value\""}, r.ArgsJson) 157 assert.Equal(t, 1, len(r.Filters)) 158 filters := r.Filters 159 assert.Equal(t, 1, len(filters)) 160 assert.Equal(t, 1, len(filters[0].Conditions)) 161 assert.Equal(t, "test-key", filters[0].Key.Name) 162 assert.Equal(t, 1, len(r.Normalisers)) 163 assert.Equal(t, "test-normaliser-name", r.Normalisers[0].Name) 164 assert.Equal(t, "test-normaliser-expression", r.Normalisers[0].Expression) 165 }) 166 }) 167 168 t.Run("non-empty internal data source definition", func(t *testing.T) { 169 ds := &entities.DataSourceDefinition{ 170 vega.NewDataSourceDefinition( 171 vegapb.DataSourceContentTypeInternalTimeTermination, 172 ).SetTimeTriggerConditionConfig( 173 []*datapb.Condition{ 174 { 175 Operator: datapb.Condition_OPERATOR_GREATER_THAN, 176 Value: "12", 177 }, 178 }, 179 ), 180 } 181 182 r, err := ds.GetOracle() 183 assert.Nil(t, err) 184 assert.IsType(t, r, &entities.DataSourceSpecConfiguration{}) 185 assert.NotNil(t, r) 186 assert.Equal(t, 0, len(r.Signers)) 187 assert.Equal(t, 0, len(r.Filters)) 188 }) 189 } 190 191 func TestDataSourceDefinitionGetInternalTimeTrigger(t *testing.T) { 192 t.Run("nil source definition", func(t *testing.T) { 193 ds := &entities.DataSourceDefinition{} 194 r := ds.GetInternalTimeTrigger() 195 196 assert.IsType(t, r, &entities.DataSourceSpecConfigurationTime{}) 197 assert.NotNil(t, r) 198 assert.Equal(t, 0, len(r.Conditions)) 199 }) 200 201 t.Run("empty source definition", func(t *testing.T) { 202 ds := &entities.DataSourceDefinition{&vega.DataSourceDefinition{}} 203 r := ds.GetInternalTimeTrigger() 204 205 assert.IsType(t, r, &entities.DataSourceSpecConfigurationTime{}) 206 assert.NotNil(t, r) 207 assert.Equal(t, 0, len(r.Conditions)) 208 }) 209 210 t.Run("non-empty external data source definition", func(t *testing.T) { 211 ds := &entities.DataSourceDefinition{ 212 vega.NewDataSourceDefinition( 213 vegapb.DataSourceContentTypeOracle, 214 ).SetOracleConfig( 215 &vega.DataSourceDefinitionExternal_Oracle{ 216 Oracle: &vegapb.DataSourceSpecConfiguration{ 217 Signers: dstypes.SignersIntoProto( 218 []*dstypes.Signer{dstypes.CreateSignerFromString("0xTESTSIGN", dstypes.SignerTypePubKey)}, 219 ), 220 Filters: []*datapb.Filter{ 221 { 222 Key: &datapb.PropertyKey{ 223 Name: "trading.terminated", 224 Type: datapb.PropertyKey_TYPE_BOOLEAN, 225 }, 226 Conditions: []*datapb.Condition{ 227 { 228 Operator: datapb.Condition_OPERATOR_EQUALS, 229 Value: "12", 230 }, 231 }, 232 }, 233 }, 234 }, 235 }, 236 ), 237 } 238 239 r := ds.GetInternalTimeTrigger() 240 assert.IsType(t, r, &entities.DataSourceSpecConfigurationTime{}) 241 assert.NotNil(t, r) 242 243 assert.Equal(t, 0, len(r.Conditions)) 244 }) 245 246 t.Run("non-empry internal data source definition", func(t *testing.T) { 247 ds := &entities.DataSourceDefinition{ 248 vega.NewDataSourceDefinition( 249 vegapb.DataSourceContentTypeInternalTimeTermination, 250 ).SetTimeTriggerConditionConfig( 251 []*datapb.Condition{ 252 { 253 Operator: datapb.Condition_OPERATOR_GREATER_THAN, 254 Value: "12", 255 }, 256 }, 257 ), 258 } 259 260 r := ds.GetInternalTimeTrigger() 261 assert.IsType(t, r, &entities.DataSourceSpecConfigurationTime{}) 262 assert.NotNil(t, r) 263 264 assert.Equal(t, 1, len(r.Conditions)) 265 assert.Equal(t, datapb.Condition_Operator(2), r.Conditions[0].Operator) 266 assert.Equal(t, "12", r.Conditions[0].Value) 267 }) 268 } 269 270 func TestDataSourceDefinitionGetSigners(t *testing.T) { 271 t.Run("nil source definition", func(t *testing.T) { 272 ds := &entities.DataSourceDefinition{} 273 r, err := ds.GetSigners() 274 275 assert.Nil(t, err) 276 assert.IsType(t, r, entities.Signers{}) 277 assert.NotNil(t, r) 278 assert.Equal(t, 0, len(r)) 279 }) 280 281 t.Run("empty source definition", func(t *testing.T) { 282 ds := &entities.DataSourceDefinition{&vega.DataSourceDefinition{}} 283 r, err := ds.GetSigners() 284 285 assert.Nil(t, err) 286 assert.IsType(t, r, entities.Signers{}) 287 assert.NotNil(t, r) 288 assert.Equal(t, 0, len(r)) 289 }) 290 291 t.Run("non-empty external data source definition", func(t *testing.T) { 292 ds := &entities.DataSourceDefinition{ 293 vega.NewDataSourceDefinition( 294 vegapb.DataSourceContentTypeOracle, 295 ).SetOracleConfig( 296 &vega.DataSourceDefinitionExternal_Oracle{ 297 Oracle: &vegapb.DataSourceSpecConfiguration{ 298 Signers: dstypes.SignersIntoProto( 299 []*dstypes.Signer{dstypes.CreateSignerFromString("0xTESTSIGN", dstypes.SignerTypePubKey)}, 300 ), 301 Filters: []*datapb.Filter{ 302 { 303 Key: &datapb.PropertyKey{ 304 Name: "trading.terminated", 305 Type: datapb.PropertyKey_TYPE_BOOLEAN, 306 }, 307 Conditions: []*datapb.Condition{ 308 { 309 Operator: datapb.Condition_OPERATOR_EQUALS, 310 Value: "12", 311 }, 312 }, 313 }, 314 }, 315 }, 316 }, 317 ), 318 } 319 320 r, err := ds.GetSigners() 321 322 assert.Nil(t, err) 323 assert.IsType(t, r, entities.Signers{}) 324 assert.NotNil(t, r) 325 assert.Equal(t, 1, len(r)) 326 assert.Equal(t, "\x00TESTSIGN", string(r[0])) 327 }) 328 329 t.Run("non-empry internal data source definition", func(t *testing.T) { 330 ds := &entities.DataSourceDefinition{ 331 vega.NewDataSourceDefinition( 332 vegapb.DataSourceContentTypeInternalTimeTermination, 333 ).SetTimeTriggerConditionConfig( 334 []*datapb.Condition{ 335 { 336 Operator: datapb.Condition_OPERATOR_GREATER_THAN, 337 Value: "12", 338 }, 339 }, 340 ), 341 } 342 343 r, err := ds.GetSigners() 344 assert.Nil(t, err) 345 assert.IsType(t, r, entities.Signers{}) 346 assert.NotNil(t, r) 347 assert.Equal(t, 0, len(r)) 348 }) 349 } 350 351 func TestDataSourceDefinitionGetFilters(t *testing.T) { 352 t.Run("nil source definition", func(t *testing.T) { 353 ds := &entities.DataSourceDefinition{} 354 r := ds.GetFilters() 355 356 assert.IsType(t, r, []entities.Filter{}) 357 assert.NotNil(t, r) 358 assert.Equal(t, 0, len(r)) 359 }) 360 361 t.Run("empty source definition", func(t *testing.T) { 362 ds := &entities.DataSourceDefinition{&vega.DataSourceDefinition{}} 363 r := ds.GetFilters() 364 365 assert.IsType(t, r, []entities.Filter{}) 366 assert.NotNil(t, r) 367 assert.Equal(t, 0, len(r)) 368 }) 369 370 t.Run("non-empty external data source definition", func(t *testing.T) { 371 ds := &entities.DataSourceDefinition{ 372 vega.NewDataSourceDefinition( 373 vegapb.DataSourceContentTypeOracle, 374 ).SetOracleConfig( 375 &vega.DataSourceDefinitionExternal_Oracle{ 376 Oracle: &vegapb.DataSourceSpecConfiguration{ 377 Signers: dstypes.SignersIntoProto( 378 []*dstypes.Signer{dstypes.CreateSignerFromString("0xTESTSIGN", dstypes.SignerTypePubKey)}, 379 ), 380 Filters: []*datapb.Filter{ 381 { 382 Key: &datapb.PropertyKey{ 383 Name: "trading.terminated", 384 Type: datapb.PropertyKey_TYPE_BOOLEAN, 385 }, 386 Conditions: []*datapb.Condition{ 387 { 388 Operator: datapb.Condition_OPERATOR_EQUALS, 389 Value: "12", 390 }, 391 }, 392 }, 393 }, 394 }, 395 }, 396 ), 397 } 398 399 r := ds.GetFilters() 400 401 assert.IsType(t, r, []entities.Filter{}) 402 assert.NotNil(t, r) 403 assert.Equal(t, 1, len(r)) 404 assert.Equal(t, 1, len(r[0].Conditions)) 405 assert.Equal(t, datapb.Condition_Operator(1), r[0].Conditions[0].Operator) 406 assert.Equal(t, "12", r[0].Conditions[0].Value) 407 assert.Equal(t, "trading.terminated", r[0].Key.Name) 408 assert.Equal(t, datapb.PropertyKey_TYPE_BOOLEAN, r[0].Key.Type) 409 }) 410 411 t.Run("non-empry internal data source definition", func(t *testing.T) { 412 ds := &entities.DataSourceDefinition{ 413 vega.NewDataSourceDefinition( 414 vegapb.DataSourceContentTypeInternalTimeTermination, 415 ).SetTimeTriggerConditionConfig( 416 []*datapb.Condition{ 417 { 418 Operator: datapb.Condition_OPERATOR_GREATER_THAN, 419 Value: "12", 420 }, 421 }, 422 ), 423 } 424 425 r := ds.GetFilters() 426 assert.IsType(t, r, []entities.Filter{}) 427 assert.NotNil(t, r) 428 assert.Equal(t, 0, len(r)) 429 }) 430 } 431 432 func TestDataSourceDefinitionGetConditions(t *testing.T) { 433 t.Run("nil source definition", func(t *testing.T) { 434 ds := &entities.DataSourceDefinition{} 435 r := ds.GetConditions() 436 437 assert.IsType(t, r, []entities.Condition{}) 438 assert.NotNil(t, r) 439 assert.Equal(t, 0, len(r)) 440 }) 441 442 t.Run("empty source definition", func(t *testing.T) { 443 ds := &entities.DataSourceDefinition{&vega.DataSourceDefinition{}} 444 r := ds.GetConditions() 445 446 assert.IsType(t, r, []entities.Condition{}) 447 assert.NotNil(t, r) 448 assert.Equal(t, 0, len(r)) 449 }) 450 451 t.Run("non-empty external data source definition", func(t *testing.T) { 452 ds := &entities.DataSourceDefinition{ 453 vega.NewDataSourceDefinition( 454 vegapb.DataSourceContentTypeOracle, 455 ).SetOracleConfig( 456 &vega.DataSourceDefinitionExternal_Oracle{ 457 Oracle: &vegapb.DataSourceSpecConfiguration{ 458 Signers: dstypes.SignersIntoProto( 459 []*dstypes.Signer{dstypes.CreateSignerFromString("0xTESTSIGN", dstypes.SignerTypePubKey)}, 460 ), 461 Filters: []*datapb.Filter{ 462 { 463 Key: &datapb.PropertyKey{ 464 Name: "trading.terminated", 465 Type: datapb.PropertyKey_TYPE_BOOLEAN, 466 }, 467 Conditions: []*datapb.Condition{ 468 { 469 Operator: datapb.Condition_OPERATOR_EQUALS, 470 Value: "12", 471 }, 472 }, 473 }, 474 }, 475 }, 476 }, 477 ), 478 } 479 480 r := ds.GetConditions() 481 482 assert.IsType(t, r, []entities.Condition{}) 483 assert.NotNil(t, r) 484 assert.Equal(t, 1, len(r)) 485 assert.Equal(t, "12", r[0].Value) 486 assert.Equal(t, datapb.Condition_OPERATOR_EQUALS, r[0].Operator) 487 }) 488 489 t.Run("non-empry internal data source definition", func(t *testing.T) { 490 ds := &entities.DataSourceDefinition{ 491 vega.NewDataSourceDefinition( 492 vegapb.DataSourceContentTypeInternalTimeTermination, 493 ).SetTimeTriggerConditionConfig( 494 []*datapb.Condition{ 495 { 496 Operator: datapb.Condition_OPERATOR_GREATER_THAN, 497 Value: "10", 498 }, 499 }, 500 ), 501 } 502 503 r := ds.GetConditions() 504 assert.IsType(t, r, []entities.Condition{}) 505 assert.NotNil(t, r) 506 assert.Equal(t, 1, len(r)) 507 assert.Equal(t, datapb.Condition_Operator(2), r[0].Operator) 508 assert.Equal(t, "10", r[0].Value) 509 }) 510 } 511 512 func TestDataSourceDefinitionFromProto(t *testing.T) { 513 t.Run("nil source definition", func(t *testing.T) { 514 ds := &entities.DataSourceDefinition{} 515 r := entities.DataSourceDefinitionFromProto(ds.DataSourceDefinition) 516 517 assert.IsType(t, r, entities.DataSourceDefinition{}) 518 assert.NotNil(t, r) 519 assert.Nil(t, r.DataSourceDefinition) 520 }) 521 522 t.Run("empty source definition", func(t *testing.T) { 523 ds := &entities.DataSourceDefinition{&vega.DataSourceDefinition{}} 524 r := entities.DataSourceDefinitionFromProto(ds.DataSourceDefinition) 525 526 assert.IsType(t, r, entities.DataSourceDefinition{}) 527 assert.NotNil(t, r) 528 assert.NotNil(t, r.DataSourceDefinition) 529 assert.IsType(t, r.DataSourceDefinition, &vegapb.DataSourceDefinition{}) 530 }) 531 532 t.Run("non-empty external data source definition", func(t *testing.T) { 533 ds := &entities.DataSourceDefinition{ 534 vega.NewDataSourceDefinition( 535 vegapb.DataSourceContentTypeOracle, 536 ).SetOracleConfig( 537 &vega.DataSourceDefinitionExternal_Oracle{ 538 Oracle: &vegapb.DataSourceSpecConfiguration{ 539 Signers: dstypes.SignersIntoProto( 540 []*dstypes.Signer{dstypes.CreateSignerFromString("0xTESTSIGN", dstypes.SignerTypePubKey)}, 541 ), 542 Filters: []*datapb.Filter{ 543 { 544 Key: &datapb.PropertyKey{ 545 Name: "trading.terminated", 546 Type: datapb.PropertyKey_TYPE_BOOLEAN, 547 }, 548 Conditions: []*datapb.Condition{ 549 { 550 Operator: datapb.Condition_OPERATOR_EQUALS, 551 Value: "12", 552 }, 553 }, 554 }, 555 }, 556 }, 557 }, 558 ), 559 } 560 561 r := entities.DataSourceDefinitionFromProto(ds.DataSourceDefinition) 562 563 assert.IsType(t, r, entities.DataSourceDefinition{}) 564 assert.NotNil(t, r) 565 566 assert.Nil(t, r.DataSourceDefinition.GetInternal()) 567 assert.NotNil(t, r.DataSourceDefinition.GetExternal()) 568 569 o := r.DataSourceDefinition.GetExternal().GetOracle() 570 signers := o.Signers 571 assert.Equal(t, 1, len(signers)) 572 assert.Equal(t, "0xTESTSIGN", signers[0].GetPubKey().Key) 573 574 filters := o.Filters 575 assert.Equal(t, 1, len(filters)) 576 assert.Equal(t, 1, len(filters[0].Conditions)) 577 assert.Equal(t, datapb.Condition_Operator(1), filters[0].Conditions[0].Operator) 578 assert.Equal(t, "12", filters[0].Conditions[0].Value) 579 assert.Equal(t, "trading.terminated", filters[0].Key.Name) 580 assert.Equal(t, datapb.PropertyKey_TYPE_BOOLEAN, filters[0].Key.Type) 581 }) 582 583 t.Run("non-empry internal data source definition", func(t *testing.T) { 584 ds := &entities.DataSourceDefinition{ 585 vega.NewDataSourceDefinition( 586 vegapb.DataSourceContentTypeInternalTimeTermination, 587 ).SetTimeTriggerConditionConfig( 588 []*datapb.Condition{ 589 { 590 Operator: datapb.Condition_OPERATOR_GREATER_THAN, 591 Value: "10", 592 }, 593 }, 594 ), 595 } 596 597 r := entities.DataSourceDefinitionFromProto(ds.DataSourceDefinition) 598 assert.IsType(t, r, entities.DataSourceDefinition{}) 599 assert.NotNil(t, r) 600 601 assert.NotNil(t, r.DataSourceDefinition.GetInternal()) 602 assert.Nil(t, r.DataSourceDefinition.GetExternal()) 603 conditions := r.DataSourceDefinition.GetInternal().GetTime().Conditions 604 assert.Equal(t, 1, len(conditions)) 605 assert.Equal(t, datapb.Condition_OPERATOR_GREATER_THAN, conditions[0].Operator) 606 assert.Equal(t, "10", conditions[0].Value) 607 }) 608 }