/** * JBoss, Home of Professional Open Source * Copyright Red Hat, Inc., and individual contributors. * * 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 org.jboss.aerogear.unifiedpush.jpa; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.PersistenceException; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import net.jakubholy.dbunitexpress.EmbeddedDbTesterRule; import org.jboss.aerogear.unifiedpush.api.AdmVariant; import org.jboss.aerogear.unifiedpush.api.AndroidVariant; import org.jboss.aerogear.unifiedpush.api.Category; import org.jboss.aerogear.unifiedpush.api.Installation; import org.jboss.aerogear.unifiedpush.api.SimplePushVariant; import org.jboss.aerogear.unifiedpush.api.Variant; import org.jboss.aerogear.unifiedpush.api.WindowsMPNSVariant; import org.jboss.aerogear.unifiedpush.api.WindowsWNSVariant; import org.jboss.aerogear.unifiedpush.api.iOSVariant; import org.jboss.aerogear.unifiedpush.dao.PageResult; import org.jboss.aerogear.unifiedpush.dao.ResultStreamException; import org.jboss.aerogear.unifiedpush.dao.ResultsStream; import org.jboss.aerogear.unifiedpush.dto.Count; import org.jboss.aerogear.unifiedpush.jpa.dao.impl.JPAInstallationDao; import org.jboss.aerogear.unifiedpush.utils.DaoDeployment; import org.jboss.aerogear.unifiedpush.utils.TestUtils; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(Arquillian.class) public class InstallationDaoTest { public static final String DEVICE_TOKEN_1 = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; public static final String DEVICE_TOKEN_2 = "67890167890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; public static final String DEVICE_TOKEN_3 = "27890167890:123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; public static final String DEVICE_TOKEN_4 = "12345678901:23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; @Inject private EntityManager entityManager; @Inject private JPAInstallationDao installationDao; private String androidVariantID = "1"; private String simplePushVariantID = "2"; @Deployment public static JavaArchive createDeployment() { return DaoDeployment.createDeployment(); } @Rule public EmbeddedDbTesterRule testDb = new EmbeddedDbTesterRule("Installations.xml"); @Before public void setUp() { entityManager.getTransaction().begin(); } @After public void tearDown() { entityManager.getTransaction().rollback(); } @Test public void countDevicesForLoginName() { assertThat(installationDao.getNumberOfDevicesForLoginName("me")).isEqualTo(9); } @Test public void testTotalNumberOfDevices() { assertThat(installationDao.getTotalNumberOfDevices()).isEqualTo(10); } @Test public void getNumberOfDevicesForVariantID() { assertThat(installationDao.getNumberOfDevicesForVariantID("1")).isEqualTo(6); assertThat(installationDao.getNumberOfDevicesForVariantID("2")).isEqualTo(3); } @Test public void findDeviceTokensForOneInstallationOfOneVariant() { String[] alias = { "foo@bar.org" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, null, Arrays.asList(alias), null); assertThat(tokens).hasSize(4); Installation one = installationDao.findInstallationForVariantByDeviceToken(androidVariantID, DEVICE_TOKEN_1); assertThat(one.getDeviceToken()).isEqualTo(DEVICE_TOKEN_1); final Set<String> tokenz = new HashSet<>(); tokenz.add(DEVICE_TOKEN_1); tokenz.add("foobar223"); List<Installation> list = installationDao.findInstallationsForVariantByDeviceTokens(androidVariantID, tokenz); assertThat(list).hasSize(1); assertThat(list).extracting("deviceToken").containsOnly(DEVICE_TOKEN_1); } @Test public void findDeviceTokensOfVariant() { List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, null, null, null); assertThat(tokens).hasSize(4); assertThat(tokens).containsOnly(DEVICE_TOKEN_1, DEVICE_TOKEN_2, DEVICE_TOKEN_3, DEVICE_TOKEN_4); } @Test public void findOldGCMDeviceTokensOfVariant() { List<String> tokens = findAllOldGCMDeviceTokenForVariantIDByCriteria(androidVariantID, null, null, null); assertThat(tokens).hasSize(2); assertThat(tokens).containsOnly(DEVICE_TOKEN_1, DEVICE_TOKEN_2); } @Test public void findDeviceTokensForAliasOfVariant() { String[] alias = { "foo@bar.org" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, null, Arrays.asList(alias), null); assertThat(tokens).hasSize(4); assertThat(tokens).containsOnly(DEVICE_TOKEN_1, DEVICE_TOKEN_2, DEVICE_TOKEN_3, DEVICE_TOKEN_4); } @Test public void findNoDeviceTokensForAliasOfVariant() { String[] alias = { "bar@foo.org" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, null, Arrays.asList(alias), null); assertThat(tokens).hasSize(0); } @Test public void findDeviceTokensForAliasAndDeviceType() { String[] alias = { "foo@bar.org" }; String[] types = { "Android Tablet" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, null, Arrays.asList(alias), Arrays.asList(types)); assertThat(tokens).hasSize(2); assertThat(tokens).containsOnly(DEVICE_TOKEN_2, DEVICE_TOKEN_3); } @Test public void findNoDeviceTokensForAliasAndUnusedDeviceType() { String[] alias = { "foo@bar.org" }; String[] types = { "Android Clock" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, null, Arrays.asList(alias), Arrays.asList(types)); assertThat(tokens).isEmpty(); } @Test public void findZeroDeviceTokensForAliasAndCategoriesAndDeviceType() { String[] alias = { "foo@bar.org" }; String[] types = { "Android Tablet" }; String[] categories = { "soccer" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, Arrays.asList(categories), Arrays.asList(alias), Arrays .asList(types)); assertThat(tokens).isEmpty(); } @Test public void findOneDeviceTokensForAliasAndCategoriesAndDeviceType() { String[] alias = { "foo@bar.org" }; String[] types = { "Android Phone" }; String[] cats = { "soccer", "news", "weather" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, Arrays.asList(cats), Arrays.asList(alias), Arrays.asList(types)); assertThat(tokens).hasSize(1); assertThat(tokens).containsOnly(DEVICE_TOKEN_1); } @Test public void findTwoDeviceTokensForAliasAndCategories() { String[] alias = { "foo@bar.org" }; String[] cats = { "soccer", "news", "weather" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, Arrays.asList(cats), Arrays.asList(alias), null); assertThat(tokens).hasSize(2); } @Test public void findTwoDeviceTokensCategories() { String[] cats = { "soccer", "news", "weather" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(androidVariantID, Arrays.asList(cats), null, null); assertThat(tokens).hasSize(2); } @Test public void findAndDeleteOneInstallation() { final Set<String> tokenz = new HashSet<>(); tokenz.add(DEVICE_TOKEN_1); tokenz.add("foobar223"); List<Installation> list = installationDao.findInstallationsForVariantByDeviceTokens(androidVariantID, tokenz); assertThat(list).hasSize(1); Installation installation = list.get(0); assertThat(installation.getDeviceToken()).isEqualTo(DEVICE_TOKEN_1); installationDao.delete(installation); list = installationDao.findInstallationsForVariantByDeviceTokens(androidVariantID, tokenz); assertThat(list).isEmpty(); } @Test public void findAndDeleteTwoInstallations() { final Set<String> tokenz = new HashSet<>(); tokenz.add(DEVICE_TOKEN_1); tokenz.add(DEVICE_TOKEN_2); List<Installation> list = installationDao.findInstallationsForVariantByDeviceTokens(androidVariantID, tokenz); assertThat(list).hasSize(2); list.forEach(installation -> { installationDao.delete(installation); }); list = installationDao.findInstallationsForVariantByDeviceTokens(androidVariantID, tokenz); assertThat(list).hasSize(0); } @Test public void deleteNonExistingInstallation() { Installation installation = new Installation(); installation.setId("2345"); installationDao.delete(installation); } @Test public void mergeCategories() { //given final SimplePushVariant variant = new SimplePushVariant(); variant.setName("SimplePush Variant Name"); entityManager.persist(variant); final Installation installation = new Installation(); installation.setDeviceToken("http://test"); installation.setCategories(new HashSet<>(Arrays.asList(new Category("one"), new Category("two")))); final Installation installation2 = new Installation(); installation2.setDeviceToken("http://test2"); installation2.setCategories(new HashSet<>(Arrays.asList(new Category("one"), new Category("three")))); installation.setVariant(variant); installation2.setVariant(variant); //when installationDao.create(installation); //then final List list = entityManager.createQuery("select c from Category c where c.name = 'one'").getResultList(); assertThat(list).hasSize(1); } @Test public void findPushEndpointsForAlias() { String[] alias = { "foo@bar.org" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(simplePushVariantID, null, Arrays.asList(alias), null); assertThat(tokens).hasSize(3); assertThat(tokens.get(0)).startsWith("http://server:8080/update/"); assertThat(tokens.get(1)).startsWith("http://server:8080/update/"); } @Test public void findZeroPushEndpointsForAliasAndCategories() { String[] alias = { "foo@bar.org" }; String[] categories = { "US Football" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(simplePushVariantID, Arrays.asList(categories), Arrays.asList(alias), null); assertThat(tokens).isEmpty(); } @Test public void findOnePushEndpointForAliasAndCategories() { String[] alias = { "foo@bar.org" }; String[] cats = { "soccer", "weather" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(simplePushVariantID, Arrays.asList(cats), Arrays.asList(alias), null); assertThat(tokens).hasSize(1); assertThat(tokens.get(0)).startsWith("http://server:8080/update/"); } @Test public void findThreePushEndpointsForAliasAndCategories() { String[] alias = { "foo@bar.org" }; String[] cats = { "soccer", "news", "weather" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(simplePushVariantID, Arrays.asList(cats), Arrays.asList(alias), null); assertThat(tokens).hasSize(3); assertThat(tokens.get(0)).startsWith("http://server:8080/update/"); assertThat(tokens.get(1)).startsWith("http://server:8080/update/"); assertThat(tokens.get(2)).startsWith("http://server:8080/update/"); } @Test public void findThreePushEndpointsForCategories() { String[] cats = { "soccer", "news", "weather" }; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(simplePushVariantID, Arrays.asList(cats), null, null); assertThat(tokens).hasSize(3); assertThat(tokens.get(0)).startsWith("http://server:8080/update/"); assertThat(tokens.get(1)).startsWith("http://server:8080/update/"); assertThat(tokens.get(2)).startsWith("http://server:8080/update/"); } @Test public void findPushEndpointsWithDeviceType() { String[] types = {"JavaFX Monitor"}; List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(simplePushVariantID, null, null, Arrays.asList(types)); assertThat(tokens).hasSize(1); assertThat(tokens.get(0)).startsWith("http://server:8080/update/"); } @Test public void findPushEndpointsWithoutDeviceType() { List<String> tokens = findAllDeviceTokenForVariantIDByCriteria(simplePushVariantID, null, null, null); assertThat(tokens).hasSize(3); assertThat(tokens.get(0)).startsWith("http://server:8080/update/"); } @Test public void shouldValidateDeviceId() { // given final Installation installation = new Installation(); installation.setDeviceToken("invalid"); final iOSVariant variant = new iOSVariant(); variant.setName("iOS Variant Name"); variant.setPassphrase("12"); variant.setCertificate("12".getBytes()); entityManager.persist(variant); installation.setVariant(variant); // when installationDao.create(installation); try { entityManager.flush(); fail("ConstraintViolationException should have been thrown"); } catch (ConstraintViolationException violationException) { // then final Set<ConstraintViolation<?>> constraintViolations = violationException.getConstraintViolations(); assertThat(constraintViolations).isNotEmpty(); assertThat(constraintViolations.size()).isEqualTo(1); assertThat(constraintViolations.iterator().next().getMessage()).isEqualTo( "Device token is not valid for this device type"); } } @Test public void shouldSaveWhenValidateDeviceIdIOS() { // given final Installation installation = new Installation(); installation.setDeviceToken("1ce51dad49a77ca7b45924074bcc4f19aea20378f5feda202fbba3beed7073d7"); final iOSVariant variant = new iOSVariant(); variant.setName("iOS Variant Name"); variant.setPassphrase("12"); variant.setCertificate("12".getBytes()); // when deviceTokenTest(installation, variant); } @Test public void shouldSaveWhenValidateDeviceIdWindows() { // given final Installation installation = new Installation(); installation.setDeviceToken("https://db3.notify.windows.com/?token=AgYAAACH%2fZixlZK4v%2bkD3LFiz7zHOJm13" + "smBVRn8rH%2b32Xu6tv3fj%2fh8bb4VhNTS7NqS8TclpW044YxAbaN%2bB4NjpyVSZs3He7SwwjExbEsBFRLYc824%2f0" + "615fPox8bwoxrTU%3d"); final WindowsWNSVariant variant = new WindowsWNSVariant(); variant.setName("Windows Variant Name"); variant.setClientSecret("12"); variant.setSid("12"); // when deviceTokenTest(installation, variant); } @Test public void shouldSaveWhenValidateDeviceIdAdm() { // given final Installation installation = new Installation(); installation.setDeviceToken("amzn1.adm-registration.v3.Y29tLmFtYXpvbi5EZXZpY2VNZXNzYWdpbmcuUmVnaXN0cmF0a" + "W9uSWRFbmNyeXB0aW9uS2V5ITEhWTlLSFlBZDlOSU12cTUzdlpIQzZJd3VZVk9CZ0g1bUdWUkJrL0hOTkZ5UGFPN1FxY3pP" + "WXJVL0laWGdrczVKU1MwSG8rVDUva2hkS3h5WjE4YUZHM3NoTXpOMUxCa2tORDdsY2FxemVxcG5lWXR1eC9UeHZMTWVScUY" + "wT3JwUXFzZFFCMi9vaHhmQjk2dERwK29JNEtFTm1TRGhLMFhnd0FPT3FPWGRwMi9GQllNSmN5TVh4YlZ4VlNQdVcvbHEveU" + "JkZExoMTdrZnNaVWpOMGlVMTBDbndkNERSd3Z4VjlpVm9hUy9mTXhLdUsxSVV5cjY1cngrQWYwdjN4WGxvWWJGL3ZDNXF6T" + "2FPa0JTL3Z6bGtxUUFUN3h4bXg1YitBTHlpbGkxazdJbHBIVm1PUm0rUkgveDFOdzFDQUVhQ1BXcE1Ud3ZpY2ROcUxGWlRt" + "VFM2bml3PT0hQVcwQ2puM3g2THgvaWJ0cE9nMzBEUT09"); final AdmVariant variant = new AdmVariant(); variant.setName("ADM variant Name"); variant.setClientSecret("12"); variant.setClientId("12"); // when deviceTokenTest(installation, variant); } @Test(expected = ConstraintViolationException.class) public void shouldNotSaveWhenSimplePushTokenInvalid() { // given final Installation installation = new Installation(); installation.setDeviceToken("htp://invalid"); final SimplePushVariant variant = new SimplePushVariant(); variant.setName("SimplePush Variant Name"); // when deviceTokenTest(installation, variant); } @Test public void shouldSaveWhenValidateDeviceIdMPNSWindows() { // given final Installation installation = new Installation(); installation.setDeviceToken("https://s.notify.live.net/u/1/db3/HmQAAACsY7ZBMnNW6QnfPcHXC1gwvHFlPeujLy" + "aLyoJmTm79gofALwJGBefhxH_Rjpz4oAoK5O5zL2nQwaFZpLMpXUP/d2luZG93c3Bob25lZGVmYXVsdA/AGVGhYlaBG" + "GphX2C8gGmg/vedAL_DKqnF00b4O3NCIifacDEQ"); WindowsMPNSVariant variant = new WindowsMPNSVariant(); variant.setName("Windows MPNS Variant Name"); // when deviceTokenTest(installation, variant); } @Test public void shouldSaveWhenSimplePushTokenValid() { // given final Installation installation = new Installation(); installation.setDeviceToken("http://valid/but/you/should/use/https"); final SimplePushVariant variant = new SimplePushVariant(); variant.setName("SimplePush Variant Name"); // when deviceTokenTest(installation, variant); } @Test public void shouldSaveWhenValidateDeviceIdAndroid() { // given final Installation installation = new Installation(); installation.setDeviceToken("APA91bHpbMXepp4odlb20vYOv0gQyNIyFu2X3OXR3TjqR8qecgWivima_UiLPFgUBs_10Nys2TUwUy" + "WlixrIta35NXW-5Z85OdXcbb_3s3p0qaa_a7NpFlaX9GpidK_BdQNMsx2gX8BrE4Uw7s22nPCcEn1U1_mo-" + "T6hcF5unYt965PDwRTRss8"); final AndroidVariant variant = new AndroidVariant(); variant.setName("Android Variant Name"); variant.setGoogleKey("12"); variant.setProjectNumber("12"); // when deviceTokenTest(installation, variant); } @Test public void shouldSaveWhenValidateDeviceIdFromAndroidEmulator() { // given final Installation installation = new Installation(); installation.setDeviceToken("eHlfnI0__dI:APA91bEhtHefML2lr_sBQ-bdXIyEn5owzkZg_p_y7SRyNKRMZ3Xu" + "zZhBpTOYIh46tqRYQIc-7RTADk4nM5H-ONgPDWHodQDS24O5GuKP8EZ" + "EKwNh4Zxdv1wkZJh7cU2PoLz9gn4Nxqz-"); final AndroidVariant variant = new AndroidVariant(); variant.setName("Android Variant Name"); variant.setGoogleKey("12"); variant.setProjectNumber("12"); // when deviceTokenTest(installation, variant); } @Test public void shouldSaveWhenValidateDeviceIdFromFirebase() { // given final Installation installation = new Installation(); installation.setDeviceToken("ckK-6WYMBXQ:APA91bEvCK_37qM89h5nKNOQTRz0rIjAMqP01hOi7QANlDDRpsDrB7w" + "382l_NB_6mNr_4l3Zx96IuL-dq9O4VdQnx8AM1-hquE2t4VkprbDrJ" + "2784ndbtAnt3FNg7J5aQcPPPO5g19An"); final AndroidVariant variant = new AndroidVariant(); variant.setName("Android Variant Name"); variant.setGoogleKey("12"); variant.setProjectNumber("12"); // when deviceTokenTest(installation, variant); } @Test public void shouldSaveWhitAndroidInstanceIDtoken() { // given final Installation installation = new Installation(); installation.setDeviceToken("cKNPkyd7HBU:APA91bH-GxYBT08qeltVLhFcPxvoT4MN1uRfhR-Q" + "Zns-0KLcZ159tQ14YXPOe4JjemCsGHLQNAqmFZrDNV-wcDqanGXWjHNG9ftNyBEj" + "7RqUOtpP1BEjTxWE4Hk7i1vKT3pyMV_7F8xF"); final AndroidVariant variant = new AndroidVariant(); variant.setName("Android Variant Name"); variant.setGoogleKey("12"); variant.setProjectNumber("12"); // when deviceTokenTest(installation, variant); } private void deviceTokenTest(Installation installation, Variant variant) { entityManager.persist(variant); installation.setVariant(variant); // when installationDao.create(installation); entityManager.flush(); } @Test public void primaryKeyUnmodifiedAfterUpdate() { Installation android1 = new Installation(); android1.setAlias("foo@bar.org"); android1.setDeviceToken(DEVICE_TOKEN_1); android1.setDeviceType("Android Phone"); final Set<Category> categoriesOne = new HashSet<>(); final Category category = entityManager.createQuery("from Category where name = :name", Category.class) .setParameter("name", "soccer").getSingleResult(); categoriesOne.add(category); android1.setCategories(categoriesOne); final String id = android1.getId(); final AndroidVariant variant = new AndroidVariant(); variant.setName("Android Variant Name"); variant.setGoogleKey("12"); variant.setProjectNumber("12"); entityManager.persist(variant); android1.setVariant(variant); installationDao.create(android1); // flush to be sure that it's in the database entityManager.flush(); // clear the cache otherwise finding the entity will not perform a select but get the entity from cache entityManager.clear(); Installation installation = installationDao.find(id); assertThat(installation.getId()).isEqualTo(id); assertThat(installation.getDeviceType()).isEqualTo("Android Phone"); final String alias = "foobar@bar.org"; android1.setAlias(alias); installationDao.update(android1); entityManager.flush(); entityManager.clear(); installation = installationDao.find(id); assertThat(installation.getAlias()).isEqualTo(alias); } @Test public void shouldSelectInstallationsByVariantForDeveloper() { //given String developer = "me"; //when final PageResult<Installation, Count> pageResult = installationDao.findInstallationsByVariantForDeveloper(androidVariantID, developer, 0, 1, null); //then assertThat(pageResult).isNotNull(); assertThat(pageResult.getResultList()).isNotEmpty().hasSize(1); assertThat(pageResult.getAggregate().getCount()).isEqualTo(6); } @Test public void shouldSelectInstallationsByVariant() { //when final PageResult<Installation, Count> pageResult = installationDao.findInstallationsByVariant(androidVariantID, 0, 1, null); //then assertThat(pageResult).isNotNull(); assertThat(pageResult.getResultList()).isNotEmpty().hasSize(1); assertThat(pageResult.getAggregate().getCount()).isEqualTo(6); } @Test public void shouldSelectInstallationsByDeviceTokenSearch() { //when final PageResult<Installation, Count> pageResult = installationDao.findInstallationsByVariant(androidVariantID, 0, Integer.MAX_VALUE, "67890167890"); //then assertThat(pageResult.getResultList()).isNotEmpty().hasSize(1); } @Test public void shouldSelectInstallationsByDeviceTypeSearch() { //when final PageResult<Installation, Count> pageResult = installationDao.findInstallationsByVariant(androidVariantID, 0, Integer.MAX_VALUE, "Tablet"); //then assertThat(pageResult.getResultList()).isNotEmpty().hasSize(3); } @Test public void shouldSelectInstallationsByAliasSearch() { //when final PageResult<Installation, Count> pageResult = installationDao.findInstallationsByVariant(androidVariantID, 0, Integer.MAX_VALUE, "baz@"); //then assertThat(pageResult.getResultList()).isNotEmpty().hasSize(1); } @Test(expected = PersistenceException.class) public void testTooLongDeviceToken() { AndroidVariant variant = new AndroidVariant(); variant.setName("Android Name"); variant.setGoogleKey("123"); variant.setProjectNumber("123"); entityManager.persist(variant); Installation android1 = new Installation(); android1.setAlias("foo@bar.org"); android1.setDeviceToken(TestUtils.longString(4097)); android1.setVariant(variant); installationDao.create(android1); entityManager.flush(); } @Test public void testLongDeviceToken() { AndroidVariant variant = new AndroidVariant(); variant.setName("Android Name"); variant.setGoogleKey("123"); variant.setProjectNumber("123"); entityManager.persist(variant); Installation android1 = new Installation(); android1.setAlias("foo@bar.org"); android1.setDeviceToken(TestUtils.longString(4096)); android1.setVariant(variant); installationDao.create(android1); entityManager.flush(); } private List<String> findAllDeviceTokenForVariantIDByCriteria(String variantID, List<String> categories, List<String> aliases, List<String> deviceTypes) { return findAllDeviceTokenForVariantIDByCriteria(variantID, categories, aliases, deviceTypes, false); } private List<String> findAllOldGCMDeviceTokenForVariantIDByCriteria(String variantID, List<String> categories, List<String> aliases, List<String> deviceTypes) { return findAllDeviceTokenForVariantIDByCriteria(variantID, categories, aliases, deviceTypes, true); } private List<String> findAllDeviceTokenForVariantIDByCriteria(String variantID, List<String> categories, List<String> aliases, List<String> deviceTypes, boolean oldGCM) { try { ResultsStream<String> tokenStream = installationDao.findAllDeviceTokenForVariantIDByCriteria(variantID, categories, aliases, deviceTypes, Integer.MAX_VALUE, null, oldGCM).executeQuery(); List<String> list = new ArrayList<>(); while (tokenStream.next()) { list.add(tokenStream.get()); } return list; } catch (ResultStreamException e) { throw new IllegalStateException(e); } } }