From 4b96d697d4e9b6e66dabe5e66b22e1bdcae12cbb Mon Sep 17 00:00:00 2001
From: Jerry <jerrycgh@gmail.com>
Date: Sun, 5 May 2024 13:03:33 -0700
Subject: [PATCH] Update node version for integration tests

This commit made a few changes:
1. Upgrade cardano-node version to v8.x.x from v1.x.x. This will help with testing when entering Chang hardfork.
2. Upgrade ogmios to 6.x.x because of change 1.
3. Replace built-in ogmios chain context with https://gitlab.com/viperscience/ogmios-python because of change 2.
4. Temporarily disable Kupo in integration test because ogmios-python doesn't support kupo yet.
---
 .../configs/local-alonzo/config.json          |  5 ++-
 .../configs/local-alonzo/conway-genesis.json  | 39 +++++++++++++++++++
 .../configs/local-vasil/config.json           |  5 ++-
 .../configs/local-vasil/conway-genesis.json   | 39 +++++++++++++++++++
 integration-test/docker-compose.yml           |  6 +--
 integration-test/run_tests.sh                 |  1 +
 integration-test/test/base.py                 |  7 ++--
 integration-test/test/test_cardano_cli.py     |  9 +++--
 integration-test/test/test_ogmios.py          |  3 +-
 integration-test/test/test_plutus.py          |  8 ++--
 pycardano/backend/cardano_cli.py              |  5 +++
 11 files changed, 108 insertions(+), 19 deletions(-)
 create mode 100644 integration-test/configs/local-alonzo/conway-genesis.json
 create mode 100644 integration-test/configs/local-vasil/conway-genesis.json

diff --git a/integration-test/configs/local-alonzo/config.json b/integration-test/configs/local-alonzo/config.json
index 8765d084..d04ca2fa 100644
--- a/integration-test/configs/local-alonzo/config.json
+++ b/integration-test/configs/local-alonzo/config.json
@@ -2,6 +2,7 @@
   "ByronGenesisFile": "byron-genesis.json",
   "ShelleyGenesisFile": "shelley-genesis.json",
   "AlonzoGenesisFile": "alonzo-genesis.json",
+  "ConwayGenesisFile": "conway-genesis.json",
   "SocketPath": "db/node.socket",
   "MaxConcurrencyBulkSync": 1,
   "MaxConcurrencyDeadline": 2,
@@ -99,6 +100,6 @@
   "TestAllegraHardForkAtEpoch": 0,
   "TestMaryHardForkAtEpoch": 0,
   "TestAlonzoHardForkAtEpoch": 0,
-  "TestEnableDevelopmentHardForkEras": true,
-  "TestEnableDevelopmentNetworkProtocols": true
+  "EnableDevelopmentHardForkEras": true,
+  "ExperimentalProtocolsEnabled": true
 }
\ No newline at end of file
diff --git a/integration-test/configs/local-alonzo/conway-genesis.json b/integration-test/configs/local-alonzo/conway-genesis.json
new file mode 100644
index 00000000..a60a4717
--- /dev/null
+++ b/integration-test/configs/local-alonzo/conway-genesis.json
@@ -0,0 +1,39 @@
+{
+  "poolVotingThresholds": {
+    "committeeNormal": 0.51,
+    "committeeNoConfidence": 0.51,
+    "hardForkInitiation": 0.51,
+    "motionNoConfidence": 0.51,
+    "ppSecurityGroup": 0.51
+  },
+  "dRepVotingThresholds": {
+    "motionNoConfidence": 0.51,
+    "committeeNormal": 0.51,
+    "committeeNoConfidence": 0.51,
+    "updateToConstitution": 0.51,
+    "hardForkInitiation": 0.51,
+    "ppNetworkGroup": 0.51,
+    "ppEconomicGroup": 0.51,
+    "ppTechnicalGroup": 0.51,
+    "ppGovGroup": 0.51,
+    "treasuryWithdrawal": 0.51
+  },
+  "committeeMinSize": 0,
+  "committeeMaxTermLength": 200,
+  "govActionLifetime": 10,
+  "govActionDeposit": 1000000000,
+  "dRepDeposit": 2000000,
+  "dRepActivity": 20,
+  "constitution": {
+    "anchor": {
+      "url": "",
+      "dataHash": "0000000000000000000000000000000000000000000000000000000000000000"
+    }
+  },
+  "committee": {
+    "members": {
+
+    },
+    "quorum": 0
+  }
+}
\ No newline at end of file
diff --git a/integration-test/configs/local-vasil/config.json b/integration-test/configs/local-vasil/config.json
index 2e26169e..4f42458d 100644
--- a/integration-test/configs/local-vasil/config.json
+++ b/integration-test/configs/local-vasil/config.json
@@ -2,6 +2,7 @@
   "ByronGenesisFile": "byron-genesis.json",
   "ShelleyGenesisFile": "shelley-genesis.json",
   "AlonzoGenesisFile": "alonzo-genesis.json",
