/**
 * 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);
    }
  }
}

