/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.ogm.datastore.mongodb.test.options.writeconcern; import static org.fest.assertions.Assertions.assertThat; import java.lang.annotation.ElementType; import org.hibernate.ogm.datastore.mongodb.MongoDB; import org.hibernate.ogm.datastore.mongodb.options.WriteConcernType; import org.hibernate.ogm.datastore.mongodb.options.impl.WriteConcernOption; import org.hibernate.ogm.datastore.mongodb.options.navigation.MongoDBGlobalContext; import org.hibernate.ogm.options.container.impl.OptionsContainer; import org.hibernate.ogm.options.navigation.impl.AppendableConfigurationContext; import org.hibernate.ogm.options.navigation.impl.ConfigurationContextImpl; import org.hibernate.ogm.options.navigation.source.impl.OptionValueSource; import org.hibernate.ogm.options.navigation.source.impl.ProgrammaticOptionValueSource; import org.junit.Before; import org.junit.Test; import com.mongodb.WriteConcern; /** * Test the {@link WriteConcernOption} used to set the {@link WriteConcernType} in MongoDB. * * @author Davide D'Alto <davide@hibernate.org> */ public class WriteConcernOptionTest { private MongoDBGlobalContext mongoOptions; private AppendableConfigurationContext context; @Before public void setupBuilder() { context = new AppendableConfigurationContext(); mongoOptions = new MongoDB().getConfigurationBuilder( new ConfigurationContextImpl( context ) ); } @Test public void testWriteConcernGivenByTypeOnGlobalLevel() throws Exception { mongoOptions .writeConcern( WriteConcernType.REPLICA_ACKNOWLEDGED ); OptionsContainer options = getSource().getGlobalOptions(); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( WriteConcern.REPLICA_ACKNOWLEDGED ); } @Test public void testWriteConcernGivenByInstanceOnGlobalLevel() throws Exception { ReplicaConfigurableWriteConcern writeConcern = new ReplicaConfigurableWriteConcern( 5 ); mongoOptions.writeConcern( writeConcern ); OptionsContainer options = getSource().getGlobalOptions(); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( writeConcern ); } @Test public void testWriteConcernGivenByTypePriority() throws Exception { mongoOptions .writeConcern( WriteConcernType.REPLICA_ACKNOWLEDGED ) .entity( ExampleForMongoDBMapping.class ) .writeConcern( WriteConcernType.MAJORITY ) .property( "content", ElementType.FIELD ) .writeConcern( WriteConcernType.FSYNCED ); OptionsContainer options = getSource().getGlobalOptions(); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( WriteConcern.REPLICA_ACKNOWLEDGED ); options = getSource().getEntityOptions( ExampleForMongoDBMapping.class ); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( WriteConcern.MAJORITY ); options = getSource().getPropertyOptions( ExampleForMongoDBMapping.class, "content" ); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( WriteConcern.FSYNCED ); } @Test public void testWriteConcernGivenByInstancePriority() throws Exception { mongoOptions .writeConcern( new ReplicaConfigurableWriteConcern( 2 ) ) .entity( ExampleForMongoDBMapping.class ) .writeConcern( new ReplicaConfigurableWriteConcern( 3 ) ) .property( "content", ElementType.FIELD ) .writeConcern( new ReplicaConfigurableWriteConcern( 4 ) ); OptionsContainer options = getSource().getGlobalOptions(); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( new ReplicaConfigurableWriteConcern( 2 ) ); options = getSource().getEntityOptions( ExampleForMongoDBMapping.class ); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( new ReplicaConfigurableWriteConcern( 3 ) ); options = getSource().getPropertyOptions( ExampleForMongoDBMapping.class, "content" ); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( new ReplicaConfigurableWriteConcern( 4 ) ); } @Test public void testWriteConcernGivenByInstanceTakesPrecedenceOverType() throws Exception { mongoOptions .writeConcern( WriteConcernType.ACKNOWLEDGED ) .writeConcern( new ReplicaConfigurableWriteConcern( 2 ) ) .entity( ExampleForMongoDBMapping.class ) .writeConcern( WriteConcernType.ACKNOWLEDGED ) .writeConcern( new ReplicaConfigurableWriteConcern( 3 ) ) .property( "content", ElementType.FIELD ) .writeConcern( WriteConcernType.ACKNOWLEDGED ) .writeConcern( new ReplicaConfigurableWriteConcern( 4 ) ); OptionsContainer options = getSource().getGlobalOptions(); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( new ReplicaConfigurableWriteConcern( 2 ) ); options = getSource().getEntityOptions( ExampleForMongoDBMapping.class ); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( new ReplicaConfigurableWriteConcern( 3 ) ); options = getSource().getPropertyOptions( ExampleForMongoDBMapping.class, "content" ); assertThat( options.getUnique( WriteConcernOption.class ) ).isEqualTo( new ReplicaConfigurableWriteConcern( 4 ) ); } private OptionValueSource getSource() { return new ProgrammaticOptionValueSource( context ); } @SuppressWarnings("unused") private static final class ExampleForMongoDBMapping { String content; } /** * A write concern which allows to specify the number of replicas which need to acknowledge a write. */ @SuppressWarnings("serial") private static class ReplicaConfigurableWriteConcern extends WriteConcern { public ReplicaConfigurableWriteConcern(int numberOfRequiredReplicas) { super( numberOfRequiredReplicas, 0, false, true ); } } }