/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 gobblin.metastore; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigValueFactory; import gobblin.configuration.ConfigurationKeys; import gobblin.util.ClassAliasResolver; import java.io.IOException; import java.net.URL; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.collect.Lists; import gobblin.configuration.State; /** * Unit tests for {@link FsStateStore}. */ @Test(groups = { "gobblin.metastore" }) public class FsStateStoreTest { private StateStore<State> stateStore; private StateStore.Factory stateStoreFactory; private Config config; @BeforeClass public void setUp() throws Exception { ClassAliasResolver<StateStore.Factory> resolver = new ClassAliasResolver<>(StateStore.Factory.class); stateStoreFactory = resolver.resolveClass("fs").newInstance(); config = ConfigFactory.empty().withValue(ConfigurationKeys.STATE_STORE_FS_URI_KEY, ConfigValueFactory.fromAnyRef("file:///")).withValue(ConfigurationKeys.STATE_STORE_ROOT_DIR_KEY, ConfigValueFactory.fromAnyRef("metastore-test")).withValue("fs.permissions.umask-mode", ConfigValueFactory.fromAnyRef("022")); this.stateStore = stateStoreFactory.createStateStore(config, State.class); // cleanup in case files left behind by a prior run this.stateStore.delete("testStore"); } @Test public void testPut() throws IOException { List<State> states = Lists.newArrayList(); State state1 = new State(); state1.setId("s1"); state1.setProp("k1", "v1"); states.add(state1); State state2 = new State(); state2.setId("s2"); state2.setProp("k2", "v2"); states.add(state2); State state3 = new State(); state3.setId("s3"); state3.setProp("k3", "v3"); states.add(state3); Assert.assertFalse(this.stateStore.exists("testStore", "testTable")); this.stateStore.putAll("testStore", "testTable", states); Assert.assertTrue(this.stateStore.exists("testStore", "testTable")); } @Test(dependsOnMethods = { "testPut" }) public void testGet() throws IOException { List<State> states = this.stateStore.getAll("testStore", "testTable"); Assert.assertEquals(states.size(), 3); Assert.assertEquals(states.get(0).getProp("k1"), "v1"); Assert.assertEquals(states.get(1).getProp("k2"), "v2"); Assert.assertEquals(states.get(2).getProp("k3"), "v3"); } @Test(dependsOnMethods = { "testPut" }) public void testCreateAlias() throws IOException { this.stateStore.createAlias("testStore", "testTable", "testTable1"); Assert.assertTrue(this.stateStore.exists("testStore", "testTable1")); } @Test(dependsOnMethods = { "testCreateAlias" }) public void testGetAlias() throws IOException { List<State> states = this.stateStore.getAll("testStore", "testTable1"); Assert.assertEquals(states.size(), 3); Assert.assertEquals(states.get(0).getProp("k1"), "v1"); Assert.assertEquals(states.get(1).getProp("k2"), "v2"); Assert.assertEquals(states.get(2).getProp("k3"), "v3"); } @Test public void testBackwardsCompat() throws IOException { // Tests with a state store that was saved before the WritableShim changes Config bwConfig = ConfigFactory.load(config); URL path = getClass().getResource("/backwardsCompatTestStore"); Assert.assertNotNull(path); bwConfig = bwConfig.withValue(ConfigurationKeys.STATE_STORE_ROOT_DIR_KEY, ConfigValueFactory.fromAnyRef(path.toString())); StateStore<State> bwStateStore = stateStoreFactory.createStateStore(bwConfig, State.class); Assert.assertTrue(bwStateStore.exists("testStore", "testTable")); List<State> states = bwStateStore.getAll("testStore", "testTable"); Assert.assertEquals(states.size(), 3); Assert.assertEquals(states.get(0).getProp("k1"), "v1"); Assert.assertEquals(states.get(1).getProp("k2"), "v2"); Assert.assertEquals(states.get(2).getProp("k3"), "v3"); } @AfterClass public void tearDown() throws IOException { FileSystem fs = FileSystem.getLocal(new Configuration(false)); Path rootDir = new Path("metastore-test"); if (fs.exists(rootDir)) { fs.delete(rootDir, true); } } }