blob: 7efc3b6648475cddd4ad01899ef75038611ec133 [file] [log] [blame]
/**
* 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 com.cloudera.sqoop.lib;
import java.io.*;
import com.cloudera.sqoop.testutil.BaseSqoopTestCase;
import com.cloudera.sqoop.testutil.CommonArgs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import com.cloudera.sqoop.io.LobFile;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* Test parsing of ClobRef objects.
*/
public class TestClobRef {
@Test
public void testEmptyStr() {
ClobRef r = ClobRef.parse("");
assertFalse(r.isExternal());
assertEquals("", r.toString());
}
@Test
public void testInline() throws IOException {
ClobRef r = ClobRef.parse("foo");
assertFalse(r.isExternal());
assertEquals("foo", r.toString());
Reader reader = r.getDataStream(null, null);
assertNotNull(reader);
char [] buf = new char[4096];
int chars = reader.read(buf, 0, 4096);
reader.close();
String str = new String(buf, 0, chars);
assertEquals("foo", str);
}
@Test
public void testEmptyFile() {
ClobRef r = ClobRef.parse("externalLob()");
assertFalse(r.isExternal());
assertEquals("externalLob()", r.toString());
r = ClobRef.parse("externalLob(lf,,0,0)");
assertTrue(r.isExternal());
assertEquals("externalLob(lf,,0,0)", r.toString());
}
@Test
public void testInlineNearMatch() {
ClobRef r = ClobRef.parse("externalLob(foo)bar");
assertFalse(r.isExternal());
assertEquals("externalLob(foo)bar", r.toString());
r = ClobRef.parse("externalLob(foo)");
assertFalse(r.isExternal());
assertEquals("externalLob(foo)", r.getData());
r = ClobRef.parse("externalLob(lf,foo)");
assertFalse(r.isExternal());
assertEquals("externalLob(lf,foo)", r.getData());
r = ClobRef.parse("externalLob(lf,foo,1,2)x");
assertFalse(r.isExternal());
assertEquals("externalLob(lf,foo,1,2)x", r.getData());
}
@Test
public void testExternal() throws IOException {
final String DATA = "This is the clob data!";
final String FILENAME = "clobdata";
doExternalTest(DATA, FILENAME);
}
@Test
public void testExternalSubdir() throws IOException {
final String DATA = "This is the clob data!";
final String FILENAME = "_lob/clobdata";
try {
doExternalTest(DATA, FILENAME);
} finally {
// remove dir we made.
Configuration conf = new Configuration();
FileSystem fs = FileSystem.getLocal(conf);
String tmpDir = System.getProperty("test.build.data", "/tmp/");
Path lobDir = new Path(new Path(tmpDir), "_lob");
fs.delete(lobDir, true);
}
}
private void doExternalTest(final String data, final String filename)
throws IOException {
Configuration conf = new Configuration();
if (!BaseSqoopTestCase.isOnPhysicalCluster()) {
conf.set(CommonArgs.FS_DEFAULT_NAME, CommonArgs.LOCAL_FS);
}
FileSystem fs = FileSystem.get(conf);
String tmpDir = System.getProperty("test.build.data", "/tmp/");
Path tmpPath = new Path(tmpDir);
Path clobFile = new Path(tmpPath, filename);
// make any necessary parent dirs.
Path clobParent = clobFile.getParent();
if (!fs.exists(clobParent)) {
fs.mkdirs(clobParent);
}
LobFile.Writer lw = LobFile.create(clobFile, conf, true);
try {
long off = lw.tell();
long len = data.length();
Writer w = lw.writeClobRecord(len);
w.append(data);
w.close();
lw.close();
String refString = "externalLob(lf," + filename
+ "," + off + "," + len + ")";
ClobRef clob = ClobRef.parse(refString);
assertTrue(clob.isExternal());
assertEquals(refString, clob.toString());
Reader r = clob.getDataStream(conf, tmpPath);
assertNotNull(r);
char [] buf = new char[4096];
int chars = r.read(buf, 0, 4096);
r.close();
String str = new String(buf, 0, chars);
assertEquals(data, str);
} finally {
fs.delete(clobFile, false);
}
}
}