Switch to API level 27 and updated libraries
This commit is contained in:
@@ -32,14 +32,14 @@ import org.robolectric.RuntimeEnvironment
|
||||
import org.robolectric.annotation.Config
|
||||
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
@Config(constants = BuildConfig::class, sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
@Config(sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
class AndroidAddressRepositoryTest : TestBase() {
|
||||
private val CONTACT_A = "BM-2cW7cD5cDQJDNkE7ibmyTxfvGAmnPqa9Vt"
|
||||
private val CONTACT_B = "BM-2cTtkBnb4BUYDndTKun6D9PjtueP2h1bQj"
|
||||
private val CONTACT_C = "BM-2cV5f9EpzaYARxtoruSpa6pDoucSf9ZNke"
|
||||
private val contactA = "BM-2cW7cD5cDQJDNkE7ibmyTxfvGAmnPqa9Vt"
|
||||
private val contactB = "BM-2cTtkBnb4BUYDndTKun6D9PjtueP2h1bQj"
|
||||
private val contactC = "BM-2cV5f9EpzaYARxtoruSpa6pDoucSf9ZNke"
|
||||
|
||||
private lateinit var IDENTITY_A: String
|
||||
private lateinit var IDENTITY_B: String
|
||||
private lateinit var identityA: String
|
||||
private lateinit var identityB: String
|
||||
|
||||
private lateinit var repo: AndroidAddressRepository
|
||||
|
||||
@@ -50,21 +50,23 @@ class AndroidAddressRepositoryTest : TestBase() {
|
||||
|
||||
repo = AndroidAddressRepository(sqlHelper)
|
||||
|
||||
repo.save(BitmessageAddress(CONTACT_A))
|
||||
repo.save(BitmessageAddress(CONTACT_B))
|
||||
repo.save(BitmessageAddress(CONTACT_C))
|
||||
repo.save(BitmessageAddress(contactA))
|
||||
repo.save(BitmessageAddress(contactB))
|
||||
repo.save(BitmessageAddress(contactC))
|
||||
|
||||
val identityA = BitmessageAddress(PrivateKey(false, 1, 1000, 1000, DOES_ACK))
|
||||
repo.save(identityA)
|
||||
IDENTITY_A = identityA.address
|
||||
val identityB = BitmessageAddress(PrivateKey(false, 1, 1000, 1000))
|
||||
repo.save(identityB)
|
||||
IDENTITY_B = identityB.address
|
||||
BitmessageAddress(PrivateKey(false, 1, 1000, 1000, DOES_ACK)).let {
|
||||
repo.save(it)
|
||||
identityA = it.address
|
||||
}
|
||||
BitmessageAddress(PrivateKey(false, 1, 1000, 1000)).let {
|
||||
repo.save(it)
|
||||
identityB = it.address
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ensure contact can be found`() {
|
||||
val address = BitmessageAddress(CONTACT_A)
|
||||
val address = BitmessageAddress(contactA)
|
||||
assertEquals(4, address.version)
|
||||
assertEquals(address, repo.findContact(address.tag!!))
|
||||
assertNull(repo.findIdentity(address.tag!!))
|
||||
@@ -72,7 +74,7 @@ class AndroidAddressRepositoryTest : TestBase() {
|
||||
|
||||
@Test
|
||||
fun `ensure identity can be found`() {
|
||||
val identity = BitmessageAddress(IDENTITY_A)
|
||||
val identity = BitmessageAddress(identityA)
|
||||
assertEquals(4, identity.version)
|
||||
assertNull(repo.findContact(identity.tag!!))
|
||||
|
||||
@@ -131,7 +133,7 @@ class AndroidAddressRepositoryTest : TestBase() {
|
||||
|
||||
@Test
|
||||
fun `ensure existing address is updated`() {
|
||||
var address = repo.getAddress(CONTACT_A)
|
||||
var address = repo.getAddress(contactA)
|
||||
address!!.alias = "Test-Alias"
|
||||
repo.save(address)
|
||||
address = repo.getAddress(address.address)
|
||||
@@ -140,10 +142,10 @@ class AndroidAddressRepositoryTest : TestBase() {
|
||||
|
||||
@Test
|
||||
fun `ensure existing keys are not deleted`() {
|
||||
val address = BitmessageAddress(IDENTITY_A)
|
||||
val address = BitmessageAddress(identityA)
|
||||
address.alias = "Test"
|
||||
repo.save(address)
|
||||
val identityA = repo.getAddress(IDENTITY_A)
|
||||
val identityA = repo.getAddress(identityA)
|
||||
assertNotNull(identityA!!.pubkey)
|
||||
assertNotNull(identityA.privateKey)
|
||||
assertEquals("Test", identityA.alias)
|
||||
@@ -169,14 +171,14 @@ class AndroidAddressRepositoryTest : TestBase() {
|
||||
|
||||
@Test
|
||||
fun `ensure address is removed`() {
|
||||
val address = repo.getAddress(IDENTITY_A)
|
||||
val address = repo.getAddress(identityA)
|
||||
repo.remove(address!!)
|
||||
assertNull(repo.getAddress(IDENTITY_A))
|
||||
assertNull(repo.getAddress(identityA))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ensure address can be retrieved`() {
|
||||
val address = repo.getAddress(IDENTITY_A)
|
||||
val address = repo.getAddress(identityA)
|
||||
assertNotNull(address)
|
||||
assertNotNull(address!!.privateKey)
|
||||
}
|
||||
|
@@ -40,7 +40,7 @@ import org.robolectric.annotation.Config
|
||||
import java.util.*
|
||||
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
@Config(constants = BuildConfig::class, sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
@Config(sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
class AndroidInventoryTest : TestBase() {
|
||||
private lateinit var inventory: Inventory
|
||||
|
||||
@@ -134,14 +134,12 @@ class AndroidInventoryTest : TestBase() {
|
||||
assertNull(inventory.getObject(inventoryVectorIgnore))
|
||||
}
|
||||
|
||||
private fun getObjectMessage(stream: Long, TTL: Long, payload: ObjectPayload): ObjectMessage {
|
||||
return ObjectMessage(
|
||||
nonce = ByteArray(8),
|
||||
expiresTime = now + TTL,
|
||||
stream = stream,
|
||||
payload = payload
|
||||
)
|
||||
}
|
||||
private fun getObjectMessage(stream: Long, TTL: Long, payload: ObjectPayload) = ObjectMessage(
|
||||
nonce = ByteArray(8),
|
||||
expiresTime = now + TTL,
|
||||
stream = stream,
|
||||
payload = payload
|
||||
)
|
||||
|
||||
private val getPubkey: GetPubkey = GetPubkey(BitmessageAddress("BM-2cW7cD5cDQJDNkE7ibmyTxfvGAmnPqa9Vt"))
|
||||
}
|
||||
|
@@ -48,7 +48,7 @@ import org.robolectric.annotation.Config
|
||||
import java.util.*
|
||||
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
@Config(constants = BuildConfig::class, sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
@Config(sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
class AndroidMessageRepositoryTest : TestBase() {
|
||||
private lateinit var contactA: BitmessageAddress
|
||||
private lateinit var contactB: BitmessageAddress
|
||||
@@ -320,26 +320,24 @@ class AndroidMessageRepositoryTest : TestBase() {
|
||||
return repo.getMessage(root.id!!)
|
||||
}
|
||||
|
||||
private fun hasMessage(subject: String?, body: String?): Matcher<Plaintext> {
|
||||
return object : BaseMatcher<Plaintext>() {
|
||||
override fun describeTo(description: Description) {
|
||||
description.appendText("Subject: ").appendText(subject)
|
||||
description.appendText(", ")
|
||||
description.appendText("Body: ").appendText(body)
|
||||
}
|
||||
private fun hasMessage(subject: String?, body: String?) = object : BaseMatcher<Plaintext>() {
|
||||
override fun describeTo(description: Description) {
|
||||
description.appendText("Subject: ").appendText(subject)
|
||||
description.appendText(", ")
|
||||
description.appendText("Body: ").appendText(body)
|
||||
}
|
||||
|
||||
override fun matches(item: Any): Boolean {
|
||||
if (item is Plaintext) {
|
||||
if (subject != null && subject != item.subject) {
|
||||
return false
|
||||
}
|
||||
if (body != null && body != item.text) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
override fun matches(item: Any): Boolean {
|
||||
if (item is Plaintext) {
|
||||
if (subject != null && subject != item.subject) {
|
||||
return false
|
||||
}
|
||||
if (body != null && body != item.text) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -39,7 +39,7 @@ import java.util.*
|
||||
* as the initial nodes' IP addresses are determined by DNS lookup.
|
||||
*/
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
@Config(constants = BuildConfig::class, sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
@Config(sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
class AndroidNodeRegistryTest : TestBase() {
|
||||
private lateinit var registry: NodeRegistry
|
||||
|
||||
@@ -51,17 +51,16 @@ class AndroidNodeRegistryTest : TestBase() {
|
||||
registry = AndroidNodeRegistry(sqlHelper)
|
||||
|
||||
registry.offerAddresses(Arrays.asList(
|
||||
createAddress(1, 8444, 1, now),
|
||||
createAddress(2, 8444, 1, now),
|
||||
createAddress(3, 8444, 1, now),
|
||||
createAddress(4, 8444, 2, now)
|
||||
createAddress(lastByte = 1),
|
||||
createAddress(lastByte = 2),
|
||||
createAddress(lastByte = 3),
|
||||
createAddress(lastByte = 4, stream = 2)
|
||||
))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ensure getKnownNodes() without streams yields empty`() {
|
||||
fun `ensure getKnownNodes() without streams yields empty`() =
|
||||
assertThat(registry.getKnownAddresses(10), empty<NetworkAddress>())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ensure predefined node is returned when database is empty`() {
|
||||
@@ -86,26 +85,25 @@ class AndroidNodeRegistryTest : TestBase() {
|
||||
@Test
|
||||
fun `ensure offered addresses are added`() {
|
||||
registry.offerAddresses(Arrays.asList(
|
||||
createAddress(1, 8444, 1, now),
|
||||
createAddress(10, 8444, 1, now),
|
||||
createAddress(11, 8444, 1, now)
|
||||
createAddress(lastByte = 1),
|
||||
createAddress(lastByte = 10),
|
||||
createAddress(lastByte = 11)
|
||||
))
|
||||
|
||||
var knownAddresses = registry.getKnownAddresses(1000, 1)
|
||||
assertEquals(5, knownAddresses.size.toLong())
|
||||
|
||||
registry.offerAddresses(listOf(createAddress(1, 8445, 1, now)))
|
||||
registry.offerAddresses(listOf(createAddress(lastByte = 1, port = 8445)))
|
||||
|
||||
knownAddresses = registry.getKnownAddresses(1000, 1)
|
||||
assertEquals(6, knownAddresses.size.toLong())
|
||||
}
|
||||
|
||||
private fun createAddress(lastByte: Int, port: Int, stream: Long, time: Long): NetworkAddress {
|
||||
return NetworkAddress.Builder()
|
||||
.ipv6(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, lastByte)
|
||||
.port(port)
|
||||
.stream(stream)
|
||||
.time(time)
|
||||
.build()
|
||||
}
|
||||
private fun createAddress(lastByte: Int, port: Int = 8444, stream: Long = 1, time: Long = now) =
|
||||
NetworkAddress.Builder()
|
||||
.ipv6(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, lastByte)
|
||||
.port(port)
|
||||
.stream(stream)
|
||||
.time(time)
|
||||
.build()
|
||||
}
|
||||
|
@@ -17,7 +17,6 @@
|
||||
package ch.dissem.bitmessage.repository
|
||||
|
||||
import android.os.Build.VERSION_CODES.LOLLIPOP
|
||||
import ch.dissem.apps.abit.BuildConfig
|
||||
import ch.dissem.apps.abit.repository.AndroidAddressRepository
|
||||
import ch.dissem.apps.abit.repository.AndroidMessageRepository
|
||||
import ch.dissem.apps.abit.repository.AndroidProofOfWorkRepository
|
||||
@@ -50,14 +49,14 @@ import kotlin.properties.Delegates
|
||||
* @author Christian Basler
|
||||
*/
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
@Config(constants = BuildConfig::class, sdk = intArrayOf(LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
@Config(sdk = intArrayOf(LOLLIPOP), packageName = "ch.dissem.apps.abit")
|
||||
class AndroidProofOfWorkRepositoryTest : TestBase() {
|
||||
private lateinit var repo: ProofOfWorkRepository
|
||||
private lateinit var addressRepo: AddressRepository
|
||||
private lateinit var messageRepo: MessageRepository
|
||||
|
||||
private var initialHash1: ByteArray by Delegates.notNull<ByteArray>()
|
||||
private var initialHash2: ByteArray by Delegates.notNull<ByteArray>()
|
||||
private var initialHash1: ByteArray by Delegates.notNull()
|
||||
private var initialHash2: ByteArray by Delegates.notNull()
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
@@ -68,15 +67,19 @@ class AndroidProofOfWorkRepositoryTest : TestBase() {
|
||||
messageRepo = AndroidMessageRepository(sqlHelper, RuntimeEnvironment.application)
|
||||
repo = AndroidProofOfWorkRepository(sqlHelper)
|
||||
mockedInternalContext(
|
||||
addressRepository = addressRepo,
|
||||
messageRepository = messageRepo,
|
||||
proofOfWorkRepository = repo,
|
||||
cryptography = cryptography()
|
||||
addressRepository = addressRepo,
|
||||
messageRepository = messageRepo,
|
||||
proofOfWorkRepository = repo,
|
||||
cryptography = cryptography()
|
||||
)
|
||||
|
||||
repo.putObject(ObjectMessage.Builder()
|
||||
.payload(GetPubkey(BitmessageAddress("BM-2DAjcCFrqFrp88FUxExhJ9kPqHdunQmiyn"))).build(),
|
||||
1000, 1000)
|
||||
repo.putObject(
|
||||
objectMessage = ObjectMessage.Builder()
|
||||
.payload(GetPubkey(BitmessageAddress("BM-2DAjcCFrqFrp88FUxExhJ9kPqHdunQmiyn")))
|
||||
.build(),
|
||||
nonceTrialsPerByte = 1000,
|
||||
extraBytes = 1000
|
||||
)
|
||||
initialHash1 = repo.getItems()[0]
|
||||
|
||||
val sender = loadIdentity("BM-2cSqjfJ8xK6UUn5Rw3RpdGQ9RsDkBhWnS8")
|
||||
@@ -84,28 +87,34 @@ class AndroidProofOfWorkRepositoryTest : TestBase() {
|
||||
addressRepo.save(sender)
|
||||
addressRepo.save(recipient)
|
||||
val plaintext = Plaintext.Builder(Plaintext.Type.MSG)
|
||||
.ackData(cryptography().randomBytes(32))
|
||||
.from(sender)
|
||||
.to(recipient)
|
||||
.message("Subject", "Message")
|
||||
.status(Plaintext.Status.DOING_PROOF_OF_WORK)
|
||||
.build()
|
||||
.ackData(cryptography().randomBytes(32))
|
||||
.from(sender)
|
||||
.to(recipient)
|
||||
.message("Subject", "Message")
|
||||
.status(Plaintext.Status.DOING_PROOF_OF_WORK)
|
||||
.build()
|
||||
messageRepo.save(plaintext)
|
||||
initialHash2 = cryptography().getInitialHash(plaintext.ackMessage!!)
|
||||
repo.putObject(ProofOfWorkRepository.Item(
|
||||
plaintext.ackMessage!!,
|
||||
1000, 1000,
|
||||
UnixTime.now + 10 * UnixTime.MINUTE,
|
||||
plaintext
|
||||
))
|
||||
plaintext.ackMessage!!.let { ackMessage ->
|
||||
initialHash2 = cryptography().getInitialHash(ackMessage)
|
||||
repo.putObject(ProofOfWorkRepository.Item(
|
||||
objectMessage = ackMessage,
|
||||
nonceTrialsPerByte = 1000, extraBytes = 1000,
|
||||
expirationTime = UnixTime.now + 10 * UnixTime.MINUTE,
|
||||
message = plaintext
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ensure object is stored`() {
|
||||
val sizeBefore = repo.getItems().size
|
||||
repo.putObject(ObjectMessage.Builder()
|
||||
.payload(GetPubkey(BitmessageAddress("BM-2D9U2hv3YBMHM1zERP32anKfVKohyPN9x2"))).build(),
|
||||
1000, 1000)
|
||||
repo.putObject(
|
||||
objectMessage = ObjectMessage.Builder()
|
||||
.payload(GetPubkey(BitmessageAddress("BM-2D9U2hv3YBMHM1zERP32anKfVKohyPN9x2")))
|
||||
.build(),
|
||||
nonceTrialsPerByte = 1000,
|
||||
extraBytes = 1000
|
||||
)
|
||||
assertThat(repo.getItems().size, `is`(sizeBefore + 1))
|
||||
}
|
||||
|
||||
@@ -117,19 +126,22 @@ class AndroidProofOfWorkRepositoryTest : TestBase() {
|
||||
addressRepo.save(sender)
|
||||
addressRepo.save(recipient)
|
||||
val plaintext = Plaintext.Builder(Plaintext.Type.MSG)
|
||||
.ackData(cryptography().randomBytes(32))
|
||||
.from(sender)
|
||||
.to(recipient)
|
||||
.message("Subject", "Message")
|
||||
.status(Plaintext.Status.DOING_PROOF_OF_WORK)
|
||||
.build()
|
||||
.ackData(cryptography().randomBytes(32))
|
||||
.from(sender)
|
||||
.to(recipient)
|
||||
.message("Subject", "Message")
|
||||
.status(Plaintext.Status.DOING_PROOF_OF_WORK)
|
||||
.build()
|
||||
messageRepo.save(plaintext)
|
||||
repo.putObject(ProofOfWorkRepository.Item(
|
||||
plaintext.ackMessage!!,
|
||||
1000, 1000,
|
||||
UnixTime.now + 10 * UnixTime.MINUTE,
|
||||
plaintext
|
||||
))
|
||||
plaintext.ackMessage!!.let { ackMessage ->
|
||||
repo.putObject(ProofOfWorkRepository.Item(
|
||||
objectMessage = ackMessage,
|
||||
nonceTrialsPerByte = 1000,
|
||||
extraBytes = 1000,
|
||||
expirationTime = UnixTime.now + 10 * UnixTime.MINUTE,
|
||||
message = plaintext
|
||||
))
|
||||
}
|
||||
assertThat(repo.getItems().size, `is`(sizeBefore + 1))
|
||||
}
|
||||
|
||||
@@ -156,7 +168,7 @@ class AndroidProofOfWorkRepositoryTest : TestBase() {
|
||||
}
|
||||
|
||||
@Test(expected = RuntimeException::class)
|
||||
fun `ensure retrieving nonexisting item causes exception`() {
|
||||
fun `ensure retrieving non-existing item causes exception`() {
|
||||
repo.getItem(ByteArray(0))
|
||||
}
|
||||
|
||||
@@ -168,7 +180,7 @@ class AndroidProofOfWorkRepositoryTest : TestBase() {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `ensure deletion of nonexisting item is handled silently`() {
|
||||
fun `ensure deletion of non-existing item is handled silently`() {
|
||||
repo.removeObject(ByteArray(0))
|
||||
}
|
||||
}
|
||||
|
@@ -60,25 +60,23 @@ open class TestBase {
|
||||
port: Int = 0,
|
||||
connectionTTL: Long = 0,
|
||||
connectionLimit: Int = 0
|
||||
): InternalContext {
|
||||
return spy(InternalContext(
|
||||
cryptography,
|
||||
inventory,
|
||||
nodeRegistry,
|
||||
networkHandler,
|
||||
addressRepository,
|
||||
messageRepository,
|
||||
proofOfWorkRepository,
|
||||
proofOfWorkEngine,
|
||||
customCommandHandler,
|
||||
listener,
|
||||
labeler,
|
||||
"/Jabit:TEST/",
|
||||
port,
|
||||
connectionTTL,
|
||||
connectionLimit
|
||||
))
|
||||
}
|
||||
) = spy(InternalContext(
|
||||
cryptography,
|
||||
inventory,
|
||||
nodeRegistry,
|
||||
networkHandler,
|
||||
addressRepository,
|
||||
messageRepository,
|
||||
proofOfWorkRepository,
|
||||
proofOfWorkEngine,
|
||||
customCommandHandler,
|
||||
listener,
|
||||
labeler,
|
||||
"/Jabit:TEST/",
|
||||
port,
|
||||
connectionTTL,
|
||||
connectionLimit
|
||||
))
|
||||
|
||||
fun randomInventoryVector(): InventoryVector {
|
||||
val bytes = ByteArray(32)
|
||||
@@ -86,16 +84,16 @@ open class TestBase {
|
||||
return InventoryVector(bytes)
|
||||
}
|
||||
|
||||
fun getResource(resourceName: String) =
|
||||
private fun getResource(resourceName: String) =
|
||||
TestBase::class.java.classLoader.getResourceAsStream(resourceName)
|
||||
|
||||
fun loadObjectMessage(version: Int, resourceName: String): ObjectMessage {
|
||||
private fun loadObjectMessage(version: Int, resourceName: String): ObjectMessage {
|
||||
val data = getBytes(resourceName)
|
||||
val `in` = ByteArrayInputStream(data)
|
||||
return Factory.getObjectMessage(version, `in`, data.size) ?: throw NoSuchElementException("error loading object message")
|
||||
}
|
||||
|
||||
fun getBytes(resourceName: String): ByteArray {
|
||||
private fun getBytes(resourceName: String): ByteArray {
|
||||
val `in` = getResource(resourceName)
|
||||
val out = ByteArrayOutputStream()
|
||||
val buffer = ByteArray(1024)
|
||||
|
Reference in New Issue
Block a user