/**
* This file is part of git-as-svn. It is subject to the license terms
* in the LICENSE file found in the top-level directory of this distribution
* and at http://www.gnu.org/licenses/gpl-2.0.html. No part of git-as-svn,
* including this file, may be copied, modified, propagated, or distributed
* except according to the terms contained in the LICENSE file.
*/
package svnserver.ext.gitlfs.storage.network;
import com.google.common.io.CharStreams;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.jetbrains.annotations.NotNull;
import org.mapdb.DBMaker;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import svnserver.TestHelper;
import svnserver.VcsAccessNoAnonymous;
import svnserver.auth.LocalUserDB;
import svnserver.auth.User;
import svnserver.auth.UserDB;
import svnserver.auth.UserWithPassword;
import svnserver.context.LocalContext;
import svnserver.context.SharedContext;
import svnserver.ext.gitlfs.config.LfsConfig;
import svnserver.ext.gitlfs.config.LfsLayout;
import svnserver.ext.gitlfs.server.LfsServer;
import svnserver.ext.gitlfs.storage.LfsReader;
import svnserver.ext.gitlfs.storage.LfsStorage;
import svnserver.ext.gitlfs.storage.LfsWriter;
import svnserver.ext.gitlfs.storage.local.LfsLocalStorage;
import svnserver.ext.gitlfs.storage.memory.LfsMemoryStorage;
import svnserver.ext.web.config.WebServerConfig;
import svnserver.ext.web.server.WebServer;
import svnserver.ext.web.token.EncryptionFactoryAes;
import svnserver.repository.VcsAccess;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
/**
* Simple test for LfsLocalStorage.
*
* @author Artem V. Navrotskiy <bozaro@users.noreply.github.com>
*/
public class LfsHttpStorageTest {
@DataProvider(name = "compressProvider")
public static Object[][] compressProvider() {
return new Object[][]{
{true},
{false},
};
}
@Test
public void server() throws Exception {
// Create web server
final ServerConnector http = createJettyServer();
final Server jetty = http.getServer();
// Create users
final LocalUserDB users = new LocalUserDB();
final User user = User.create("test", "Test User", "test@example.com", null);
users.add(new UserWithPassword(user, "test"));
// Create shared context
SharedContext sharedContext = new SharedContext(new File("/tmp"), DBMaker.newMemoryDB().make());
sharedContext.add(WebServer.class, new WebServer(sharedContext, jetty, new WebServerConfig(), new EncryptionFactoryAes("secret")));
sharedContext.add(LfsServer.class, new LfsServer("{0}.git", "t0ken", 0, 0));
sharedContext.add(UserDB.class, users);
sharedContext.ready();
// Create local context
LocalContext localContext = new LocalContext(sharedContext, "example");
localContext.add(VcsAccess.class, new VcsAccessNoAnonymous());
localContext.add(LfsStorage.class, new LfsMemoryStorage());
// Register storage
sharedContext.sure(LfsServer.class).register(localContext, localContext.sure(LfsStorage.class));
try {
final URL url = new URL("http", http.getHost(), http.getLocalPort(), "/");
final URL authUrl = new URL(url, "example.git/" + LfsServer.SERVLET_AUTH);
LfsHttpStorage storage = new LfsHttpStorage(authUrl, "t0ken");
// Check file is not exists
Assert.assertNull(storage.getReader("sha256:61f27ddd5b4e533246eb76c45ed4bf4504daabce12589f97b3285e9d3cd54308", user));
// Write new file
try (final LfsWriter writer = storage.getWriter(user)) {
writer.write("Hello, world!!!".getBytes(StandardCharsets.UTF_8));
Assert.assertEquals(writer.finish(null), "sha256:61f27ddd5b4e533246eb76c45ed4bf4504daabce12589f97b3285e9d3cd54308");
}
// Read old file.
final LfsReader reader = storage.getReader("sha256:61f27ddd5b4e533246eb76c45ed4bf4504daabce12589f97b3285e9d3cd54308", user);
Assert.assertNotNull(reader);
Assert.assertNull(reader.getMd5());
Assert.assertEquals(reader.getSize(), 15);
try (final InputStream stream = reader.openStream()) {
Assert.assertEquals(CharStreams.toString(new InputStreamReader(stream, StandardCharsets.UTF_8)), "Hello, world!!!");
}
} finally {
jetty.stop();
}
}
@Test(dataProvider = "compressProvider")
public void simple(boolean compress) throws IOException {
final File tempDir = TestHelper.createTempDir("git-as-svn");
try {
LfsLocalStorage storage = new LfsLocalStorage(LfsLayout.TwoLevels, new File(tempDir, "data"), new File(tempDir, "meta"), compress);
// Check file is not exists
Assert.assertNull(storage.getReader("sha256:61f27ddd5b4e533246eb76c45ed4bf4504daabce12589f97b3285e9d3cd54308"));
// Write new file
try (final LfsWriter writer = storage.getWriter(null)) {
writer.write("Hello, world!!!".getBytes(StandardCharsets.UTF_8));
Assert.assertEquals(writer.finish(null), "sha256:61f27ddd5b4e533246eb76c45ed4bf4504daabce12589f97b3285e9d3cd54308");
}
// Read old file.
final LfsReader reader = storage.getReader("sha256:61f27ddd5b4e533246eb76c45ed4bf4504daabce12589f97b3285e9d3cd54308");
Assert.assertNotNull(reader);
Assert.assertEquals("9fe77772b085e3533101d59d33a51f19", reader.getMd5());
Assert.assertEquals(15, reader.getSize());
// Write new file
try (final LfsWriter writer = storage.getWriter(null)) {
writer.write("Hello, world!!!".getBytes(StandardCharsets.UTF_8));
Assert.assertEquals(writer.finish(null), "sha256:61f27ddd5b4e533246eb76c45ed4bf4504daabce12589f97b3285e9d3cd54308");
}
try (final InputStream stream = reader.openStream()) {
Assert.assertEquals(CharStreams.toString(new InputStreamReader(stream, StandardCharsets.UTF_8)), "Hello, world!!!");
}
} finally {
TestHelper.deleteDirectory(tempDir);
}
}
@NotNull
private ServerConnector createJettyServer() {
final Server server = new Server();
ServerConnector http = new ServerConnector(server, new HttpConnectionFactory());
http.setPort(0);
http.setHost("127.0.1.1");
http.setIdleTimeout(30000);
server.addConnector(http);
return http;
}
}