+  "ConwayGenesisFile": "conway-genesis.json",
   "SocketPath": "db/node.socket",
   "MaxConcurrencyBulkSync": 1,
   "MaxConcurrencyDeadline": 2,
@@ -100,6 +101,6 @@
   "TestMaryHardForkAtEpoch": 0,
   "TestAlonzoHardForkAtEpoch": 0,
   "TestBabbageHardForkAtEpoch": 10,
-  "TestEnableDevelopmentHardForkEras": true,
-  "TestEnableDevelopmentNetworkProtocols": true
+  "EnableDevelopmentHardForkEras": true,
+  "ExperimentalProtocolsEnabled": true
 }
\ No newline at end of file
diff --git a/integration-test/configs/local-vasil/conway-genesis.json b/integration-test/configs/local-vasil/conway-genesis.json
new file mode 100644
index 00000000..a60a4717
--- /dev/null
+++ b/integration-test/configs/local-vasil/conway-genesis.json
@@ -0,0 +1,39 @@
+{
+  "poolVotingThresholds": {
+    "committeeNormal": 0.51,
+    "committeeNoConfidence": 0.51,
+    "hardForkInitiation": 0.51,
+    "motionNoConfidence": 0.51,
+    "ppSecurityGroup": 0.51
+  },
+  "dRepVotingThresholds": {
+    "motionNoConfidence": 0.51,
+    "committeeNormal": 0.51,
+    "committeeNoConfidence": 0.51,
+    "updateToConstitution": 0.51,
+    "hardForkInitiation": 0.51,
+    "ppNetworkGroup": 0.51,
+    "ppEconomicGroup": 0.51,
+    "ppTechnicalGroup": 0.51,
+    "ppGovGroup": 0.51,
+    "treasuryWithdrawal": 0.51
+  },
+  "committeeMinSize": 0,
+  "committeeMaxTermLength": 200,
+  "govActionLifetime": 10,
+  "govActionDeposit": 1000000000,
+  "dRepDeposit": 2000000,
+  "dRepActivity": 20,
+  "constitution": {
+    "anchor": {
+      "url": "",
+      "dataHash": "0000000000000000000000000000000000000000000000000000000000000000"
+    }
+  },
+  "committee": {
+    "members": {
+
+    },
+    "quorum": 0
+  }
+}
\ No newline at end of file
diff --git a/integration-test/docker-compose.yml b/integration-test/docker-compose.yml
index ccdd13ee..58d45fa2 100644
--- a/integration-test/docker-compose.yml
+++ b/integration-test/docker-compose.yml
@@ -9,7 +9,7 @@ networks:
 services:
 
   cardano-node:
-    image: inputoutput/cardano-node:${CARDANO_NODE_VERSION:-1.35.7}
+    image: ghcr.io/intersectmbo/cardano-node:${CARDANO_NODE_VERSION:-8.9.2}
     entrypoint: bash
     environment:
       NETWORK: "${NETWORK:-local-alonzo}"
@@ -34,7 +34,7 @@ services:
         max-file: "10"
 
   cardano-pool:
-    image: inputoutput/cardano-node:${CARDANO_NODE_VERSION:-1.35.7}
+    image: ghcr.io/intersectmbo/cardano-node:${CARDANO_NODE_VERSION:-8.9.2}
     entrypoint: bash
     environment:
       NETWORK: "${NETWORK:-local-alonzo}"
@@ -54,7 +54,7 @@ services:
         max-file: "10"
 
   ogmios:
-    image: cardanosolutions/ogmios:v5.6.0-mainnet
+    image: cardanosolutions/ogmios:v6.2.0
     environment:
       NETWORK: "${NETWORK:-local-alonzo}"
 
diff --git a/integration-test/run_tests.sh b/integration-test/run_tests.sh
index f9c728aa..45670042 100755
--- a/integration-test/run_tests.sh
+++ b/integration-test/run_tests.sh
@@ -6,6 +6,7 @@ set -o pipefail
 ROOT=$(pwd)
 
 poetry install
+poetry run pip install ogmios
 
 ##########
 # Alonzo #
