package de.tum.in.tumcampusapp;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
import de.tum.in.tumcampusapp.auxiliary.ChatMessageValidator;
import de.tum.in.tumcampusapp.models.tumcabe.ChatMessage;
import de.tum.in.tumcampusapp.models.tumcabe.ChatPublicKey;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class ChatMessageValidatorTestCase {
private ChatMessageValidator validator;
private List<ChatPublicKey> publicKeyFixtures;
private List<ChatMessage> messageFixtures;
@Before
public void setUp() {
publicKeyFixtures = new ArrayList<>();
publicKeyFixtures.add(new ChatPublicKey(
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR4+3zbRYVRAecvMcn0vLswZAI1z7JqQ2Q0Mkq\n" +
"ZAy78cE/tja8qcD4DXXiQYCKC8BdI68W+DqYLohPuOs6rTYfD/pLsbPKaJLHEb4dw0Uchq36pb60\n" +
"6G6aCjZrYM0JJYO/pKbwl6ceF6EJRacGswUQ8qY3ZYd6W7R3J7MQxzJ+lQIDAQAB"));
messageFixtures = new ArrayList<>();
messageFixtures.add(buildChatMessage(
"This is a message!",
"MwBZFVhzIGehiGAVaoxp0k04BJN8YyyqlPQg1hXwg1bQxgjtEXz6KsVzYOWo40/TdhcbUHo+hUhk\n" +
"/rLLBrkFldQuNGhd/ltwiMeN2KwdLYm5nl9DWIjPXXviCBogkVtwrBdAhgknr5Kn5Zy4TbGdMr9z\n" +
"d/iOl27L7GYepazgNW8="));
messageFixtures.add(buildChatMessage(
"A message with German characters: öäüßÖÄÜ!",
"qCOAmFho4tKW24qn6vv6j0x4jc3OVKPbVVm7EqYeJKBStGOmEcx6Crtx0MEMFxNe4Zyqo0kYMXNO\n" +
"/NPTvhUJlAr5x6Hlc1iKWBT5eGE8F3mKE8pTSObrCWhEBXylQjkwej5eQpahW+uexZWzeme702V0\n" +
"1C3FoeYUC9rSOfLlyss="));
messageFixtures.add(buildChatMessage(
"This is a Korean message: \uC88B\uC740 \uAC8C\uC784",
"L6DPFzKiVWrO3TeAjJwPNtC4U5D69ODloH3zmCXCpZx+fiZhopzC5cUAeolm2l/++KYZu3vR6IJK\n" +
"HLjXaMd4jDruY8DiWNmCbOnR/ywHQ96sCuMcdfhot5AgM05NbBH7GiAFBDJQzDejuK7M7hGmHZ6s\n" +
"L4WYKETiNiP1Oc6d58w="));
}
/**
* A helper method which builds a {@link List} instance based on the public key fixtures.
*
* @param start The index of the first element to include in the list
* @param end The index after the last element to include in the list
*/
protected List<ChatPublicKey> buildPubkeyList(int start, int end) {
List<ChatPublicKey> list = new ArrayList<>();
for (int i = start; i < end; ++i) {
list.add(publicKeyFixtures.get(i));
}
return list;
}
protected ChatMessage buildChatMessage(String text, String signature) {
ChatMessage message = new ChatMessage(text);
message.setSignature(signature);
return message;
}
/**
* Tests that a valid ASCII-based message is correctly found as valid when
* there is only one public key associated to the validator.
*/
@Test
public void testAsciiValidMessageOneKey() {
validator = new ChatMessageValidator(buildPubkeyList(0, 1));
ChatMessage message = messageFixtures.get(0);
assertTrue(validator.validate(message));
}
/**
* Tests that the validator finds an invalid signature attached to a message.
* The signature is still a valid base64 string.
*/
@Test
public void testAsciiInvalidMessageOneKey() {
validator = new ChatMessageValidator(buildPubkeyList(0, 1));
ChatMessage message = messageFixtures.get(0);
// Take a signature of a different message
message.setSignature(messageFixtures.get(1).getSignature());
assertFalse(validator.validate(message));
}
/**
* Tests that a unicode (european) message is correctly validated.
*/
@Test
public void testUnicodeValidMessageOneKey() {
validator = new ChatMessageValidator(buildPubkeyList(0, 1));
ChatMessage message = messageFixtures.get(1);
assertTrue(validator.validate(message));
}
/**
* Tests that a unicode (korean) message is correctly validated.
*/
@Test
public void testUnicodeKoreanValidMessageOneKey() {
validator = new ChatMessageValidator(buildPubkeyList(0, 1));
ChatMessage message = messageFixtures.get(2);
assertTrue(validator.validate(message));
}
/**
* Tests that when the signature is not a valid base64 string, the validator
* simply says the message is not valid.
*/
@Test
public void testInvalidBase64Signature() {
validator = new ChatMessageValidator(buildPubkeyList(0, 1));
ChatMessage message = buildChatMessage("This is a message!", "This is not valid base64...");
assertFalse(validator.validate(message));
}
/**
* Tests that when the public key associated with the validator is not a valid
* base64 string, the validator simply says the message is not valid.
*/
@Test
public void testInvalidBase64PublicKey() {
List<ChatPublicKey> list = buildPubkeyList(0, 1);
list.get(0).setKey("This is not valid base 64");
validator = new ChatMessageValidator(list);
ChatMessage message = messageFixtures.get(0);
assertFalse(validator.validate(message));
}
/**
* Tests that when the validator does not have any public keys associated to it,
* no message is found valid.
*/
@Test
public void testNoPublicKeys() {
validator = new ChatMessageValidator(new ArrayList<ChatPublicKey>());
for (ChatMessage message : messageFixtures) {
assertFalse(validator.validate(message));
}
}
/**
* Tests that a message is found valid regardless of the fact that there is one invalid
* key in the list of public keys.
*/
@Test
public void testOneInvalidKey() {
List<ChatPublicKey> list = new ArrayList<>();
list.add(new ChatPublicKey("This is not a valid key"));
list.add(publicKeyFixtures.get(0));
validator = new ChatMessageValidator(list);
ChatMessage message = messageFixtures.get(0);
assertTrue(validator.validate(message));
}
}