/*
* Copyright 2014-2016 CyberVision, Inc.
*
* Licensed 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.kaaproject.kaa.server.control;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.apache.avro.Schema;
import org.apache.avro.Schema.Parser;
import org.junit.Assert;
import org.junit.Test;
import org.kaaproject.avro.ui.shared.FqnVersion;
import org.kaaproject.kaa.common.dto.ApplicationDto;
import org.kaaproject.kaa.common.dto.ctl.CTLSchemaDto;
import org.kaaproject.kaa.common.dto.ctl.CTLSchemaExportMethod;
import org.kaaproject.kaa.common.dto.ctl.CtlSchemaMetaInfoDto;
import org.kaaproject.kaa.common.dto.ctl.CTLSchemaScopeDto;
import org.kaaproject.kaa.common.dto.file.FileData;
import org.springframework.http.HttpStatus;
import org.springframework.web.client.HttpClientErrorException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author Bohdan Khablenko
* @since v0.8.0
*/
public class ControlServerCTLSchemaIT extends AbstractTestControlServer {
/**
* Saves a CTL schema to the database.
*/
@Test
public void saveCTLSchemaTest() throws Exception {
this.loginKaaAdmin();
CTLSchemaDto beta = client.saveCTLSchemaWithAppToken(getResourceAsString(TEST_CTL_SCHEMA_BETA), null, null);
Assert.assertNotNull(beta.getId());
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto alpha = client.saveCTLSchemaWithAppToken(getResourceAsString(TEST_CTL_SCHEMA_ALPHA), tenantDeveloperDto.getTenantId(), null);
Assert.assertNotNull(alpha.getId());
}
/**
* Saves a CTL schema with incorrect version to the database.
*/
@Test(expected = HttpClientErrorException.class)
public void saveCTLSchemaWithWrongVerionTest() throws Exception {
this.loginKaaAdmin();
CTLSchemaDto gamma = client.saveCTLSchemaWithAppToken(getResourceAsString(TEST_CTL_SCHEMA_GAMMA), null, null);
}
/**
* Saves a CTL schema with application token with incorrect version to the database.
*/
@Test(expected = HttpClientErrorException.class)
public void saveCTLSchemaWithAppTokenAndWrongVerionTest() throws Exception {
this.loginKaaAdmin();
CTLSchemaDto gamma = client.saveCTLSchemaWithAppToken(getResourceAsString(TEST_CTL_SCHEMA_GAMMA), null, null);
}
/**
* Tries to save a CTL schema with a dependency that is missing from the
* database. (This action is prohibited).
*/
@Test
public void saveCTLSchemaWithMissingDependenciesTest() throws Exception {
// Declare a dependency
String dependencyFqn = CTL_DEFAULT_NAMESPACE + "." + this.ctlRandomFieldType();
Integer dependencyVersion = 1;
final Set<FqnVersion> dependencies = new HashSet<>();
dependencies.add(new FqnVersion(dependencyFqn, dependencyVersion));
// Map a CTL schema field name to its type
final Map<String, String> fields = new HashMap<>();
fields.put(this.ctlRandomFieldName(), dependencyFqn);
this.loginTenantDeveloper(tenantDeveloperUser);
this.checkBadRequest(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
createCTLSchema(ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, dependencies, fields);
}
});
}
/**
* Removes a CTL schema from the database by its fully qualified name and
* version number.
*/
@Test
public void deleteCTLSchemaByFqnAndVersionTest() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
final CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
client.deleteCTLSchemaByFqnVersionTenantIdAndApplicationToken(saved.getMetaInfo().getFqn(), saved.getVersion(), tenantDeveloperDto.getTenantId(), null);
this.checkNotFound(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.getCTLSchemaByFqnVersionTenantIdAndApplicationToken(
saved.getMetaInfo().getFqn(), saved.getVersion(), tenantDeveloperDto.getTenantId(), null);
}
});
}
/**
* Removes a CTL schema from the database by its fully qualified name and
* version number.
*/
@Test
public void deleteCTLSchemaByAppTokenByFqnAndVersionTest() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
final CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
client.deleteCTLSchemaByFqnVersionTenantIdAndApplicationToken(saved.getMetaInfo().getFqn(), saved.getVersion(), tenantDeveloperDto.getTenantId(), null);
this.checkNotFound(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.getCTLSchemaByFqnVersionTenantIdAndApplicationToken(saved.getMetaInfo().getFqn(), saved.getVersion(), tenantDeveloperDto.getTenantId(), null);
}
});
}
/**
* Tries to remove a CTL schema that is referenced by something else. (This
* action is prohibited).
*/
@Test
public void deleteCTLSchemaWithDependents() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
final CTLSchemaDto dependency = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
Set<FqnVersion> dependencies = new HashSet<>();
dependencies.add(new FqnVersion(dependency.getMetaInfo().getFqn(), dependency.getVersion()));
Map<String, String> fields = new HashMap<>();
fields.put(this.ctlRandomFieldName(), dependency.getMetaInfo().getFqn());
this.createCTLSchema(this.ctlRandomFieldName(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, dependencies, fields);
this.checkBadRequest(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.deleteCTLSchemaByFqnVersionTenantIdAndApplicationToken(
dependency.getMetaInfo().getFqn(), dependency.getVersion(), tenantDeveloperDto.getTenantId(), null);
}
});
}
/**
* Tries to remove a CTL schema that is referenced by something else. (This
* action is prohibited).
*/
@Test
public void deleteCTLSchemaByAppTokenWithDependents() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
final CTLSchemaDto dependency = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(),
null, null, null);
Set<FqnVersion> dependencies = new HashSet<>();
dependencies.add(new FqnVersion(dependency.getMetaInfo().getFqn(), dependency.getVersion()));
Map<String, String> fields = new HashMap<>();
fields.put(this.ctlRandomFieldName(), dependency.getMetaInfo().getFqn());
this.createCTLSchema(this.ctlRandomFieldName(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, dependencies, fields);
this.checkBadRequest(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.deleteCTLSchemaByFqnVersionTenantIdAndApplicationToken(dependency.getMetaInfo().getFqn(), dependency.getVersion(),
tenantDeveloperDto.getTenantId(), null);
}
});
}
/**
* Tries to remove a system CTL schema by its fully qualified name and
* version number as a regular user. (This action is prohibited).
*/
@Test
public void deleteSystemCTLSchemaByFqnAndVersionTest() throws Exception {
this.loginKaaAdmin();
final CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, null, null, null, null);
this.loginTenantDeveloper(tenantDeveloperUser);
this.checkForbidden(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.deleteCTLSchemaByFqnVersionTenantIdAndApplicationToken(saved.getMetaInfo().getFqn(), saved.getVersion(), null, null);
}
});
}
/**
* Tries to remove a system CTL schema by its fully qualified name and
* version number as a regular user. (This action is prohibited).
*/
@Test
public void deleteSystemCTLSchemaByAppTokenByFqnAndVersionTest() throws Exception {
this.loginKaaAdmin();
final CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, null, null, null, null);
this.loginTenantDeveloper(tenantDeveloperUser);
this.checkForbidden(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.deleteCTLSchemaByFqnVersionTenantIdAndApplicationToken(saved.getMetaInfo().getFqn(), saved.getVersion(), null, null);
}
});
}
/**
* Retrieves a CTL schema by its fully qualified name and version number.
*/
@Test
public void getCTLSchemaByFqnAndVersionTest() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
CTLSchemaDto loaded = client.getCTLSchemaByFqnVersionTenantIdAndApplicationToken(
saved.getMetaInfo().getFqn(), saved.getVersion(), tenantDeveloperDto.getTenantId(), null);
Assert.assertNotNull(loaded);
Assert.assertEquals(saved, loaded);
}
/**
* Retrieves a CTL schema by its fully qualified name and version number.
*/
@Test
public void getCTLSchemaWithAppTokenByFqnAndVersionTest() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
CTLSchemaDto loaded = client.getCTLSchemaByFqnVersionTenantIdAndApplicationToken(saved.getMetaInfo().getFqn(), saved.getVersion(),
tenantDeveloperDto.getTenantId(), null);
Assert.assertNotNull(loaded);
Assert.assertEquals(saved, loaded);
}
/**
* Retrieves a system CTL schema by its fully qualified name and version
* number as a regular user.
*/
@Test
public void getSystemCTLSchemaByFqnAndVersionTest() throws Exception {
this.loginKaaAdmin();
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, null, null, null, null);
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto loaded = client.getCTLSchemaByFqnVersionTenantIdAndApplicationToken(saved.getMetaInfo().getFqn(), saved.getVersion(), null, null);
Assert.assertNotNull(loaded);
Assert.assertEquals(saved, loaded);
}
/**
* Retrieves a system CTL schema by its fully qualified name and version
* number as a regular user.
*/
@Test
public void getSystemCTLSchemaWithAppTokenByFqnAndVersionTest() throws Exception {
this.loginKaaAdmin();
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, null, null, null, null);
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto loaded = client.getCTLSchemaByFqnVersionTenantIdAndApplicationToken(saved.getMetaInfo().getFqn(), saved.getVersion(), null, null);
Assert.assertNotNull(loaded);
Assert.assertEquals(saved, loaded);
}
/**
* Retrieves a CTL schema by its id.
*/
@Test
public void getCTLSchemaByIdTest() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
CTLSchemaDto loaded = client.getCTLSchemaById(saved.getId());
Assert.assertNotNull(loaded);
Assert.assertEquals(saved, loaded);
}
@Test
public void getCTLFlatSchemaByIdTest() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
CTLSchemaDto loaded = client.getCTLSchemaById(saved.getId());
String savedFlatSchema = ctlService.flatExportAsString(saved);
String loadedFlatSchema = client.getFlatSchemaByCtlSchemaId(loaded.getId());
Assert.assertNotNull(loaded);
Assert.assertEquals(savedFlatSchema, loadedFlatSchema);
}
/**
* Retrieves a CTL schema by its id.
*/
@Test
public void downloadCtlSchemaTest() throws Exception {
ApplicationDto application = createApplication(tenantAdminDto);
this.loginTenantDeveloper(tenantDeveloperUser);
String name = this.ctlRandomFieldType();
CTLSchemaDto saved = this.createCTLSchema(name, CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), application.getApplicationToken(),
null, null);
FileData fd = client.downloadCtlSchemaByAppToken(client.getCTLSchemaById(saved.getId()), CTLSchemaExportMethod.FLAT, application.getApplicationToken());
Assert.assertNotNull(fd);
Schema loaded = new Parser().parse(new String(fd.getFileData()));
Assert.assertEquals(name, loaded.getName());
}
/**
* Check existence of CTL schema with same fqn and another scope
*/
@Test
public void checkCTLFqnExistsTest() throws Exception {
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
String fqn = saved.getMetaInfo().getFqn();
boolean result = client.checkFqnExistsWithAppToken(fqn, tenantDeveloperDto.getTenantId(), null);
Assert.assertFalse(result);
result = client.checkFqnExistsWithAppToken(fqn, null, null);
Assert.assertFalse(result);
ApplicationDto application1 = createApplication(tenantAdminDto);
ApplicationDto application2 = createApplication(tenantAdminDto);
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto schema1 = this.createCTLSchema("TestAppFqn1", CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(),
application1.getApplicationToken(), null, null);
this.createCTLSchema("TestAppFqn1", CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), application2.getApplicationToken(), null, null);
fqn = schema1.getMetaInfo().getFqn();
result = client.checkFqnExistsWithAppToken(fqn, tenantDeveloperDto.getTenantId(), application1.getApplicationToken());
Assert.assertTrue(result);
result = client.checkFqnExistsWithAppToken(fqn, tenantDeveloperDto.getTenantId(), application2.getApplicationToken());
Assert.assertTrue(result);
result = client.checkFqnExistsWithAppToken(fqn, tenantDeveloperDto.getTenantId(), null);
Assert.assertFalse(result);
}
@Test
public void updateCTLSchemaScopeTest() throws Exception {
ApplicationDto application = createApplication(tenantAdminDto);
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(),
application.getApplicationToken(), null, null);
CtlSchemaMetaInfoDto metaInfo = saved.getMetaInfo();
CtlSchemaMetaInfoDto updatedMetaInfo = client.promoteScopeToTenant(metaInfo.getApplicationId(), metaInfo.getFqn());
Assert.assertNull(updatedMetaInfo.getApplicationId());
Assert.assertNotNull(updatedMetaInfo.getTenantId());
Assert.assertEquals(tenantDeveloperDto.getTenantId(), updatedMetaInfo.getTenantId());
Assert.assertEquals(CTLSchemaScopeDto.TENANT, updatedMetaInfo.getScope());
}
@Test
public void promoteScopeToTenantNotFoundTest() throws Exception {
ApplicationDto application = createApplication(tenantAdminDto);
this.loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(), null, null, null);
final CtlSchemaMetaInfoDto metaInfo2 = saved.getMetaInfo();
Assert.assertNull(metaInfo2.getApplicationId());
metaInfo2.setApplicationId(application.getId());
this.checkRestErrorStatusCode(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.promoteScopeToTenant(metaInfo2.getApplicationId(), metaInfo2.getFqn());
}
}, HttpStatus.NOT_FOUND);
}
@Test
public void promoteScopeToTenantForbiddenTest() throws Exception {
ApplicationDto application = createApplication(tenantAdminDto);
;
this.loginTenantAdmin(tenantAdminUser);
CTLSchemaDto saved = this.createCTLSchema(this.ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantAdminDto.getTenantId(), null, null, null);
final CtlSchemaMetaInfoDto metaInfo3 = saved.getMetaInfo();
Assert.assertNull(metaInfo3.getApplicationId());
metaInfo3.setApplicationId(application.getId());
this.checkForbidden(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.promoteScopeToTenant(metaInfo3.getApplicationId(), metaInfo3.getFqn());
}
});
}
@Test
public void promoteScopeToTenantWithDependenciesInAppScopeTest() throws Exception {
ApplicationDto application = createApplication(tenantAdminDto);
loginTenantDeveloper(tenantDeveloperUser);
CTLSchemaDto dep = createCTLSchema(ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(),
application.getApplicationToken(), null, null);
String fqn = dep.getMetaInfo().getFqn();
int version = dep.getVersion();
Map<String, String> fields = ImmutableMap.of("test", fqn);
Set<FqnVersion> deps = ImmutableSet.of(new FqnVersion(fqn, version));
CTLSchemaDto schema = createCTLSchema(ctlRandomFieldType(), CTL_DEFAULT_NAMESPACE, 1, tenantDeveloperDto.getTenantId(),
application.getApplicationToken(), deps, fields);
final CtlSchemaMetaInfoDto metaInfo = schema.getMetaInfo();
checkRestErrorStatusCode(new TestRestCall() {
@Override
public void executeRestCall() throws Exception {
client.promoteScopeToTenant(metaInfo.getApplicationId(), metaInfo.getFqn());
}
}, HttpStatus.CONFLICT);
}
}