diff --git a/integration-test/test/base.py b/integration-test/test/base.py
index 005c2e8d..eba1ee55 100644
--- a/integration-test/test/base.py
+++ b/integration-test/test/base.py
@@ -7,6 +7,8 @@
 
 from pycardano import *
 
+from ogmios import OgmiosChainContext
+
 TEST_RETRIES = 6
 
 
@@ -19,11 +21,10 @@ class TestBase:
     # Define chain context
     NETWORK = Network.TESTNET
 
-    OGMIOS_WS = "ws://localhost:1337"
-
+    # TODO: Bring back kupo test
     KUPO_URL = "http://localhost:1442"
 
-    chain_context = OgmiosChainContext(OGMIOS_WS, Network.TESTNET, kupo_url=KUPO_URL)
+    chain_context = OgmiosChainContext(host="localhost", port=1337, network=Network.TESTNET)
 
     check_chain_context(chain_context)
 
diff --git a/integration-test/test/test_cardano_cli.py b/integration-test/test/test_cardano_cli.py
index b3e82fbe..1469d308 100644
--- a/integration-test/test/test_cardano_cli.py
+++ b/integration-test/test/test_cardano_cli.py
@@ -1,5 +1,6 @@
 import os
 from pathlib import Path
+from retry import retry
 
 from pycardano import (
     CardanoCliChainContext,
@@ -10,6 +11,8 @@
 )
 from pycardano.backend.cardano_cli import DockerConfig
 
+from .base import TEST_RETRIES
+
 
 class TestCardanoCli:
     network_env = os.getenv("NETWORK", "local-alonzo")
@@ -30,6 +33,7 @@ class TestCardanoCli:
         network_magic_number=int(network_magic),
     )
 
+    @retry(tries=TEST_RETRIES, backoff=1.5, delay=6, jitter=(0, 4))
     def test_protocol_param(self):
         protocol_param = self.chain_context.protocol_param
 
@@ -37,9 +41,8 @@ def test_protocol_param(self):
         assert isinstance(protocol_param, ProtocolParameters)
 
         cost_models = protocol_param.cost_models
-        for _, cost_model in cost_models.items():
-            assert "addInteger-cpu-arguments-intercept" in cost_model
-            assert "addInteger-cpu-arguments-slope" in cost_model
+        for cost_model in cost_models.items():
+            assert len(cost_model) > 0
 
     def test_genesis_param(self):
         genesis_param = self.chain_context.genesis_param
diff --git a/integration-test/test/test_ogmios.py b/integration-test/test/test_ogmios.py
index 75f82ba0..603f3cc4 100644
--- a/integration-test/test/test_ogmios.py
+++ b/integration-test/test/test_ogmios.py
@@ -10,5 +10,4 @@ def test_protocol_param_cost_models(self):
 
         cost_models = protocol_param.cost_models
         for _, cost_model in cost_models.items():
-            assert "addInteger-cpu-arguments-intercept" in cost_model
-            assert "addInteger-cpu-arguments-slope" in cost_model
+            assert len(cost_model) > 0
diff --git a/integration-test/test/test_plutus.py b/integration-test/test/test_plutus.py
index e33ea198..93acf491 100644
--- a/integration-test/test/test_plutus.py
+++ b/integration-test/test/test_plutus.py
@@ -370,10 +370,10 @@ def test_get_plutus_script(self):
         assert utxos[0].output.script == forty_two_script
 
 
-class TestPlutusOgmiosOnly(TestPlutus):
-    @classmethod
-    def setup_class(cls):
-        cls.chain_context._kupo_url = None
+# class TestPlutusOgmiosOnly(TestPlutus):
+#     @classmethod
+#     def setup_class(cls):
+#         cls.chain_context._kupo_url = None
 
 
 def evaluate_tx(tx: Transaction) -> Dict[str, ExecutionUnits]:
diff --git a/pycardano/backend/cardano_cli.py b/pycardano/backend/cardano_cli.py
index 5215adcc..3d2aa609 100644
--- a/pycardano/backend/cardano_cli.py
+++ b/pycardano/backend/cardano_cli.py
@@ -258,6 +258,11 @@ def _parse_cost_models(cli_result: JsonDict) -> Dict[str, Dict[str, int]]:
         elif "PlutusV2" in cli_cost_models:
             cost_models["PlutusV2"] = cli_cost_models["PlutusV2"].copy()
 
+        # After 8.x.x, cardano-cli returns cost models as a list
+        for m in cost_models:
+            if isinstance(cost_models[m], list):
+                cost_models[m] = {i: v for i, v in enumerate(cost_models[m])}
+
         return cost_models
 
     def _is_chain_tip_updated(self):