blob: 8e47f190a015b5983fb15f3d63444900ff61abd0 [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.cassandra.sidecar.utils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.vertx.ext.web.handler.HttpException;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Test validation methods.
*/
public class CassandraInputValidatorTest
{
CassandraInputValidator instance;
@BeforeEach
void setup()
{
instance = new CassandraInputValidator();
}
@ParameterizedTest(name = "[{0}]")
@ValueSource(strings = { "test_table_name", "\"test_table_name\"", "testTableName", "\"testTableName\"", "a_",
"\"cycling\"", "\"Helmets\"", "\"mIxEd_cAsE\"", "a8", "a", "\"8a\"",
"\"_must_begin_with_alphabetic_unless_quoted_p\"" })
public void testValidTableNameValidation(String tableName)
{
instance.validateTableName(tableName);
}
@ParameterizedTest(name = "[{0}]")
@ValueSource(strings = { "", "test table", "_must_begin_with_alphabetic", "dash-is-not-allowed", "\"\"", "\"",
"\"inv@lid_chars\"", "test:table_name", "test-table$name", "8a", "testTable/Name" })
public void failsWithInvalidTableName(String tableName)
{
HttpException httpEx = Assertions.assertThrows(HttpException.class,
() -> instance.validateTableName(tableName));
assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
assertThat(httpEx.getPayload()).isEqualTo("Invalid characters in table name: " + tableName);
}
@ParameterizedTest(name = "[{0}]")
@ValueSource(strings = { "SystemViews", "system_views_test", "\"keyspace\"", "\"cycling\"", "\"Cycling\"",
"\"mIxEd_cAsE\"", "a8", "a", "a_", "\"_a\"" })
public void testValidKeyspaceValidation(String keyspace)
{
instance.validateKeyspaceName(keyspace);
}
@ParameterizedTest(name = "[{0}]")
@ValueSource(strings = { "system_schema",
"system_traces",
"system_distributed",
"system",
"system_auth",
"system_views",
"system_virtual_schema" })
public void failsWithForbiddenKeyspace(String keyspace)
{
HttpException httpEx = Assertions.assertThrows(HttpException.class,
() -> instance.validateKeyspaceName(keyspace));
assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.FORBIDDEN.code());
assertThat(httpEx.getPayload()).isEqualTo("Forbidden keyspace: " + keyspace);
}
@ParameterizedTest(name = "[{0}]")
@ValueSource(strings = { "", "test keyspace", "_cycling", "dash-is-not-allowed", "\"\"", "\"",
"\"inv@lid_chars\"", "8a" })
public void failsWithInvalidKeyspaceName(String keyspace)
{
HttpException httpEx = Assertions.assertThrows(HttpException.class,
() -> instance.validateKeyspaceName(keyspace));
assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
assertThat(httpEx.getPayload()).isEqualTo("Invalid characters in keyspace: " + keyspace);
}
@Test
public void testValidateFileName_validFileNames_expectNoException()
{
instance.validateComponentName("test-file-name.db");
instance.validateComponentName("test_file_name.json");
instance.validateComponentName("testFileName.cql");
instance.validateComponentName("t_TOC.txt");
instance.validateComponentName("crcfile.crc32");
}
private void testCommon_testInvalidFileName(String testFileName)
{
HttpException httpEx = Assertions.assertThrows(HttpException.class,
() -> instance.validateComponentName(testFileName));
assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
assertThat(httpEx.getPayload()).isEqualTo("Invalid component name: " + testFileName);
}
@Test
public void testValidateFileName_withoutExtension_expectException()
{
testCommon_testInvalidFileName("test-file-name");
}
@Test
public void testValidateFileName_incorrectExtension_expectException()
{
testCommon_testInvalidFileName("test-file-name.db1");
}
@Test
public void testValidateFileName_incorrectCrcExtension_expectException()
{
testCommon_testInvalidFileName("crcfile.crc64");
}
@Test
public void testValidateFileName_withoutFileName_expectException()
{
testCommon_testInvalidFileName("TOC.txt");
}
@Test
public void testValidateSnapshotName_validSnapshotNames_expectNoException()
{
instance.validateSnapshotName("valid-snapshot-name");
instance.validateSnapshotName("valid\\snapshot\\name");
instance.validateSnapshotName("valid:snapshot:name");
instance.validateSnapshotName("valid$snapshot$name");
instance.validateSnapshotName("valid snapshot name");
}
@Test
public void testValidateSnapshotName_snapshotNameWithSlash_expectException()
{
String testSnapName = "valid" + '/' + "snapshotname";
HttpException httpEx = Assertions.assertThrows(HttpException.class,
() -> instance.validateSnapshotName(testSnapName));
assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
assertThat(httpEx.getPayload()).isEqualTo("Invalid characters in snapshot name: " + testSnapName);
}
@Test
public void testValidateSnapshotName_snapshotNameWithNullChar_expectException()
{
String testSnapName = "valid" + '\0' + "snapshotname";
HttpException httpEx = Assertions.assertThrows(HttpException.class,
() -> instance.validateSnapshotName(testSnapName));
assertThat(httpEx.getStatusCode()).isEqualTo(HttpResponseStatus.BAD_REQUEST.code());
assertThat(httpEx.getPayload()).isEqualTo("Invalid characters in snapshot name: " + testSnapName);
}
}