| /* |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.server.appsearch.contactsindexer; |
| |
| import android.net.Uri; |
| |
| import com.android.server.appsearch.contactsindexer.PersonBuilderHelper; |
| import com.android.server.appsearch.contactsindexer.appsearchtypes.ContactPoint; |
| import com.android.server.appsearch.contactsindexer.appsearchtypes.Person; |
| |
| |
| import static com.google.common.truth.Truth.assertThat; |
| |
| import org.junit.Test; |
| |
| import java.util.Arrays; |
| import java.util.List; |
| |
| public class PersonBuilderHelperTest { |
| @Test |
| public void testFingerprintGeneration_creationTimestampAndFingerprintNotIncluded() { |
| long creationTimestamp = 12345L; |
| long creationTimestamp2 = 12346L; |
| String namespace = "namespace"; |
| String id = "id"; |
| String name = "name"; |
| String givenName = "givenName"; |
| String middleName = "middleName"; |
| String lastName = "lastName"; |
| Uri externalUri = Uri.parse("http://external.com"); |
| Uri imageUri = Uri.parse("http://image.com"); |
| byte[] fingerprint = "Hello world!".getBytes(); |
| byte[] fingerprint2 = "Hello world!!!".getBytes(); |
| List<String> additionalNames = Arrays.asList("name1", "name2"); |
| List<String> affiliations = Arrays.asList("Org1", "Org2", "Org3"); |
| List<String> relations = Arrays.asList("relation1", "relation2"); |
| boolean isImportant = true; |
| boolean isBot = true; |
| ContactPoint contact1 = new ContactPoint.Builder(namespace, id + "1", "Home") |
| .addAddress("addr1") |
| .addPhone("phone1") |
| .addEmail("email1") |
| .addAppId("appId1") |
| .build(); |
| ContactPoint contact2 = new ContactPoint.Builder(namespace, id + "2", "Work") |
| .addAddress("addr2") |
| .addPhone("phone2") |
| .addEmail("email2") |
| .addAppId("appId2") |
| .build(); |
| Person.Builder personBuilder = new Person.Builder(namespace, id, name) |
| .setGivenName(givenName) |
| .setMiddleName(middleName) |
| .setFamilyName(lastName) |
| .setExternalUri(externalUri) |
| .setImageUri(imageUri) |
| .addAdditionalName(Person.TYPE_NICKNAME, additionalNames.get(0)) |
| .addAdditionalName(Person.TYPE_PHONETIC_NAME, additionalNames.get(1)) |
| .addAffiliation(affiliations.get(0)) |
| .addAffiliation(affiliations.get(1)) |
| .addAffiliation(affiliations.get(2)) |
| .addRelation(relations.get(0)) |
| .addRelation(relations.get(1)) |
| .setIsImportant(isImportant) |
| .setIsBot(isBot) |
| .setFingerprint(fingerprint) |
| .addContactPoint(contact1) |
| .addContactPoint(contact2); |
| |
| Person person = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis( |
| creationTimestamp).buildPerson(); |
| Person personSame = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis( |
| creationTimestamp).buildPerson(); |
| // same content except for creationTimestamp and fingerprint. |
| Person personWithDifferentTsAndFingerprint = new PersonBuilderHelper(id, |
| personBuilder.setFingerprint( |
| fingerprint2)).setCreationTimestampMillis(creationTimestamp2).buildPerson(); |
| |
| // Fingerprint is not empty. |
| assertThat(person.getFingerprint()).hasLength(16); |
| // Fingerprint would be reset by the generated value |
| assertThat(person.getFingerprint()).isNotEqualTo(fingerprint); |
| assertThat(personWithDifferentTsAndFingerprint.getFingerprint()).isNotEqualTo(fingerprint2); |
| assertThat(person.getFingerprint()).isEqualTo(personSame.getFingerprint()); |
| assertThat(person.getFingerprint()).isEqualTo( |
| personWithDifferentTsAndFingerprint.getFingerprint()); |
| assertThat(person.getCreationTimestampMillis()).isEqualTo(creationTimestamp); |
| assertThat(personSame.getCreationTimestampMillis()).isEqualTo(creationTimestamp); |
| assertThat(personWithDifferentTsAndFingerprint.getCreationTimestampMillis()).isEqualTo( |
| creationTimestamp2); |
| } |
| |
| // Test the fingerprinting function. |
| @Test |
| public void testFingerprintGeneration_forEachPropertyType_string() { |
| long creationTimestamp = 12345L; |
| String namespace = "namespace"; |
| String id = "id"; |
| String name = "name"; |
| String givenName = "givenName"; |
| Uri externalUri = Uri.parse("http://external.com"); |
| Uri externalUriDiff = Uri.parse("http://external2.com"); |
| Person.Builder personBuilder = new Person.Builder(namespace, id, name) |
| .setCreationTimestampMillis(creationTimestamp) |
| .setGivenName(givenName) |
| .setExternalUri(externalUri); |
| |
| Person person = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis( |
| 0).buildPerson(); |
| Person personSame = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis( |
| 0).buildPerson(); |
| Person personNameDiff = new PersonBuilderHelper(id, |
| personBuilder.setGivenName(name + "diff")).setCreationTimestampMillis( |
| 0).buildPerson(); |
| Person personUriDiff = new PersonBuilderHelper(id, |
| personBuilder.setExternalUri(externalUriDiff)).setCreationTimestampMillis( |
| 0).buildPerson(); |
| |
| assertThat(person.getFingerprint()).isEqualTo(personSame.getFingerprint()); |
| assertThat(person.getFingerprint()).isNotEqualTo(personNameDiff.getFingerprint()); |
| assertThat(person.getFingerprint()).isNotEqualTo(personUriDiff.getFingerprint()); |
| } |
| |
| @Test |
| public void testFingerprintGeneration_forEachPropertyType_boolean() { |
| long creationTimestamp = 12345L; |
| String namespace = "namespace"; |
| String id = "id"; |
| String name = "name"; |
| Person.Builder personBuilder = new Person.Builder(namespace, id, name) |
| .setIsBot(true); |
| |
| Person personIsBotTrue = new PersonBuilderHelper(id, |
| personBuilder).setCreationTimestampMillis(creationTimestamp).buildPerson(); |
| Person personIsBotFalse = new PersonBuilderHelper(id, |
| personBuilder.setIsBot(false)).setCreationTimestampMillis( |
| creationTimestamp).buildPerson(); |
| |
| assertThat(personIsBotTrue.getFingerprint()).isNotEqualTo( |
| personIsBotFalse.getFingerprint()); |
| } |
| |
| @Test |
| public void testFingerprintGeneration_forEachPropertyType_stringArray() { |
| String namespace = "namespace"; |
| String id = "id"; |
| String name = "name"; |
| List<String> additionalNames = Arrays.asList("name1", "name2"); |
| List<String> additionalNames2 = Arrays.asList("name1", "name3"); |
| Person.Builder personBuilder = new Person.Builder(namespace, id, name) |
| .addAdditionalName(Person.TYPE_NICKNAME, additionalNames.get(0)) |
| .addAdditionalName(Person.TYPE_PHONETIC_NAME, additionalNames.get(1)); |
| Person.Builder personBuilder2 = new Person.Builder(namespace, id, name) |
| .addAdditionalName(Person.TYPE_NICKNAME, additionalNames2.get(0)) |
| .addAdditionalName(Person.TYPE_PHONETIC_NAME, additionalNames2.get(1)); |
| // one additionalName type is different from personBuilder above. |
| Person.Builder personBuilder3 = new Person.Builder(namespace, id, name) |
| .addAdditionalName(Person.TYPE_UNKNOWN, additionalNames.get(0)) |
| .addAdditionalName(Person.TYPE_PHONETIC_NAME, additionalNames.get(1)); |
| |
| Person person = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis( |
| 0).buildPerson(); |
| Person person2 = new PersonBuilderHelper(id, personBuilder2).setCreationTimestampMillis( |
| 0).buildPerson(); |
| Person person3 = new PersonBuilderHelper(id, personBuilder3).setCreationTimestampMillis( |
| 0).buildPerson(); |
| |
| assertThat(person.getFingerprint()).isNotEqualTo(person2.getFingerprint()); |
| assertThat(person.getFingerprint()).isNotEqualTo(person3.getFingerprint()); |
| } |
| |
| @Test |
| public void testFingerprintGeneration_forEachPropertyType_DocumentArray() { |
| long creationTimestamp = 12345L; |
| String namespace = "namespace"; |
| String id = "id"; |
| String name = "name"; |
| ContactPoint contact1 = new ContactPoint.Builder(namespace, id + "1", "Home") |
| .addAddress("addr1") |
| .addPhone("phone1") |
| .addEmail("email1") |
| .addAppId("appId1") |
| .build(); |
| ContactPoint contact2 = new ContactPoint.Builder(namespace, id + "2", "Work") |
| .addAddress("addr2") |
| .addPhone("phone2") |
| .addEmail("email2") |
| .addAppId("appId2") |
| .build(); |
| ContactPoint contact2diff = new ContactPoint.Builder(namespace, id + "2", "Work") |
| .addAddress("addr2diff") |
| .addPhone("phone2") |
| .addEmail("email2") |
| .addAppId("appId2") |
| .build(); |
| Person.Builder personBuilder = new Person.Builder(namespace, id, name) |
| .setCreationTimestampMillis(creationTimestamp) |
| .addContactPoint(contact1) |
| .addContactPoint(contact2); |
| Person.Builder personBuilder2 = new Person.Builder(namespace, id, name) |
| .setCreationTimestampMillis(creationTimestamp) |
| .addContactPoint(contact1) |
| .addContactPoint(contact2diff); |
| |
| Person person = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis( |
| 0).setCreationTimestampMillis(0).buildPerson(); |
| Person person2 = new PersonBuilderHelper(id, personBuilder2).setCreationTimestampMillis( |
| 0).setCreationTimestampMillis(0).buildPerson(); |
| |
| // Fingerprint would be reset by the generated value |
| assertThat(person.getFingerprint()).isNotEqualTo(person2.getFingerprint()); |
| } |
| |
| @Test |
| public void testFingerprintGeneration_sameValueForDifferentProperties_differentFingerprint() { |
| String namespace = "namespace"; |
| String id = "id"; |
| String name = "same"; |
| Person.Builder personBuilder = new Person.Builder(namespace, id, name).setGivenName(name); |
| Person.Builder personBuilder2 = new Person.Builder(namespace, id, name).setFamilyName(name); |
| |
| Person person = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis( |
| 0).buildPerson(); |
| Person person2 = new PersonBuilderHelper(id, personBuilder2).setCreationTimestampMillis( |
| 0).buildPerson(); |
| |
| assertThat(person.getFingerprint()).isNotEqualTo(person2.getFingerprint()); |
| } |
| |
| @Test |
| public void testScore_setCorrectly() { |
| String namespace = "namespace"; |
| String id = "id"; |
| String name = "name"; |
| List<String> additionalNames = Arrays.asList("name1", "name2"); |
| Person.Builder personBuilder = new Person.Builder(namespace, id, name) |
| .addAdditionalName(Person.TYPE_NICKNAME, additionalNames.get(0)) |
| .addAdditionalName(Person.TYPE_PHONETIC_NAME, additionalNames.get(1)); |
| ContactPoint contact1 = new ContactPoint.Builder(namespace, id + "1", "Home") |
| .addAddress("addr1") |
| .addPhone("phone1") |
| .addEmail("email1") |
| .addAppId("appId1") |
| .build(); |
| ContactPoint contact2 = new ContactPoint.Builder(namespace, id + "2", "Work") |
| .addAddress("addr2") |
| .addPhone("phone2") |
| .addEmail("email2") |
| .addAppId("appId2") |
| .build(); |
| ContactPoint contact3 = new ContactPoint.Builder(namespace, id + "3", "Other") |
| .addAddress("addr3") |
| .addPhone("phone3") |
| .addEmail("email3") |
| .addAppId("appId3") |
| .build(); |
| personBuilder.addContactPoint(contact1) |
| .addContactPoint(contact2) |
| .addContactPoint(contact3); |
| |
| Person person = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis( |
| 0).setCreationTimestampMillis(0).buildPerson(); |
| |
| // Score should be set as base(1) + # of contactPoints + # of additionalNames. |
| assertThat(person.getScore()).isEqualTo(6); |
| } |
| } |