/**
* 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.parser;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.testng.internal.junit.ArrayAsserts;
import svnserver.parser.token.*;
import svnserver.server.msg.ClientInfo;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* Тесты для проверки парсера.
*
* @author Artem V. Navrotskiy <bozaro@users.noreply.github.com>
*/
public class SvnServerParserTest {
@SuppressWarnings("MagicNumber")
@Test
public void testSimpleParse() throws IOException {
try (InputStream stream = new ByteArrayInputStream("( word 22 10:string 1:x 1: 8:Тест ( sublist ) ) ".getBytes(StandardCharsets.UTF_8))) {
final SvnServerParser parser = new SvnServerParser(stream);
Assert.assertEquals(parser.readToken(), ListBeginToken.instance);
Assert.assertEquals(parser.readToken(), new WordToken("word"));
Assert.assertEquals(parser.readToken(), new NumberToken(22));
Assert.assertEquals(parser.readToken(), new StringToken("string 1:x"));
Assert.assertEquals(parser.readToken(), new StringToken(" "));
Assert.assertEquals(parser.readToken(), new StringToken("Тест"));
Assert.assertEquals(parser.readToken(), ListBeginToken.instance);
Assert.assertEquals(parser.readToken(), new WordToken("sublist"));
Assert.assertEquals(parser.readToken(), ListEndToken.instance);
Assert.assertEquals(parser.readToken(), ListEndToken.instance);
try {
parser.readToken();
Assert.fail();
} catch (EOFException ignored) {
}
}
}
@SuppressWarnings("MagicNumber")
@Test
public void testSimpleParseSmallBuffer() throws IOException {
try (InputStream stream = new ByteArrayInputStream("( word 22 10:string 1:x 1: 8:Тест ( sublist ) ) ".getBytes(StandardCharsets.UTF_8))) {
final SvnServerParser parser = new SvnServerParser(stream, 10);
Assert.assertEquals(parser.readToken(), ListBeginToken.instance);
Assert.assertEquals(parser.readToken(), new WordToken("word"));
Assert.assertEquals(parser.readToken(), new NumberToken(22));
Assert.assertEquals(parser.readToken(), new StringToken("string 1:x"));
Assert.assertEquals(parser.readToken(), new StringToken(" "));
Assert.assertEquals(parser.readToken(), new StringToken("Тест"));
Assert.assertEquals(parser.readToken(), ListBeginToken.instance);
Assert.assertEquals(parser.readToken(), new WordToken("sublist"));
Assert.assertEquals(parser.readToken(), ListEndToken.instance);
Assert.assertEquals(parser.readToken(), ListEndToken.instance);
try {
parser.readToken();
Assert.fail();
} catch (EOFException ignored) {
}
}
}
@Test
public void test2dString() throws IOException {
try (InputStream stream = new ByteArrayInputStream("( ( 1:a ) ( 1:b ) )".getBytes(StandardCharsets.UTF_8))) {
final SvnServerParser parser = new SvnServerParser(stream);
final String[][] actual = MessageParser.parse(String[][].class, parser);
ArrayAsserts.assertArrayEquals(new String[][]{
new String[]{"a"},
new String[]{"b"},
}, actual);
}
}
@Test
public void testMessageParse() throws IOException {
try (InputStream stream = new ByteArrayInputStream("( 2 ( edit-pipeline svndiff1 absent-entries depth mergeinfo log-revprops ) 15:svn://localhost 31:SVN/1.8.8 (x86_64-pc-linux-gnu) ( ) ) test ".getBytes(StandardCharsets.UTF_8))) {
final SvnServerParser parser = new SvnServerParser(stream);
ClientInfo req = MessageParser.parse(ClientInfo.class, parser);
Assert.assertEquals(req.getProtocolVersion(), 2);
Assert.assertEquals(req.getUrl().toString(), "svn://localhost");
Assert.assertEquals(req.getUserAgent(), "SVN/1.8.8 (x86_64-pc-linux-gnu)");
ArrayAsserts.assertArrayEquals(new String[]{
"edit-pipeline",
"svndiff1",
"absent-entries",
"depth",
"mergeinfo",
"log-revprops"
}, req.getCapabilities());
Assert.assertEquals(parser.readText(), "test");
}
}
@Test
public void testMessageParse2() throws IOException {
try (InputStream stream = new ByteArrayInputStream("( 2 ( edit-pipeline svndiff1 absent-entries depth mergeinfo log-revprops ) 15:svn://localhost ) test ".getBytes(StandardCharsets.UTF_8))) {
final SvnServerParser parser = new SvnServerParser(stream);
ClientInfo req = MessageParser.parse(ClientInfo.class, parser);
Assert.assertEquals(req.getProtocolVersion(), 2);
Assert.assertEquals(req.getUrl().toString(), "svn://localhost");
Assert.assertEquals(req.getUserAgent(), "");
ArrayAsserts.assertArrayEquals(new String[]{
"edit-pipeline",
"svndiff1",
"absent-entries",
"depth",
"mergeinfo",
"log-revprops"
}, req.getCapabilities());
Assert.assertEquals(parser.readText(), "test");
}
}
@Test
public void testBinaryData() throws IOException {
@SuppressWarnings("MagicNumber") final byte[] data = new byte[0x100];
for (int i = 0; i < data.length; ++i) {
data[i] = (byte) i;
}
final byte[] streamData;
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
final SvnServerWriter writer = new SvnServerWriter(outputStream);
writer.write(new StringToken(data));
writer.write(new StringToken(data));
writer.write(new WordToken("end"));
streamData = outputStream.toByteArray();
}
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(streamData)) {
final SvnServerParser parser = new SvnServerParser(inputStream);
Assert.assertEquals(parser.readToken(), new StringToken(data));
Assert.assertEquals(parser.readToken(), new StringToken(data));
Assert.assertEquals(parser.readToken(), new WordToken("end"));
}
}
}