blob: b271d3c7b1f5e43d8fbe0db15091602ef9be1086 [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 org.apache.sqoop.lib;
import java.io.*;
import org.apache.sqoop.testutil.BaseSqoopTestCase;
import org.apache.sqoop.testutil.CommonArgs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.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 that the BlobRef.parse() method does the right thing.
* Note that we don't support inline parsing here; we only expect this to
* really work for external BLOBs.
*/
public class TestBlobRef {
@Test
public void testEmptyStr() {
BlobRef r = BlobRef.parse("");
assertFalse(r.isExternal());
}
@Test
public void testInline() throws IOException {
BlobRef r = BlobRef.parse("foo");
assertFalse(r.isExternal());
}
@Test
public void testEmptyFile() {
BlobRef r = BlobRef.parse("externalLob()");
assertFalse(r.isExternal());
r = BlobRef.parse("externalLob(lf,,0,0)");
assertTrue(r.isExternal());
assertEquals("externalLob(lf,,0,0)", r.toString());
}
@Test
public void testInlineNearMatch() {
BlobRef r = BlobRef.parse("externalLob(foo)bar");
assertFalse(r.isExternal());
r = BlobRef.parse("externalLob(foo)");
assertFalse(r.isExternal());
r = BlobRef.parse("externalLob(lf,foo)");
assertFalse(r.isExternal());
r = BlobRef.parse("externalLob(lf,foo,1,2)x");
assertFalse(r.isExternal());
}
@Test
public void testExternal() throws IOException {
final byte [] DATA = { 1, 2, 3, 4, 5 };
final String FILENAME = "blobdata";
doExternalTest(DATA, FILENAME);
}
@Test
public void testExternalSubdir() throws IOException {
final byte [] DATA = { 1, 2, 3, 4, 5 };
final String FILENAME = "_lob/blobdata";
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 byte [] 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 blobFile = new Path(tmpPath, filename);
// make any necessary parent dirs.
Path blobParent = blobFile.getParent();
if (!fs.exists(blobParent)) {
fs.mkdirs(blobParent);
}
LobFile.Writer lw = LobFile.create(blobFile, conf, false);
try {
long off = lw.tell();
long len = data.length;
OutputStream os = lw.writeBlobRecord(len);
os.write(data, 0, data.length);
os.close();
lw.close();
String refString = "externalLob(lf," + filename
+ "," + off + "," + len + ")";
BlobRef blob = BlobRef.parse(refString);
assertTrue(blob.isExternal());
assertEquals(refString, blob.toString());
InputStream is = blob.getDataStream(conf, tmpPath);
assertNotNull(is);
byte [] buf = new byte[4096];
int bytes = is.read(buf, 0, 4096);
is.close();
assertEquals(data.length, bytes);
for (int i = 0; i < bytes; i++) {
assertEquals(data[i], buf[i]);
}
} finally {
fs.delete(blobFile, false);
}
}
}