import pytest
import glsdk
from gltesting.fixtures import *
MNEMONIC = (
"abandon abandon abandon abandon abandon abandon "
"abandon abandon abandon abandon abandon about"
)
class TestConfig:
def test_default_config(self):
config = glsdk.Config()
assert config is not None
assert isinstance(config, glsdk.Config)
def test_config_with_network(self):
config = glsdk.Config().with_network(glsdk.Network.REGTEST)
assert config is not None
assert isinstance(config, glsdk.Config)
def test_config_with_developer_cert(self):
cert = glsdk.DeveloperCert(b"fake-cert", b"fake-key")
config = glsdk.Config().with_developer_cert(cert)
assert config is not None
assert isinstance(config, glsdk.Config)
def test_config_chaining(self):
cert = glsdk.DeveloperCert(b"fake-cert", b"fake-key")
config = (
glsdk.Config()
.with_developer_cert(cert)
.with_network(glsdk.Network.REGTEST)
)
assert config is not None
class TestRegister:
def test_register_returns_node(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node = glsdk.NodeBuilder(config).register(MNEMONIC, None)
assert node is not None
assert isinstance(node, glsdk.Node)
node.disconnect()
def test_register_credentials_roundtrip(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node = glsdk.NodeBuilder(config).register(MNEMONIC, None)
creds = node.credentials()
assert isinstance(creds, bytes)
assert len(creds) > 0
node.disconnect()
def test_register_bad_mnemonic(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
with pytest.raises(glsdk.Error.PhraseCorrupted):
glsdk.NodeBuilder(config).register("not a valid mnemonic", None)
class TestRecover:
def test_recover_after_register(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node1 = glsdk.NodeBuilder(config).register(MNEMONIC, None)
node1.disconnect()
node2 = glsdk.NodeBuilder(config).recover(MNEMONIC)
assert node2 is not None
assert isinstance(node2, glsdk.Node)
creds = node2.credentials()
assert len(creds) > 0
node2.disconnect()
def test_recover_nonexistent_node(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
with pytest.raises(glsdk.Error.NoSuchNode):
glsdk.NodeBuilder(config).recover(MNEMONIC)
class TestConnect:
def test_connect_with_saved_credentials(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node1 = glsdk.NodeBuilder(config).register(MNEMONIC, None)
saved_creds = node1.credentials()
node1.disconnect()
node2 = glsdk.NodeBuilder(config).connect(saved_creds, MNEMONIC)
assert node2 is not None
assert isinstance(node2, glsdk.Node)
node2.disconnect()
def test_connect_bad_mnemonic(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
with pytest.raises(glsdk.Error.PhraseCorrupted):
glsdk.NodeBuilder(config).connect(b"some-creds", "bad mnemonic")
class TestRegisterOrRecover:
def test_registers_when_no_node_exists(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node = glsdk.NodeBuilder(config).register_or_recover(MNEMONIC, None)
assert node is not None
assert isinstance(node, glsdk.Node)
node.disconnect()
def test_recovers_when_node_exists(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node1 = glsdk.NodeBuilder(config).register(MNEMONIC, None)
node1.disconnect()
node2 = glsdk.NodeBuilder(config).register_or_recover(MNEMONIC, None)
assert node2 is not None
assert isinstance(node2, glsdk.Node)
node2.disconnect()
class TestDisconnect:
def test_disconnect_stops_signer(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node = glsdk.NodeBuilder(config).register(MNEMONIC, None)
node.disconnect()
def test_disconnect_idempotent(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node = glsdk.NodeBuilder(config).register(MNEMONIC, None)
node.disconnect()
node.disconnect()
class TestDuplicateRegister:
def test_duplicate_register(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node1 = glsdk.NodeBuilder(config).register(MNEMONIC, None)
node1.disconnect()
with pytest.raises(glsdk.Error.DuplicateNode):
glsdk.NodeBuilder(config).register(MNEMONIC, None)
class TestConnectBadCredentials:
def test_connect_empty_credentials(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
with pytest.raises(glsdk.Error):
glsdk.NodeBuilder(config).connect(b"", MNEMONIC)
class TestMultipleNodes:
def test_two_nodes_independent(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
mnemonic_2 = (
"zoo zoo zoo zoo zoo zoo "
"zoo zoo zoo zoo zoo wrong"
)
node1 = glsdk.NodeBuilder(config).register(MNEMONIC, None)
node2 = glsdk.NodeBuilder(config).register(mnemonic_2, None)
assert node1 is not None
assert node2 is not None
assert isinstance(node1, glsdk.Node)
assert isinstance(node2, glsdk.Node)
creds1 = node1.credentials()
creds2 = node2.credentials()
assert creds1 != creds2
node1.disconnect()
node2.disconnect()
class TestDisconnectBlocksRpc:
def test_credentials_still_works_after_disconnect(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node = glsdk.NodeBuilder(config).register(MNEMONIC, None)
node.disconnect()
creds = node.credentials()
assert len(creds) > 0
class TestLowLevelCredentials:
def test_node_new_stores_credentials(self, scheduler, nobody_id):
dev_cert = glsdk.DeveloperCert(nobody_id.cert_chain, nobody_id.private_key)
config = glsdk.Config().with_developer_cert(dev_cert)
node1 = glsdk.NodeBuilder(config).register(MNEMONIC, None)
saved_creds = node1.credentials()
node1.disconnect()
creds_obj = glsdk.Credentials.load(saved_creds)
node2 = glsdk.Node(creds_obj)
roundtripped = node2.credentials()
assert len(roundtripped) > 0