Switch to API level 27 and updated libraries

This commit is contained in:
2017-10-31 07:50:57 +01:00
parent f58a22dadb
commit 072f732924
68 changed files with 678 additions and 759 deletions

View File

@@ -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)
}

View File

@@ -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"))
}

View File

@@ -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
}
}
}

View File

@@ -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()
}

View File

@@ -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))
}
}

View File

@@ -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)