/** * 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.simplepush.server.datastore; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import java.sql.Connection; import java.sql.DriverManager; import java.util.Arrays; import java.util.HashSet; import java.util.UUID; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.jboss.aerogear.simplepush.server.datastore.model.ChannelDTO; import org.jboss.aerogear.simplepush.server.datastore.model.AckDTO; import org.jboss.aerogear.simplepush.server.datastore.model.Server; import org.jboss.aerogear.simplepush.server.datastore.model.UserAgentDTO; import org.jboss.aerogear.simplepush.util.UUIDUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; public class JpaEntitiesTest { private Connection connection; private EntityManagerFactory entityManagerFactory; private EntityManager entityManager; @Before public void setupDatabase() throws Exception{ Class.forName("org.h2.Driver"); connection = DriverManager.getConnection("jdbc:h2:mem:simplepush", "sa", ""); entityManagerFactory = Persistence.createEntityManagerFactory("SimplePush"); entityManager = entityManagerFactory.createEntityManager(); } @After public void teardownDatabase() throws Exception { if (entityManager != null) { entityManager.close(); entityManagerFactory.close(); connection.createStatement().execute("SHUTDOWN"); } } @Test public void saveServerSalt() { final String salt = "the server salt"; final Server server = new Server(salt); entityManager.getTransaction().begin(); entityManager.persist(server); entityManager.getTransaction().commit(); } @Test public void persistUserAgent() { final String channelId = UUID.randomUUID().toString(); final String uaid = UUIDUtil.newUAID(); final UserAgentDTO userAgent = persist(uaid, channelId, 1, "/endpoint/" + channelId); assertThat(entityManager.contains(userAgent), is(true)); entityManager.getTransaction().begin(); final UserAgentDTO ua = entityManager.find(UserAgentDTO.class, userAgent.getUaid()); assertThat(ua.getUaid(), equalTo(uaid.toString())); assertThat(ua.getChannels().size(), is(1)); assertThat(ua.getChannels().iterator().next().getChannelId(), equalTo(channelId)); assertThat(ua.getChannels().iterator().next().getVersion(), equalTo(1L)); entityManager.getTransaction().commit(); } @Test public void getChannel() { final String channelId = UUID.randomUUID().toString(); final String uaid = UUIDUtil.newUAID(); persist(uaid, channelId, 10, "/endpoint/" + channelId); entityManager.getTransaction().begin(); final ChannelDTO channel = entityManager.find(ChannelDTO.class, channelId); assertThat(channel.getChannelId(), equalTo(channelId)); assertThat(channel.getVersion(), equalTo(10L)); entityManager.getTransaction().commit(); } @Test public void removeUserAgent() { final String channelId = UUID.randomUUID().toString(); final String uaid = UUIDUtil.newUAID(); final UserAgentDTO userAgent = persist(uaid, channelId, 1, "/endpoint/" + channelId); assertThat(entityManager.contains(userAgent), is(true)); entityManager.getTransaction().begin(); entityManager.remove(userAgent); entityManager.getTransaction().commit(); final UserAgentDTO ua = entityManager.find(UserAgentDTO.class, userAgent.getUaid()); assertThat(ua, is(nullValue())); final ChannelDTO channel = entityManager.find(ChannelDTO.class, channelId); assertThat(channel, is(nullValue())); } @Test public void persistUpdate() { final String channelId = UUID.randomUUID().toString(); final String uaid = UUIDUtil.newUAID(); final UserAgentDTO userAgent = persist(uaid, channelId, 10, "/endpoint/" + channelId); entityManager.getTransaction().begin(); final AckDTO update = new AckDTO(userAgent, channelId, 10); entityManager.persist(update); entityManager.getTransaction().commit(); entityManager.getTransaction().begin(); final AckDTO up = entityManager.find(AckDTO.class, channelId); assertThat(up.getUserAgent(), equalTo(userAgent)); assertThat(up.getChannelId(), equalTo(channelId)); assertThat(up.getVersion(), equalTo(10L)); entityManager.getTransaction().commit(); } @Test public void persistUpdateToSameChannel() { final String channelId = UUID.randomUUID().toString(); final String uaid = UUIDUtil.newUAID(); final UserAgentDTO userAgent = persist(uaid, channelId, 10, "/endpoint/" + channelId); entityManager.getTransaction().begin(); final AckDTO update = new AckDTO(userAgent, channelId, 10); entityManager.persist(update); entityManager.getTransaction().commit(); entityManager.getTransaction().begin(); final UserAgentDTO userAgentToUpdate = entityManager.find(UserAgentDTO.class, uaid); final AckDTO newUpdate = new AckDTO(userAgent, channelId, 11); userAgentToUpdate.setAcks(new HashSet<AckDTO>(Arrays.asList(newUpdate))); entityManager.merge(userAgentToUpdate); entityManager.getTransaction().commit(); entityManager.getTransaction().begin(); final AckDTO updated = entityManager.find(AckDTO.class, channelId); assertThat(updated.getVersion(), is(11L)); } private UserAgentDTO persist(final String uaid, final String channelId, final long version, final String endpointUrl) { entityManager.getTransaction().begin(); final UserAgentDTO userAgent = new UserAgentDTO(uaid.toString()); userAgent.addChannel(channelId, version, endpointUrl); entityManager.persist(userAgent); assertThat(entityManager.contains(userAgent), is(true)); entityManager.getTransaction().commit(); return userAgent; } }