Skip to content

Commit c26ee7b

Browse files
committed
Some De-Smurfing
1 parent bbda03b commit c26ee7b

22 files changed

+379
-63
lines changed

build.gradle

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ buildscript {
44
mavenCentral()
55
}
66
dependencies {
7-
classpath 'com.android.tools.build:gradle:8.7.2'
7+
classpath 'com.android.tools.build:gradle:8.7.3'
88
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.24"
99
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
1010
classpath("de.mannodermaus.gradle.plugins:android-junit5:1.11.0.0")
@@ -15,6 +15,10 @@ buildscript {
1515
}
1616
}
1717

18+
plugins {
19+
id 'org.jetbrains.kotlin.plugin.serialization' version '1.7.10' apply false
20+
}
21+
1822
allprojects {
1923
repositories {
2024
google()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import network.xyo.client.account.Account
2+
import network.xyo.client.account.Wallet
3+
import network.xyo.client.account.model.AccountInstance
4+
import org.junit.jupiter.api.BeforeEach
5+
import org.junit.jupiter.api.Test
6+
import org.junit.jupiter.api.Assertions.*
7+
8+
@OptIn(ExperimentalStdlibApi::class)
9+
class BoundWitnessBuilderTest {
10+
11+
@BeforeEach
12+
fun setUp() {
13+
// Ensure previousHash = null for test accounts
14+
Account.previousHashStore = MemoryPreviousHashStore()
15+
}
16+
17+
@Test
18+
fun build_returns_expected_hash() {
19+
for (testCase in boundWitnessSequenceTestCases) {
20+
// Create accounts
21+
val signers = mutableListOf<AccountInstance>()
22+
for ((i, mnemonic) in testCase.mnemonics.withIndex()) {
23+
val path = testCase.paths[i]
24+
val account = try {
25+
Wallet.fromMnemonic(mnemonic, path)
26+
} catch (e: Exception) {
27+
null
28+
}
29+
if (account != null) {
30+
signers.add(account)
31+
} else {
32+
fail("Error creating account from mnemonic")
33+
}
34+
}
35+
36+
assertEquals(
37+
testCase.addresses.size,
38+
signers.size,
39+
"Incorrect number of accounts created."
40+
)
41+
42+
val expectedAddresses = testCase.addresses.map { it.lowercase() }
43+
val actualAddresses = signers.map { it.address.toHexString().lowercase() }
44+
assertEquals(
45+
expectedAddresses,
46+
actualAddresses,
47+
"Incorrect addresses when creating accounts."
48+
)
49+
50+
/*
51+
// Ensure correct initial account state
52+
for ((i, expectedPreviousHash) in testCase.previousHashes.withIndex()) {
53+
val signer = signers.getOrNull(i)
54+
assertNotNull(signer, "Signer at index $i should not be null.")
55+
assertEquals(
56+
expectedPreviousHash,
57+
signer.previousHash,
58+
"Incorrect previous hash for account at index $i"
59+
)
60+
}
61+
62+
// Build the Bound Witness (BW)
63+
val bw = BoundWitnessBuilder()
64+
.signers(signers)
65+
.payloads(testCase.payloads)
66+
67+
val (bwJson, _) = bw.build()
68+
val hash = PayloadBuilder.dataHash(bwJson.typedPayload)
69+
val rootHash = PayloadBuilder.hash(bwJson.typedPayload)
70+
71+
// Ensure the BW is correct
72+
assertEquals(
73+
testCase.dataHash,
74+
hash.toHex(),
75+
"Incorrect data hash in BW"
76+
)
77+
78+
for ((i, expectedPayloadHash) in testCase.payloadHashes.withIndex()) {
79+
val actualPayloadHash = bwJson.typedPayload.payload_hashes.getOrNull(i)
80+
assertNotNull(actualPayloadHash, "Payload hash at index $i should not be null.")
81+
assertEquals(
82+
expectedPayloadHash,
83+
actualPayloadHash,
84+
"Incorrect payload hash in BW at index $i"
85+
)
86+
}
87+
88+
for ((i, payload) in testCase.payloads.withIndex()) {
89+
val actualSchema = bwJson.typedPayload.payload_schemas.getOrNull(i)
90+
assertNotNull(actualSchema, "Payload schema at index $i should not be null.")
91+
assertEquals(
92+
payload.schema,
93+
actualSchema,
94+
"Incorrect payload schema in BW at index $i"
95+
)
96+
}
97+
98+
// Ensure correct ending account state
99+
for (signer in signers) {
100+
assertEquals(
101+
hash.toHex(),
102+
signer.previousHash,
103+
"Incorrect previous hash for account ${signer.address}"
104+
)
105+
}
106+
107+
*/
108+
}
109+
}
110+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import network.xyo.client.payload.Payload
2+
3+
class IdPayload(val salt: String): Payload {
4+
constructor(salt: UInt) : this("${salt}")
5+
override var schema = "network.xyo.id"
6+
}
7+
8+
data class BoundWitnessSequenceTestCase(
9+
val mnemonics: List<String>,
10+
val paths: List<String>,
11+
val addresses: List<String>,
12+
val payloads: List<Payload>,
13+
val payloadHashes: List<String>,
14+
val previousHashes: List<String?>,
15+
val dataHash: String
16+
)
17+
18+
// Define the PayloadsWithHashes data class
19+
data class PayloadsWithHashes(
20+
val payloads: List<Payload>,
21+
val payloadHashes: List<String>
22+
)
23+
24+
// Initialize payload sequences
25+
val payloadSequences: List<PayloadsWithHashes> = listOf(
26+
PayloadsWithHashes(
27+
payloads = listOf(IdPayload(0u)),
28+
payloadHashes = listOf(
29+
"ada56ff753c0c9b2ce5e1f823eda9ac53501db2843d8883d6cf6869c18ef7f65"
30+
)
31+
),
32+
PayloadsWithHashes(
33+
payloads = listOf(IdPayload(1u)),
34+
payloadHashes = listOf(
35+
"3a3b8deca568ff820b0b7c8714fbdf82b40fb54f4b15aca8745e06b81291558e"
36+
)
37+
),
38+
PayloadsWithHashes(
39+
payloads = listOf(IdPayload(2u), IdPayload(3u)),
40+
payloadHashes = listOf(
41+
"1a40207fab71fc184e88557d5bee6196cbbb49f11f73cda85000555a628a8f0a",
42+
"c4bce9b4d3239fcc9a248251d1bef1ba7677e3c0c2c43ce909a6668885b519e6"
43+
)
44+
),
45+
PayloadsWithHashes(
46+
payloads = listOf(IdPayload(4u), IdPayload(5u)),
47+
payloadHashes = listOf(
48+
"59c0374dd801ae64ddddba27320ca028d7bd4b3d460f6674c7da1b4aa9c956d6",
49+
"5d9b8e84bc824280fcbb6290904c2edbb401d626ad9789717c0a23d1cab937b0"
50+
)
51+
)
52+
)
53+
54+
// Define wallet mnemonics, paths, and addresses
55+
const val wallet1Mnemonic =
56+
"report door cry include salad horn recipe luxury access pledge husband maple busy double olive"
57+
const val wallet1Path = "m/44'/60'/0'/0/0"
58+
const val wallet1Address = "25524Ca99764D76CA27604Bb9727f6e2f27C4533"
59+
60+
const val wallet2Mnemonic =
61+
"turn you orphan sauce act patient village entire lava transfer height sense enroll quit idle"
62+
const val wallet2Path = "m/44'/60'/0'/0/0"
63+
const val wallet2Address = "FdCeD2c3549289049BeBf743fB721Df211633fBF"
64+
65+
// Initialize BoundWitnessSequenceTestCase instances
66+
val boundWitnessSequenceTestCase1 = BoundWitnessSequenceTestCase(
67+
mnemonics = listOf(wallet1Mnemonic),
68+
paths = listOf(wallet1Path),
69+
addresses = listOf(wallet1Address),
70+
payloads = payloadSequences[0].payloads,
71+
payloadHashes = payloadSequences[0].payloadHashes,
72+
previousHashes = listOf(null),
73+
dataHash = "750113b9826ba94b622667b06cd8467f1330837581c28907c16160fec20d0a4b"
74+
)
75+
76+
val boundWitnessSequenceTestCase2 = BoundWitnessSequenceTestCase(
77+
mnemonics = listOf(wallet2Mnemonic),
78+
paths = listOf(wallet2Path),
79+
addresses = listOf(wallet2Address),
80+
payloads = payloadSequences[1].payloads,
81+
payloadHashes = payloadSequences[1].payloadHashes,
82+
previousHashes = listOf(null),
83+
dataHash = "bacd010d79126a154339e59c11c5b46be032c3bef65626f83bcafe968dc6dd1b"
84+
)
85+
86+
val boundWitnessSequenceTestCase3 = BoundWitnessSequenceTestCase(
87+
mnemonics = listOf(wallet1Mnemonic, wallet2Mnemonic),
88+
paths = listOf(wallet1Path, wallet2Path),
89+
addresses = listOf(wallet1Address, wallet2Address),
90+
payloads = payloadSequences[2].payloads,
91+
payloadHashes = payloadSequences[2].payloadHashes,
92+
previousHashes = listOf(
93+
"750113b9826ba94b622667b06cd8467f1330837581c28907c16160fec20d0a4b",
94+
"bacd010d79126a154339e59c11c5b46be032c3bef65626f83bcafe968dc6dd1b"
95+
),
96+
dataHash = "73245ef73517913f4b57c12d56d81199968ecd8fbefea9ddc474f43dd6cfa8c8"
97+
)
98+
99+
val boundWitnessSequenceTestCase4 = BoundWitnessSequenceTestCase(
100+
mnemonics = listOf(wallet1Mnemonic, wallet2Mnemonic),
101+
paths = listOf(wallet1Path, wallet2Path),
102+
addresses = listOf(wallet1Address, wallet2Address),
103+
payloads = payloadSequences[3].payloads,
104+
payloadHashes = payloadSequences[3].payloadHashes,
105+
previousHashes = listOf(
106+
"73245ef73517913f4b57c12d56d81199968ecd8fbefea9ddc474f43dd6cfa8c8",
107+
"73245ef73517913f4b57c12d56d81199968ecd8fbefea9ddc474f43dd6cfa8c8"
108+
),
109+
dataHash = "210d86ea43d82b85a49b77959a8ee4e6016ff7036254cfa39953befc66073010"
110+
)
111+
112+
// Aggregate all test cases into a list
113+
val boundWitnessSequenceTestCases = listOf(
114+
boundWitnessSequenceTestCase1,
115+
boundWitnessSequenceTestCase2,
116+
boundWitnessSequenceTestCase3,
117+
boundWitnessSequenceTestCase4
118+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import network.xyo.client.payload.Payload
2+
3+
class TestPayload1SubObject {
4+
var number_value = 2
5+
var string_value = "yo"
6+
}
7+
8+
class TestPayload1: Payload {
9+
override var schema ="network.xyo.test"
10+
var timestamp = 1_618_603_439_107
11+
var number_field = 1
12+
var object_field = TestPayload1SubObject()
13+
var string_field = "there"
14+
}
15+
16+
val testPayload1 = TestPayload1()
17+
val testPayload1Hash: String = "c915c56dd93b5e0db509d1a63ca540cfb211e11f03039b05e19712267bb8b6db"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import network.xyo.client.payload.Payload
2+
3+
class TestPayload2SubObject {
4+
var number_value = 2
5+
var string_value = "yo"
6+
var optional_field: String? = null
7+
}
8+
9+
class TestPayload2: Payload {
10+
override var schema ="network.xyo.test"
11+
var timestamp = 1_618_603_439_107
12+
var object_field = TestPayload2SubObject()
13+
var string_field = "there"
14+
var number_field = 1
15+
}
16+
17+
val testPayload2 = TestPayload2()
18+
val testPayload2Hash: String = "c915c56dd93b5e0db509d1a63ca540cfb211e11f03039b05e19712267bb8b6db"

sdk/src/androidTest/java/network/xyo/client/boundwitness/XyoBoundWitnessTest.kt

+7-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import network.xyo.client.account.Account
1010
import network.xyo.client.archivist.wrapper.ArchivistWrapper
1111
import network.xyo.client.node.client.DiscoverPayload
1212
import network.xyo.client.datastore.previous_hash_store.PreviousHashStorePrefsRepository
13-
import network.xyo.client.lib.XyoSerializable
13+
import network.xyo.client.lib.JsonSerializable
1414
import network.xyo.client.node.client.NodeClient
1515
import network.xyo.client.payload.XyoPayload
1616
import org.json.JSONObject
@@ -75,7 +75,7 @@ class XyoBoundWitnessTest {
7575
@Test
7676
fun testBoundWitnessMeta() {
7777
runBlocking {
78-
val bw = XyoBoundWitnessBuilder(appContext).signer(Account.random()).payloads(listOf(
78+
val bw = BoundWitnessBuilder().signer(Account.random()).payloads(listOf(
7979
TestPayload1()
8080
)).build()
8181
assert(bw.dataHash() == bw.getBodyJson().dataHash())
@@ -87,10 +87,10 @@ class XyoBoundWitnessTest {
8787
@Test
8888
fun testBoundWitnessMetaSerialization() {
8989
runBlocking {
90-
val bw = XyoBoundWitnessBuilder(appContext).signer(Account.random()).payloads(listOf(
90+
val bw = BoundWitnessBuilder().signer(Account.random()).payloads(listOf(
9191
TestPayload1()
9292
)).build()
93-
val serializedBw = XyoSerializable.toJson(bw)
93+
val serializedBw = JsonSerializable.toJson(bw)
9494
val bwJson = JSONObject(serializedBw)
9595
val meta = bwJson.get("\$meta") as JSONObject
9696
assert(meta.get("client") == "android")
@@ -102,10 +102,10 @@ class XyoBoundWitnessTest {
102102
fun testBoundWitnessPreviousHash() {
103103
runBlocking {
104104
val testAccount = Account.random()
105-
val bw = XyoBoundWitnessBuilder(appContext).signer(testAccount).payloads(listOf(
105+
val bw = BoundWitnessBuilder().signer(testAccount).payloads(listOf(
106106
TestPayload1()
107107
)).build()
108-
val bw2 = XyoBoundWitnessBuilder(appContext).signer(testAccount).payloads(listOf(
108+
val bw2 = BoundWitnessBuilder().signer(testAccount).payloads(listOf(
109109
TestPayload1()
110110
)).build()
111111
assert(bw2.previous_hashes.first() == bw.dataHash())
@@ -118,7 +118,7 @@ class XyoBoundWitnessTest {
118118
val client = ArchivistWrapper(NodeClient("$apiDomainBeta/Archivist", null, appContext))
119119
val testAccount = Account.random()
120120
val testPayload = TestPayload1()
121-
val bw = XyoBoundWitnessBuilder(appContext).signer(testAccount).payloads(listOf(testPayload)).build()
121+
val bw = BoundWitnessBuilder().signer(testAccount).payloads(listOf(testPayload)).build()
122122
client.insert(listOf(bw, testPayload))
123123

124124
val bwHash = bw.dataHash()

sdk/src/androidTest/java/network/xyo/client/payload/XyoPayloadTest.kt

+7-7
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import kotlinx.coroutines.launch
99
import network.xyo.client.lib.BasicPayload
1010
import network.xyo.client.lib.TestConstants
1111
import network.xyo.client.account.Account
12-
import network.xyo.client.boundwitness.XyoBoundWitnessBuilder
13-
import network.xyo.client.lib.XyoSerializable
12+
import network.xyo.client.boundwitness.BoundWitnessBuilder
13+
import network.xyo.client.lib.JsonSerializable
1414
import network.xyo.client.witness.XyoWitness
1515
import org.junit.Before
1616
import org.junit.Rule
@@ -80,12 +80,12 @@ class XyoPayloadTest {
8080
@Test
8181
fun testRoundTripPayload() {
8282
val payload = TestPayload1()
83-
val payloadJsonString = XyoSerializable.toJson(payload)
83+
val payloadJsonString = JsonSerializable.toJson(payload)
8484

8585
// ensure the schema is properly serialized from the base class
8686
assert(payloadJsonString.contains("network.xyo.test"))
8787

88-
val payloadMirrored = XyoSerializable.fromJson(payloadJsonString, TestPayload1())
88+
val payloadMirrored = JsonSerializable.fromJson(payloadJsonString, TestPayload1())
8989
assertNotNull(payloadMirrored)
9090
if (payloadMirrored != null) {
9191
assertEquals(payload.schema, payloadMirrored.schema)
@@ -103,12 +103,12 @@ class XyoPayloadTest {
103103
CoroutineScope(Dispatchers.Main).launch {
104104
val response = arrayListOf(witness.observe(appContext))
105105
val payloads = response.mapNotNull { payload -> payload }.flatten()
106-
val bwJson = XyoBoundWitnessBuilder(appContext)
106+
val bwJson = BoundWitnessBuilder()
107107
.payloads(payloads)
108108
.signer(Account.random())
109109
.build()
110-
val bwJsonString = XyoSerializable.toJson(bwJson)
111-
val bwMirrored = XyoSerializable.fromJson(bwJsonString, bwJson)
110+
val bwJsonString = JsonSerializable.toJson(bwJson)
111+
val bwMirrored = JsonSerializable.fromJson(bwJsonString, bwJson)
112112
assertNotNull(bwMirrored)
113113
}
114114
}

0 commit comments

Comments
 (0)