mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-28 20:45:17 +00:00
refactor: add a single byte array variant of merge, improve tests for merge conflict resolution
This commit is contained in:
parent
a6ebfd61c5
commit
2df2e8c713
@ -135,15 +135,15 @@ class InstrumentedTests {
|
|||||||
assertFalse(newConf.needsDump())
|
assertFalse(newConf.needsDump())
|
||||||
|
|
||||||
|
|
||||||
userProfile.setName("Nibbler")
|
userProfile.setName("Raz")
|
||||||
newConf.setName("Raz")
|
newConf.setName("Nibbler")
|
||||||
newConf.setPic(UserPic("http://new.example.com/pic", "qwertyuio".encodeToByteArray()))
|
newConf.setPic(UserPic("http://new.example.com/pic", "qwertyuio".encodeToByteArray()))
|
||||||
|
|
||||||
val conf = userProfile.push()
|
val conf = userProfile.push()
|
||||||
val conf2 = newConf.push()
|
val conf2 = newConf.push()
|
||||||
|
|
||||||
val dump1 = userProfile.dump()
|
userProfile.dump()
|
||||||
val dump2 = userProfile.dump()
|
userProfile.dump()
|
||||||
|
|
||||||
assertFalse(conf.config.contentEquals(conf2.config))
|
assertFalse(conf.config.contentEquals(conf2.config))
|
||||||
|
|
||||||
@ -154,18 +154,48 @@ class InstrumentedTests {
|
|||||||
assertTrue(userProfile.needsPush())
|
assertTrue(userProfile.needsPush())
|
||||||
|
|
||||||
val newSeq1 = userProfile.push()
|
val newSeq1 = userProfile.push()
|
||||||
val newSeq2 = newConf.push()
|
|
||||||
|
|
||||||
assertEquals(3, newSeq1.seqNo)
|
assertEquals(3, newSeq1.seqNo)
|
||||||
assertEquals(3, newSeq2.seqNo)
|
|
||||||
|
// assume newConf push gets rejected as it was last to write and clear previous config by hash on oxenss
|
||||||
|
newConf.merge(arrayOf(newSeq1.config))
|
||||||
|
|
||||||
|
val newSeqMerge = newConf.push()
|
||||||
|
|
||||||
assertEquals("Nibbler", newConf.getName())
|
assertEquals("Nibbler", newConf.getName())
|
||||||
assertEquals("Nibbler", userProfile.getName())
|
assertEquals(3, newSeqMerge.seqNo)
|
||||||
|
|
||||||
|
// userProfile device polls and merges
|
||||||
|
userProfile.merge(arrayOf(newSeqMerge.config))
|
||||||
|
|
||||||
|
|
||||||
|
val userConfigMerge = userProfile.push()
|
||||||
|
|
||||||
|
assertEquals(3, userConfigMerge.seqNo)
|
||||||
|
|
||||||
|
assertEquals("Raz", newConf.getName())
|
||||||
|
assertEquals("Raz", userProfile.getName())
|
||||||
|
|
||||||
userProfile.free()
|
userProfile.free()
|
||||||
newConf.free()
|
newConf.free()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun merge_resolves_conflicts() {
|
||||||
|
val kp = keyPair
|
||||||
|
val a = UserProfile.newInstance(kp.secretKey)
|
||||||
|
val b = UserProfile.newInstance(kp.secretKey)
|
||||||
|
a.setName("A")
|
||||||
|
val (aPush, aSeq) = a.push()
|
||||||
|
b.setName("B")
|
||||||
|
// polls and sees invalid state, has to merge
|
||||||
|
b.merge(aPush)
|
||||||
|
val (bPush, bSeq) = b.push()
|
||||||
|
assertEquals("B", b.getName())
|
||||||
|
assertEquals(1, aSeq)
|
||||||
|
assertEquals(2, bSeq)
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun jni_setting_getting() {
|
fun jni_setting_getting() {
|
||||||
val userProfile = UserProfile.newInstance(keyPair.secretKey)
|
val userProfile = UserProfile.newInstance(keyPair.secretKey)
|
||||||
|
@ -194,7 +194,7 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_confirmPushed(JNIEnv *en
|
|||||||
}
|
}
|
||||||
extern "C"
|
extern "C"
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT jint JNICALL
|
||||||
Java_network_loki_messenger_libsession_1util_ConfigBase_merge(JNIEnv *env, jobject thiz,
|
Java_network_loki_messenger_libsession_1util_ConfigBase_merge___3_3B(JNIEnv *env, jobject thiz,
|
||||||
jobjectArray to_merge) {
|
jobjectArray to_merge) {
|
||||||
auto conf = ptrToConfigBase(env, thiz);
|
auto conf = ptrToConfigBase(env, thiz);
|
||||||
size_t number = env->GetArrayLength(to_merge);
|
size_t number = env->GetArrayLength(to_merge);
|
||||||
@ -205,4 +205,13 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_merge(JNIEnv *env, jobje
|
|||||||
configs.push_back(bytes);
|
configs.push_back(bytes);
|
||||||
}
|
}
|
||||||
return conf->merge(configs);
|
return conf->merge(configs);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_network_loki_messenger_libsession_1util_ConfigBase_merge___3B(JNIEnv *env, jobject thiz,
|
||||||
|
jbyteArray to_merge) {
|
||||||
|
auto conf = ptrToConfigBase(env, thiz);
|
||||||
|
std::vector<session::ustring> configs = {ustring_from_bytes(env, to_merge)};
|
||||||
|
return conf->merge(configs);
|
||||||
}
|
}
|
@ -18,6 +18,8 @@ sealed class ConfigBase(protected val /* yucky */ pointer: Long) {
|
|||||||
external fun encryptionDomain(): String
|
external fun encryptionDomain(): String
|
||||||
external fun confirmPushed(seqNo: Long)
|
external fun confirmPushed(seqNo: Long)
|
||||||
external fun merge(toMerge: Array<ByteArray>): Int
|
external fun merge(toMerge: Array<ByteArray>): Int
|
||||||
|
// Singular merge
|
||||||
|
external fun merge(toMerge: ByteArray): Int
|
||||||
}
|
}
|
||||||
|
|
||||||
class UserProfile(pointer: Long): ConfigBase(pointer) {
|
class UserProfile(pointer: Long): ConfigBase(pointer) {
|
||||||
|
Loading…
Reference in New Issue
Block a user