blob: 7c83f143b6c29e875a6d72d77ab41f893f5a6674 [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.doris.backup;
import mockit.*;
import org.apache.doris.analysis.ShowRepositoriesStmt;
import org.apache.doris.analysis.StorageBackend;
import org.apache.doris.catalog.BrokerMgr;
import org.apache.doris.catalog.FsBroker;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.service.FrontendOptions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;
public class RepositoryTest {
private Repository repo;
private long repoId = 10000;
private String name = "repo";
private String location = "bos://backup-cmy";
private String brokerName = "broker";
private SnapshotInfo info;
@Mocked
private BlobStorage storage;
@Before
public void setUp() {
List<String> files = Lists.newArrayList();
files.add("1.dat");
files.add("1.hdr");
files.add("1.idx");
info = new SnapshotInfo(1, 2, 3, 4, 5, 6, 7, "/path/to/tablet/snapshot/", files);
new MockUp<FrontendOptions>() {
@Mock
String getLocalHostAddress() {
return "127.0.0.1";
}
};
new MockUp<BrokerMgr>() {
@Mock
public FsBroker getBroker(String name, String host) throws AnalysisException {
return new FsBroker("10.74.167.16", 8111);
}
};
}
@Test
public void testGet() {
repo = new Repository(10000, "repo", false, location, storage);
Assert.assertEquals(repoId, repo.getId());
Assert.assertEquals(name, repo.getName());
Assert.assertEquals(false, repo.isReadOnly());
Assert.assertEquals(location, repo.getLocation());
Assert.assertEquals(null, repo.getErrorMsg());
Assert.assertTrue(System.currentTimeMillis() - repo.getCreateTime() < 1000);
}
@Test
public void testInit() {
new Expectations() {
{
storage.list(anyString, (List<RemoteFile>) any);
minTimes = 0;
result = new Delegate<Status>() {
public Status list(String remotePath, List<RemoteFile> result) {
result.clear();
return Status.OK;
}
};
storage.directUpload(anyString, anyString);
minTimes = 0;
result = Status.OK;
}
};
repo = new Repository(10000, "repo", false, location, storage);
Status st = repo.initRepository();
System.out.println(st);
Assert.assertTrue(st.ok());
}
@Test
public void testassemnblePath() {
repo = new Repository(10000, "repo", false, location, storage);
// job info
String label = "label";
String createTime = "2018-04-12 20:46:45";
String createTime2 = "2018-04-12-20-46-45";
Timestamp ts = Timestamp.valueOf(createTime);
long creastTs = ts.getTime();
// "location/__palo_repository_repo_name/__ss_my_sp1/__info_2018-01-01-08-00-00"
String expected = location + "/" + Repository.PREFIX_REPO + name + "/" + Repository.PREFIX_SNAPSHOT_DIR
+ label + "/" + Repository.PREFIX_JOB_INFO + createTime2;
Assert.assertEquals(expected, repo.assembleJobInfoFilePath(label, creastTs));
// meta info
expected = location + "/" + Repository.PREFIX_REPO + name + "/" + Repository.PREFIX_SNAPSHOT_DIR
+ label + "/" + Repository.FILE_META_INFO;
Assert.assertEquals(expected, repo.assembleMetaInfoFilePath(label));
// snapshot path
// /location/__palo_repository_repo_name/__ss_my_ss1/__ss_content/__db_10001/__tbl_10020/__part_10031/__idx_10032/__10023/__3481721
expected = location + "/" + Repository.PREFIX_REPO + name + "/" + Repository.PREFIX_SNAPSHOT_DIR
+ label + "/" + "__ss_content/__db_1/__tbl_2/__part_3/__idx_4/__5/__7";
Assert.assertEquals(expected, repo.assembleRemoteSnapshotPath(label, info));
}
@Test
public void testPing() {
new Expectations() {
{
storage.checkPathExist(anyString);
minTimes = 0;
result = Status.OK;
}
};
repo = new Repository(10000, "repo", false, location, storage);
Assert.assertTrue(repo.ping());
Assert.assertTrue(repo.getErrorMsg() == null);
}
@Test
public void testListSnapshots() {
new Expectations() {
{
storage.list(anyString, (List<RemoteFile>) any);
minTimes = 0;
result = new Delegate() {
public Status list(String remotePath, List<RemoteFile> result) {
result.add(new RemoteFile(Repository.PREFIX_SNAPSHOT_DIR + "a", false, 100));
result.add(new RemoteFile("_ss_b", true, 100));
return Status.OK;
}
};
}
};
repo = new Repository(10000, "repo", false, location, storage);
List<String> snapshotNames = Lists.newArrayList();
Status st = repo.listSnapshots(snapshotNames);
Assert.assertTrue(st.ok());
Assert.assertEquals(1, snapshotNames.size());
Assert.assertEquals("a", snapshotNames.get(0));
}
@Test
public void testUpload() {
new Expectations() {
{
storage.upload(anyString, anyString);
minTimes = 0;
result = Status.OK;
storage.rename(anyString, anyString);
minTimes = 0;
result = Status.OK;
storage.delete(anyString);
minTimes = 0;
result = Status.OK;
}
};
repo = new Repository(10000, "repo", false, location, storage);
String localFilePath = "./tmp_" + System.currentTimeMillis();
try (PrintWriter out = new PrintWriter(localFilePath)) {
out.print("a");
} catch (FileNotFoundException e) {
e.printStackTrace();
Assert.fail();
}
try {
String remoteFilePath = location + "/remote_file";
Status st = repo.upload(localFilePath, remoteFilePath);
Assert.assertTrue(st.ok());
} finally {
File file = new File(localFilePath);
file.delete();
}
}
@Test
public void testDownload() {
String localFilePath = "./tmp_" + System.currentTimeMillis();
File localFile = new File(localFilePath);
try {
try (PrintWriter out = new PrintWriter(localFile)) {
out.print("a");
} catch (FileNotFoundException e) {
e.printStackTrace();
Assert.fail();
}
new Expectations() {
{
storage.list(anyString, (List<RemoteFile>) any);
minTimes = 0;
result = new Delegate() {
public Status list(String remotePath, List<RemoteFile> result) {
result.add(new RemoteFile("remote_file.0cc175b9c0f1b6a831c399e269772661", true, 100));
return Status.OK;
}
};
storage.downloadWithFileSize(anyString, anyString, anyLong);
minTimes = 0;
result = Status.OK;
}
};
repo = new Repository(10000, "repo", false, location, storage);
String remoteFilePath = location + "/remote_file";
Status st = repo.download(remoteFilePath, localFilePath);
Assert.assertTrue(st.ok());
} finally {
localFile.delete();
}
}
@Test
public void testGetInfo() {
repo = new Repository(10000, "repo", false, location, storage);
List<String> infos = repo.getInfo();
Assert.assertTrue(infos.size() == ShowRepositoriesStmt.TITLE_NAMES.size());
}
@Test
public void testGetSnapshotInfo() {
new Expectations() {
{
storage.list(anyString, (List<RemoteFile>) any);
minTimes = 0;
result = new Delegate() {
public Status list(String remotePath, List<RemoteFile> result) {
if (remotePath.contains(Repository.PREFIX_JOB_INFO)) {
result.add(new RemoteFile(" __info_2018-04-18-20-11-00.12345678123456781234567812345678",
true,
100));
} else {
result.add(new RemoteFile(Repository.PREFIX_SNAPSHOT_DIR + "s1", false, 100));
result.add(new RemoteFile(Repository.PREFIX_SNAPSHOT_DIR + "s2", false, 100));
}
return Status.OK;
}
};
}
};
repo = new Repository(10000, "repo", false, location, storage);
String snapshotName = "";
String timestamp = "";
try {
List<List<String>> infos = repo.getSnapshotInfos(snapshotName, timestamp);
Assert.assertEquals(2, infos.size());
} catch (AnalysisException e) {
e.printStackTrace();
Assert.fail();
}
}
@Test
public void testPersist() {
Map<String, String> properties = Maps.newHashMap();
properties.put("bos_endpoint", "http://gz.bcebos.com");
properties.put("bos_accesskey", "a");
properties.put("bos_secret_accesskey", "b");
BlobStorage storage = BlobStorage.create(brokerName, StorageBackend.StorageType.BROKER, properties);
repo = new Repository(10000, "repo", false, location, storage);
File file = new File("./Repository");
try {
DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
repo.write(out);
out.flush();
out.close();
DataInputStream in = new DataInputStream(new FileInputStream(file));
Repository newRepo = Repository.read(in);
in.close();
Assert.assertEquals(repo.getName(), newRepo.getName());
Assert.assertEquals(repo.getId(), newRepo.getId());
Assert.assertEquals(repo.getLocation(), newRepo.getLocation());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail();
} finally {
file.delete();
}
}
}