3rd large migration to outbox.
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
package android.util;
|
||||
|
||||
public class Log {
|
||||
public static int d(String tag, String msg) {
|
||||
System.out.println("DEBUG: " + tag + ": " + msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int i(String tag, String msg) {
|
||||
System.out.println("INFO: " + tag + ": " + msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int w(String tag, String msg) {
|
||||
System.out.println("WARN: " + tag + ": " + msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int w(String tag, String msg, Throwable e) {
|
||||
System.out.println("WARN: " + tag + ": " + msg);
|
||||
e.printStackTrace();
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int e(String tag, String msg) {
|
||||
System.out.println("ERROR: " + tag + ": " + msg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int e(String tag, String msg, Throwable e) {
|
||||
System.out.println("ERROR: " + tag + ": " + msg);
|
||||
e.printStackTrace();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@ package com.vitorpamplona.quartz.nip01Core.hints
|
||||
|
||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||
import com.vitorpamplona.quartz.nip01Core.core.toHexKey
|
||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
||||
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
|
||||
import com.vitorpamplona.quartz.utils.RandomInstance
|
||||
import com.vitorpamplona.quartz.utils.usedMemoryMb
|
||||
@@ -62,7 +63,7 @@ class HintIndexerTest {
|
||||
.getResourceAsStream("relayDB.txt")
|
||||
?.readAllBytes()
|
||||
.toString()
|
||||
.split("\n")
|
||||
.split("\n").mapNotNull { RelayUrlNormalizer.normalizeOrNull(it) }
|
||||
|
||||
val indexer by lazy {
|
||||
System.gc()
|
||||
@@ -119,31 +120,31 @@ class HintIndexerTest {
|
||||
@Test
|
||||
fun runProbExistingKeys() =
|
||||
assert99PercentSucess {
|
||||
indexer.getKey(keys.random()).isNotEmpty()
|
||||
indexer.hintsForKey(keys.random()).isNotEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun runProbNewKeys() =
|
||||
assert99PercentSucess {
|
||||
indexer.getKey(RandomInstance.bytes(32)).isEmpty()
|
||||
indexer.hintsForKey(RandomInstance.bytes(32)).isEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun runProbExistingEventIds() =
|
||||
assert99PercentSucess {
|
||||
indexer.getEvent(eventIds.random()).isNotEmpty()
|
||||
indexer.hintsForEvent(eventIds.random()).isNotEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun runProbNewEventIds() =
|
||||
assert99PercentSucess {
|
||||
indexer.getEvent(RandomInstance.bytes(32)).isEmpty()
|
||||
indexer.hintsForEvent(RandomInstance.bytes(32)).isEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun runProbExistingAddresses() =
|
||||
assert99PercentSucess {
|
||||
indexer.getAddress(addresses.random()).isNotEmpty()
|
||||
indexer.hintsForAddress(addresses.random()).isNotEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -156,6 +157,6 @@ class HintIndexerTest {
|
||||
randomChars(10),
|
||||
)
|
||||
|
||||
indexer.getAddress(newAddress).isEmpty()
|
||||
indexer.hintsForAddress(newAddress).isEmpty()
|
||||
}
|
||||
}
|
||||
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright (c) 2025 Vitor Pamplona
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||
* Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
package com.vitorpamplona.quartz.nip01Core.relay
|
||||
|
||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
||||
import junit.framework.TestCase.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
class RelayUrlFormatterTest {
|
||||
@Test
|
||||
fun format() {
|
||||
assertEquals("wss://nostr.mom/", RelayUrlNormalizer.normalizeOrNull("wss://nostr.mom")?.url)
|
||||
assertEquals("wss://nostr.mom/", RelayUrlNormalizer.normalizeOrNull("nostr.mom")?.url)
|
||||
assertEquals("ws://nostr.mom/", RelayUrlNormalizer.normalizeOrNull("ws://nostr.mom")?.url)
|
||||
assertEquals("wss://nostr.mom/", RelayUrlNormalizer.normalizeOrNull("wss://nostr.mom/")?.url)
|
||||
assertEquals("wss://nostr.mom/", RelayUrlNormalizer.normalizeOrNull("https://nostr.mom/")?.url)
|
||||
assertEquals("ws://nostr.mom/", RelayUrlNormalizer.normalizeOrNull("http://nostr.mom/")?.url)
|
||||
|
||||
assertEquals("wss://localhost:3030/", RelayUrlNormalizer.normalizeOrNull("wss://localhost:3030")?.url)
|
||||
assertEquals("ws://localhost:3030/", RelayUrlNormalizer.normalizeOrNull("localhost:3030")?.url)
|
||||
|
||||
assertEquals("wss://a.onion/", RelayUrlNormalizer.normalizeOrNull("wss://a.onion")?.url)
|
||||
assertEquals("ws://a.onion/", RelayUrlNormalizer.normalizeOrNull("a.onion")?.url)
|
||||
assertEquals("wss://a.onion/", RelayUrlNormalizer.normalizeOrNull("wss://a.onion/")?.url)
|
||||
assertEquals("ws://a.onion/", RelayUrlNormalizer.normalizeOrNull("a.onion/")?.url)
|
||||
|
||||
assertEquals("wss://nostr.mom/", RelayUrlNormalizer.normalizeOrNull("wss://nostr.mom")?.url)
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,8 @@
|
||||
*/
|
||||
package com.vitorpamplona.quartz.nip19Bech32
|
||||
|
||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
|
||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
||||
import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag
|
||||
import com.vitorpamplona.quartz.nip19Bech32.bech32.bechToBytes
|
||||
import com.vitorpamplona.quartz.nip19Bech32.entities.NAddress
|
||||
@@ -107,7 +109,7 @@ class NIP19ParserTest {
|
||||
Assert.assertNotNull(actual)
|
||||
Assert.assertTrue(actual?.entity is NProfile)
|
||||
Assert.assertEquals("460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", (actual?.entity as? NProfile)?.hex)
|
||||
Assert.assertEquals("wss://vitor.nostr1.com/", (actual?.entity as? NProfile)?.relay?.first())
|
||||
Assert.assertEquals(NormalizedRelayUrl("wss://vitor.nostr1.com/"), (actual?.entity as? NProfile)?.relay?.first())
|
||||
}
|
||||
|
||||
@Test()
|
||||
@@ -169,7 +171,7 @@ class NIP19ParserTest {
|
||||
"30023:d1e60465c2b777325e9133f2100d2bb31416dca810f54a1d95665621c5dee193:89de7920",
|
||||
(result?.entity as? NAddress)?.aTag(),
|
||||
)
|
||||
assertEquals("wss://relay.damus.io", (result?.entity as? NAddress)?.relay?.get(0))
|
||||
assertEquals(NormalizedRelayUrl("wss://relay.damus.io/"), (result?.entity as? NAddress)?.relay?.get(0))
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -177,7 +179,7 @@ class NIP19ParserTest {
|
||||
val address =
|
||||
ATag.parse(
|
||||
"30023:d1e60465c2b777325e9133f2100d2bb31416dca810f54a1d95665621c5dee193:89de7920",
|
||||
"wss://relay.damus.io",
|
||||
"relay.damus.io",
|
||||
)
|
||||
assertEquals(30023, address?.kind)
|
||||
assertEquals(
|
||||
@@ -185,9 +187,9 @@ class NIP19ParserTest {
|
||||
address?.pubKeyHex,
|
||||
)
|
||||
assertEquals("89de7920", address?.dTag)
|
||||
assertEquals("wss://relay.damus.io", address?.relay)
|
||||
assertEquals("wss://relay.damus.io/", address?.relay?.url)
|
||||
assertEquals(
|
||||
"naddr1qqyrswtyv5mnjv3sqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hsygx3uczxts4hwue9ayfn7ggq62anzstde2qs749pm9tx2csuthhpjvpsgqqqw4rs8pmj38",
|
||||
"naddr1qqyrswtyv5mnjv3sqy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7q3q68nqgewzkamnyh53x0epqrftkv2pdh9gzr6558v4vetzr3w7uxfsxpqqqp65wmpxfdu",
|
||||
address?.toNAddr(),
|
||||
)
|
||||
}
|
||||
@@ -229,10 +231,10 @@ class NIP19ParserTest {
|
||||
30023,
|
||||
"d1e60465c2b777325e9133f2100d2bb31416dca810f54a1d95665621c5dee193",
|
||||
"89de7920",
|
||||
"wss://relay.damus.io",
|
||||
RelayUrlNormalizer.normalizeOrNull("wss://relay.damus.io")!!,
|
||||
)
|
||||
assertEquals(
|
||||
"naddr1qqyrswtyv5mnjv3sqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hsygx3uczxts4hwue9ayfn7ggq62anzstde2qs749pm9tx2csuthhpjvpsgqqqw4rs8pmj38",
|
||||
"naddr1qqyrswtyv5mnjv3sqy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7q3q68nqgewzkamnyh53x0epqrftkv2pdh9gzr6558v4vetzr3w7uxfsxpqqqp65wmpxfdu",
|
||||
address.toNAddr(),
|
||||
)
|
||||
}
|
||||
@@ -298,7 +300,7 @@ class NIP19ParserTest {
|
||||
|
||||
assertNotNull(result)
|
||||
assertEquals("d768c1b28eb94c7d90aa6b9152021fb69c8e34b452f870e2e42341ea7f9796ca", result?.hex)
|
||||
assertEquals("wss://relay.nostr.bg/", result?.relay?.firstOrNull())
|
||||
assertEquals("wss://relay.nostr.bg/", result?.relay?.firstOrNull()?.url)
|
||||
assertEquals("cac0e43235806da094f0787a5b04e29ad04cb1a3c7ea5cf61edc1c338734082b", result?.author)
|
||||
assertEquals(1, result?.kind)
|
||||
}
|
||||
@@ -322,7 +324,7 @@ class NIP19ParserTest {
|
||||
|
||||
assertNotNull(result)
|
||||
assertEquals("9677aa74676757cafad5910f46a1a35f58f7bae253b03eb8ffa70db2fb4643ea", result?.hex)
|
||||
assertEquals("wss://relay.westernbtc.com", result?.relay?.firstOrNull())
|
||||
assertEquals("wss://relay.westernbtc.com/", result?.relay?.firstOrNull()?.url)
|
||||
assertEquals(null, result?.author)
|
||||
assertEquals(null, result?.kind)
|
||||
}
|
||||
@@ -337,7 +339,10 @@ class NIP19ParserTest {
|
||||
|
||||
assertNotNull(result)
|
||||
assertEquals("b60ffa7256d3dd7543d830eb717ae50d05a6c32c5f791ed15b867c2bb0b954ac", result?.hex)
|
||||
assertEquals("wss://nostr.mom", result?.relay?.get(0))
|
||||
assertEquals(
|
||||
NormalizedRelayUrl("wss://nostr.mom/"),
|
||||
result?.relay?.get(0),
|
||||
)
|
||||
assertEquals("f8ff11c7a7d3478355d3b4d174e5a473797a906ea4aa61aa9b6bc0652c1ea17a", result?.author)
|
||||
assertEquals(1, result?.kind)
|
||||
}
|
||||
@@ -352,7 +357,7 @@ class NIP19ParserTest {
|
||||
|
||||
assertNotNull(result)
|
||||
assertEquals("1f878e82063d80f41a781d3a2ef7bc336f1beb7942bf3b49b42aee1251eb5cf0", result?.hex)
|
||||
assertEquals("wss://relay.damus.io", result?.relay?.get(0))
|
||||
assertEquals(NormalizedRelayUrl("wss://relay.damus.io/"), result?.relay?.get(0))
|
||||
assertEquals("460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", result?.author)
|
||||
assertEquals(1, result?.kind)
|
||||
}
|
||||
@@ -362,14 +367,14 @@ class NIP19ParserTest {
|
||||
val result =
|
||||
Nip19Parser
|
||||
.uriToRoute(
|
||||
"nostr:nevent1qqsg6gechd3dhzx38n4z8a2lylzgsmmgeamhmtzz72m9ummsnf0xjfspsdmhxue69uhkummn9ekx7mpvwaehxw309ahx7um5wghx77r5wghxgetk93mhxue69uhhyetvv9ujumn0wd68ytnzvuk8wumn8ghj7mn0wd68ytn9d9h82mny0fmkzmn6d9njuumsv93k2trhwden5te0wfjkccte9ehx7um5wghxyctwvsk8wumn8ghj7un9d3shjtnyv9kh2uewd9hs3kqsdn",
|
||||
"nostr:nevent1qqsg6gechd3dhzx38n4z8a2lylzgsmmgeamhmtzz72m9ummsnf0xjfsppemhxue69uhkummn9ekx7mp0qy2hwumn8ghj7mn0wd68ytn00p68ytnyv4mz7qg4waehxw309aex2mrp0yhxummnw3ezucn89uqjqamnwvaz7tmwdaehgu3wv45kuatwv3a8wctw0f5kwtnnwpskxef0qythwumn8ghj7un9d3shjtnwdaehgu3wvfskuep0qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7dyp4wy",
|
||||
)?.entity as? NEvent
|
||||
|
||||
assertNotNull(result)
|
||||
assertEquals("8d2338bb62db88d13cea23f55f27c4886f68cf777dac42f2b65e6f709a5e6926", result?.hex)
|
||||
assertEquals(
|
||||
"wss://nos.lol,wss://nostr.oxtr.dev,wss://relay.nostr.bg,wss://nostr.einundzwanzig.space,wss://relay.nostr.band,wss://relay.damus.io",
|
||||
result?.relay?.joinToString(","),
|
||||
"wss://nos.lol/,wss://nostr.oxtr.dev/,wss://relay.nostr.bg/,wss://nostr.einundzwanzig.space/,wss://relay.nostr.band/,wss://relay.damus.io/",
|
||||
result?.relay?.joinToString(",") { it.url },
|
||||
)
|
||||
}
|
||||
|
||||
@@ -383,7 +388,7 @@ class NIP19ParserTest {
|
||||
|
||||
assertNotNull(result)
|
||||
assertEquals("4300ec7fa2f98a276f033908349651620aa8e282b76030ab22abca63e85e07e6", result?.hex)
|
||||
assertEquals("wss://relay.damus.io", result?.relay?.get(0))
|
||||
assertEquals("wss://relay.damus.io/", result?.relay?.get(0)?.url)
|
||||
assertEquals("460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c", result?.author)
|
||||
assertEquals(1, result?.kind)
|
||||
}
|
||||
@@ -422,10 +427,10 @@ class NIP19ParserTest {
|
||||
"1f878e82063d80f41a781d3a2ef7bc336f1beb7942bf3b49b42aee1251eb5cf0",
|
||||
"460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c",
|
||||
1,
|
||||
"wss://relay.damus.io",
|
||||
RelayUrlNormalizer.normalizeOrNull("wss://relay.damus.io"),
|
||||
)
|
||||
assertEquals(
|
||||
"nevent1qqsplpuwsgrrmq85rfup6w3w777rxmcmadu590emfx6z4msj2844euqpz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzq3svyhng9ld8sv44950j957j9vchdktj7cxumsep9mvvjthc2pjuqvzqqqqqqye3a70w",
|
||||
"nevent1qqsplpuwsgrrmq85rfup6w3w777rxmcmadu590emfx6z4msj2844euqpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsygzxpsj7dqha57pjk5k37gkn6g4nzakewtmqmnwryyhd3jfwlpgxtspsgqqqqqqsqvc0ku",
|
||||
nevent,
|
||||
)
|
||||
}
|
||||
|
||||
+17
-14
@@ -20,29 +20,32 @@
|
||||
*/
|
||||
package com.vitorpamplona.quartz.nip65RelayList
|
||||
|
||||
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer
|
||||
import junit.framework.TestCase.assertEquals
|
||||
import junit.framework.TestCase.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class RelayListRecommendationProcessorTest {
|
||||
fun norm(str: String) = RelayUrlNormalizer.normalizeOrNull(str)!!
|
||||
|
||||
val userList =
|
||||
mutableMapOf(
|
||||
"User1" to mutableSetOf("wss://relay1.com", "wss://relay2.com", "wss://relay3.com"),
|
||||
"User2" to mutableSetOf("wss://relay4.com", "wss://relay5.com", "wss://relay6.com"),
|
||||
"User3" to mutableSetOf("wss://relay1.com", "wss://relay4.com", "wss://relay6.com"),
|
||||
"User4" to mutableSetOf("wss://relay2.com", "wss://relay1.com", "wss://relay4.com"),
|
||||
"User1" to mutableSetOf(norm("wss://relay1.com"), norm("wss://relay2.com"), norm("wss://relay3.com")),
|
||||
"User2" to mutableSetOf(norm("wss://relay4.com"), norm("wss://relay5.com"), norm("wss://relay6.com")),
|
||||
"User3" to mutableSetOf(norm("wss://relay1.com"), norm("wss://relay4.com"), norm("wss://relay6.com")),
|
||||
"User4" to mutableSetOf(norm("wss://relay2.com"), norm("wss://relay1.com"), norm("wss://relay4.com")),
|
||||
)
|
||||
|
||||
@Test
|
||||
fun testTranspose() {
|
||||
assertEquals(
|
||||
mapOf(
|
||||
"wss://relay1.com" to listOf("User1", "User3", "User4"),
|
||||
"wss://relay2.com" to listOf("User1", "User4"),
|
||||
"wss://relay3.com" to listOf("User1"),
|
||||
"wss://relay4.com" to listOf("User2", "User3", "User4"),
|
||||
"wss://relay5.com" to listOf("User2"),
|
||||
"wss://relay6.com" to listOf("User2", "User3"),
|
||||
norm("wss://relay1.com") to listOf("User1", "User3", "User4"),
|
||||
norm("wss://relay2.com") to listOf("User1", "User4"),
|
||||
norm("wss://relay3.com") to listOf("User1"),
|
||||
norm("wss://relay4.com") to listOf("User2", "User3", "User4"),
|
||||
norm("wss://relay5.com") to listOf("User2"),
|
||||
norm("wss://relay6.com") to listOf("User2", "User3"),
|
||||
).toString(),
|
||||
RelayListRecommendationProcessor.transpose(userList).toString(),
|
||||
)
|
||||
@@ -54,7 +57,7 @@ class RelayListRecommendationProcessorTest {
|
||||
|
||||
val rec1 = recommendations[0]
|
||||
|
||||
assertEquals("wss://relay1.com", rec1.url)
|
||||
assertEquals("wss://relay1.com/", rec1.relay.url)
|
||||
assertEquals(true, rec1.requiredToNotMissEvents)
|
||||
assertTrue("User1" in rec1.users)
|
||||
assertTrue("User2" !in rec1.users)
|
||||
@@ -63,7 +66,7 @@ class RelayListRecommendationProcessorTest {
|
||||
|
||||
val rec2 = recommendations[1]
|
||||
|
||||
assertEquals("wss://relay4.com", rec2.url)
|
||||
assertEquals("wss://relay4.com/", rec2.relay.url)
|
||||
assertEquals(true, rec2.requiredToNotMissEvents)
|
||||
assertTrue("User1" !in rec2.users)
|
||||
assertTrue("User2" in rec2.users)
|
||||
@@ -72,7 +75,7 @@ class RelayListRecommendationProcessorTest {
|
||||
|
||||
val rec3 = recommendations[2]
|
||||
|
||||
assertEquals("wss://relay2.com", rec3.url)
|
||||
assertEquals("wss://relay2.com/", rec3.relay.url)
|
||||
assertEquals(false, rec3.requiredToNotMissEvents)
|
||||
assertTrue("User1" in rec3.users)
|
||||
assertTrue("User2" !in rec3.users)
|
||||
@@ -81,7 +84,7 @@ class RelayListRecommendationProcessorTest {
|
||||
|
||||
val rec4 = recommendations[3]
|
||||
|
||||
assertEquals("wss://relay5.com", rec4.url)
|
||||
assertEquals("wss://relay5.com/", rec4.relay.url)
|
||||
assertEquals(false, rec4.requiredToNotMissEvents)
|
||||
assertTrue("User1" !in rec4.users)
|
||||
assertTrue("User2" in rec4.users)
|
||||
|
||||
Reference in New Issue
Block a user