jvpp: introducing callback api and future api tests for all plugins (VPP-591)

test can be run with:
make test TEST=test_jvpp

memory_shared.c:
declaring and assigning variable in if statement
makes it usage outside statement impossible. Looks like memory
space assigned to variable declared in statement is freed when
statement ends
svm.c:
- fixed case when root path can have a "/" at beggining
- added option for test to operate over shared memory space
with /vpe-api name and not create new one with name consisting of
root path and region name which would require root permisions

Change-Id: Iff1170dc6a5c1be134c152f2757c7ab9b919a8ed
Signed-off-by: Matej Perina <mperina@cisco.com>
This commit is contained in:
Matej Perina
2017-07-18 13:59:41 +02:00
committed by Florin Coras
parent acdc306093
commit d135c19a1f
23 changed files with 861 additions and 1 deletions

View File

@ -426,7 +426,7 @@ shm_name_from_svm_map_region_args (svm_map_region_args_t * a)
if (a->name[0] == '/')
name_offset = 1;
shm_name = format (0, "/%s-%s%c", a->root_path,
shm_name = format (0, "/%s-%s%c", &a->root_path[root_path_offset],
&a->name[name_offset], 0);
}
else

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.acl.test;
import io.fd.vpp.jvpp.AbstractCallbackApiTest;
import io.fd.vpp.jvpp.acl.JVppAclImpl;
import java.util.logging.Logger;
public class CallbackApiTest extends AbstractCallbackApiTest {
private static Logger LOG = Logger.getLogger(CallbackApiTest.class.getName());
public static void main(String[] args) throws Exception {
LOG.info("Testing ControlPing using Java callback API for core plugin");
testControlPing(args[0], new JVppAclImpl());
}
}

View File

@ -0,0 +1,62 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.acl.test;
import io.fd.vpp.jvpp.Assertions;
import io.fd.vpp.jvpp.JVppRegistry;
import io.fd.vpp.jvpp.JVppRegistryImpl;
import io.fd.vpp.jvpp.acl.JVppAclImpl;
import io.fd.vpp.jvpp.acl.dto.AclDetailsReplyDump;
import io.fd.vpp.jvpp.acl.dto.AclDump;
import io.fd.vpp.jvpp.acl.future.FutureJVppAclFacade;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Logger;
public class FutureApiTest {
private static final Logger LOG = Logger.getLogger(FutureApiTest.class.getName());
public static void main(String[] args) throws Exception {
testFutureApi(args);
}
private static void testFutureApi(String[] args) throws Exception {
LOG.info("Testing Java future API for core plugin");
try (final JVppRegistry registry = new JVppRegistryImpl("FutureApiTest", args[0]);
final FutureJVppAclFacade jvppFacade = new FutureJVppAclFacade(registry, new JVppAclImpl())) {
LOG.info("Successfully connected to VPP");
testAclDump(jvppFacade);
LOG.info("Disconnecting...");
}
}
private static void testAclDump(final FutureJVppAclFacade jvpp) throws Exception {
LOG.info("Sending AclDump request...");
final AclDump request = new AclDump();
final CompletableFuture<AclDetailsReplyDump>
replyFuture = jvpp.aclDump(request).toCompletableFuture();
final AclDetailsReplyDump reply = replyFuture.get();
Assertions.assertNotNull(reply);
}
}

View File

@ -0,0 +1,4 @@
release version:
sudo java -cp build-vpp-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp-native/vpp/vpp-api/java/jvpp-acl-17.10.jar io.fd.vpp.jvpp.acl.test.[test-name]
debug version:
sudo java -cp build-vpp_debug-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-acl-17.10.jar io.fd.vpp.jvpp.acl.test.[test-name]

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.core.test;
import io.fd.vpp.jvpp.AbstractCallbackApiTest;
import io.fd.vpp.jvpp.core.JVppCoreImpl;
import java.util.logging.Logger;
public class CallbackApiTest extends AbstractCallbackApiTest {
private static Logger LOG = Logger.getLogger(CallbackApiTest.class.getName());
public static void main(String[] args) throws Exception {
LOG.info("Testing ControlPing using Java callback API for core plugin");
testControlPing(args[0], new JVppCoreImpl());
}
}

View File

@ -0,0 +1,79 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.core.test;
import io.fd.vpp.jvpp.JVppRegistry;
import io.fd.vpp.jvpp.JVppRegistryImpl;
import io.fd.vpp.jvpp.core.JVppCoreImpl;
import io.fd.vpp.jvpp.core.dto.BridgeDomainDetailsReplyDump;
import io.fd.vpp.jvpp.core.dto.BridgeDomainDump;
import io.fd.vpp.jvpp.core.dto.GetNodeIndex;
import io.fd.vpp.jvpp.core.dto.GetNodeIndexReply;
import io.fd.vpp.jvpp.core.dto.ShowVersion;
import io.fd.vpp.jvpp.core.dto.ShowVersionReply;
import io.fd.vpp.jvpp.core.dto.SwInterfaceDetails;
import io.fd.vpp.jvpp.core.dto.SwInterfaceDetailsReplyDump;
import io.fd.vpp.jvpp.core.dto.SwInterfaceDump;
import io.fd.vpp.jvpp.core.future.FutureJVppCoreFacade;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
public class FutureApiTest {
private static final Logger LOG = Logger.getLogger(FutureApiTest.class.getName());
public static void main(String[] args) throws Exception {
testFutureApi(args);
}
private static void testFutureApi(String[] args) throws Exception {
LOG.info("Testing Java future API for core plugin");
try (final JVppRegistry registry = new JVppRegistryImpl("FutureApiTest", args[0]);
final FutureJVppCoreFacade jvppFacade = new FutureJVppCoreFacade(registry, new JVppCoreImpl())) {
LOG.info("Successfully connected to VPP");
testEmptyBridgeDomainDump(jvppFacade);
LOG.info("Disconnecting...");
}
}
private static void testEmptyBridgeDomainDump(final FutureJVppCoreFacade jvpp) throws Exception {
LOG.info("Sending BridgeDomainDump request...");
final BridgeDomainDump request = new BridgeDomainDump();
request.bdId = -1; // dump call
final CompletableFuture<BridgeDomainDetailsReplyDump>
replyFuture = jvpp.bridgeDomainDump(request).toCompletableFuture();
final BridgeDomainDetailsReplyDump reply = replyFuture.get();
if (reply == null || reply.bridgeDomainDetails == null) {
throw new IllegalStateException("Received null response for empty dump: " + reply);
} else {
LOG.info(
String.format(
"Received bridge-domain dump reply with list of bridge-domains: %s",
reply.bridgeDomainDetails));
}
}
}

View File

@ -0,0 +1,18 @@
This package contains basic tests for jvpp. To run the tests:
- Make sure VPP is running
- From VPP's build-root/ folder execute:
- release version: sudo java -cp build-vpp-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp-native/vpp/vpp-api/java/jvpp-core-17.10.jar io.fd.vpp.jvpp.core.test.[test name]
- debug version: sudo java -cp build-vpp_debug-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-core-17.10.jar io.fd.vpp.jvpp.core.test.[test name]
Available tests:
CallbackApiTest - Similar to ControlPingTest, invokes more complex calls (e.g. interface dump) using low level JVpp APIs
CallbackJVppFacadeNotificationTest - Tests interface notifications using Callback based JVpp facade
CallbackJVppFacadeTest - Execution of more complex calls using Callback based JVpp facade
CallbackNotificationApiTest - Tests interface notifications using low level JVpp APIs
ControlPingTest - Simple test executing a single control ping using low level JVpp APIs
CreateSubInterfaceTest - Tests sub-interface creation
FutureApiNotificationTest - Tests interface notifications using Future based JVpp facade
FutureApiTest - Execution of more complex calls using Future based JVpp facade
L2AclTest - Tests L2 ACL creation
LispAdjacencyTest - Tests lisp adjacency creation and read (custom vpe.api type support showcase)

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.ioamexport.test;
import io.fd.vpp.jvpp.AbstractCallbackApiTest;
import io.fd.vpp.jvpp.ioamexport.JVppIoamexportImpl;
import java.util.logging.Logger;
public class CallbackApiTest extends AbstractCallbackApiTest {
private static Logger LOG = Logger.getLogger(CallbackApiTest.class.getName());
public static void main(String[] args) throws Exception {
LOG.info("Testing ControlPing using Java callback API for ioamexport plugin");
testControlPing(args[0], new JVppIoamexportImpl());
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.ioamexport.test;
import io.fd.vpp.jvpp.Assertions;
import io.fd.vpp.jvpp.JVppRegistry;
import io.fd.vpp.jvpp.JVppRegistryImpl;
import io.fd.vpp.jvpp.ioamexport.JVppIoamexportImpl;
import io.fd.vpp.jvpp.ioamexport.dto.IoamExportIp6EnableDisable;
import io.fd.vpp.jvpp.ioamexport.dto.IoamExportIp6EnableDisableReply;
import io.fd.vpp.jvpp.ioamexport.future.FutureJVppIoamexportFacade;
import java.util.concurrent.Future;
import java.util.logging.Logger;
public class FutureApiTest {
private static final Logger LOG = Logger.getLogger(FutureApiTest.class.getName());
public static void main(String[] args) throws Exception {
testCallbackApi(args);
}
private static void testCallbackApi(String[] args) throws Exception {
LOG.info("Testing Java callback API for ioamexport plugin");
try (final JVppRegistry registry = new JVppRegistryImpl("FutureApiTest", args[0]);
final FutureJVppIoamexportFacade jvpp = new FutureJVppIoamexportFacade(registry, new JVppIoamexportImpl())) {
LOG.info("Successfully connected to VPP");
testIoamExportIp6EnableDisable(jvpp);
LOG.info("Disconnecting...");
}
}
private static void testIoamExportIp6EnableDisable(FutureJVppIoamexportFacade jvpp) throws Exception {
LOG.info("Sending IoamExportIp6EnableDisable request...");
final IoamExportIp6EnableDisable request = new IoamExportIp6EnableDisable();
final Future<IoamExportIp6EnableDisableReply> replyFuture = jvpp.ioamExportIp6EnableDisable(request).toCompletableFuture();
final IoamExportIp6EnableDisableReply reply = replyFuture.get();
Assertions.assertNotNull(reply);
}
}

View File

@ -0,0 +1,4 @@
release version:
sudo java -cp build-vpp-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-ioamexport-17.10.jar io.fd.vpp.jvpp.ioamexport.test.[test-name]
debug version:
sudo java -cp build-vpp_debug-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-ioamexport-17.10.jar io.fd.vpp.jvpp.ioamexport.test.[test-name]

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.ioampot.test;
import io.fd.vpp.jvpp.AbstractCallbackApiTest;
import io.fd.vpp.jvpp.ioampot.JVppIoampotImpl;
import java.util.logging.Logger;
public class CallbackApiTest extends AbstractCallbackApiTest {
private static Logger LOG = Logger.getLogger(CallbackApiTest.class.getName());
public static void main(String[] args) throws Exception {
LOG.info("Testing ControlPing using Java callback API for ioampot plugin");
testControlPing(args[0], new JVppIoampotImpl());
}
}

View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.ioampot.test;
import io.fd.vpp.jvpp.JVppRegistry;
import io.fd.vpp.jvpp.JVppRegistryImpl;
import io.fd.vpp.jvpp.ioampot.JVppIoampotImpl;
import io.fd.vpp.jvpp.ioampot.dto.PotProfileShowConfigDetailsReplyDump;
import io.fd.vpp.jvpp.ioampot.dto.PotProfileShowConfigDump;
import io.fd.vpp.jvpp.ioampot.future.FutureJVppIoampotFacade;
import java.util.concurrent.Future;
import java.util.logging.Logger;
public class FutureApiTest {
private static final Logger LOG = Logger.getLogger(io.fd.vpp.jvpp.ioampot.test.FutureApiTest.class.getName());
public static void main(String[] args) throws Exception {
testCallbackApi(args);
}
private static void testCallbackApi(String[] args) throws Exception {
LOG.info("Testing Java callback API for ioampot plugin");
try (final JVppRegistry registry = new JVppRegistryImpl("FutureApiTest", args[0]);
final FutureJVppIoampotFacade jvpp = new FutureJVppIoampotFacade(registry, new JVppIoampotImpl())) {
LOG.info("Successfully connected to VPP");
testPotProfileShowConfigDump(jvpp);
LOG.info("Disconnecting...");
}
}
private static void testPotProfileShowConfigDump(FutureJVppIoampotFacade jvpp) throws Exception {
LOG.info("Sending PotProfileShowConfigDump request...");
final PotProfileShowConfigDump request = new PotProfileShowConfigDump();
final Future<PotProfileShowConfigDetailsReplyDump> replyFuture = jvpp.potProfileShowConfigDump(request).toCompletableFuture();
final PotProfileShowConfigDetailsReplyDump reply = replyFuture.get();
if (reply == null || reply.potProfileShowConfigDetails == null) {
throw new IllegalStateException("Received null response for empty dump: " + reply);
} else {
LOG.info(
String.format(
"Received pot profile show config dump reply: %s",
reply.potProfileShowConfigDetails));
}
}
}

View File

@ -0,0 +1,4 @@
release version:
sudo java -cp build-vpp-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-ioampot-17.10.jar io.fd.vpp.jvpp.ioampot.test.[test-name]
debug version:
sudo java -cp build-vpp_debug-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-ioampot-17.10.jar io.fd.vpp.jvpp.ioampot.test.[test-name]

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.ioamtrace.test;
import io.fd.vpp.jvpp.AbstractCallbackApiTest;
import io.fd.vpp.jvpp.ioamtrace.JVppIoamtraceImpl;
import java.util.logging.Logger;
public class CallbackApiTest extends AbstractCallbackApiTest {
private static Logger LOG = Logger.getLogger(CallbackApiTest.class.getName());
public static void main(String[] args) throws Exception {
LOG.info("Testing ControlPing using Java callback API for ioamtrace plugin");
testControlPing(args[0], new JVppIoamtraceImpl());
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.ioamtrace.test;
import io.fd.vpp.jvpp.Assertions;
import io.fd.vpp.jvpp.JVppRegistry;
import io.fd.vpp.jvpp.JVppRegistryImpl;
import io.fd.vpp.jvpp.ioamtrace.JVppIoamtraceImpl;
import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileShowConfig;
import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileShowConfigReply;
import io.fd.vpp.jvpp.ioamtrace.future.FutureJVppIoamtraceFacade;
import java.util.concurrent.Future;
import java.util.logging.Logger;
public class FutureApiTest {
private static final Logger LOG = Logger.getLogger(io.fd.vpp.jvpp.ioamtrace.test.FutureApiTest.class.getName());
public static void main(String[] args) throws Exception {
testCallbackApi(args);
}
private static void testCallbackApi(String[] args) throws Exception {
LOG.info("Testing Java callback API for ioamtrace plugin");
try (final JVppRegistry registry = new JVppRegistryImpl("FutureApiTest", args[0]);
final FutureJVppIoamtraceFacade jvpp = new FutureJVppIoamtraceFacade(registry, new JVppIoamtraceImpl())) {
LOG.info("Successfully connected to VPP");
testTraceProfileShowConfig(jvpp);
LOG.info("Disconnecting...");
}
}
private static void testTraceProfileShowConfig(FutureJVppIoamtraceFacade jvpp) throws Exception {
LOG.info("Sending TraceProfileShowConfig request...");
final TraceProfileShowConfig request = new TraceProfileShowConfig();
final Future<TraceProfileShowConfigReply> replyFuture = jvpp.traceProfileShowConfig(request).toCompletableFuture();
final TraceProfileShowConfigReply reply = replyFuture.get();
Assertions.assertNotNull(reply);
}
}

View File

@ -0,0 +1,4 @@
release version:
sudo java -cp build-vpp-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-ioamtrace-17.10.jar io.fd.vpp.jvpp.ioamtrace.test.[test-name]
debug version:
sudo java -cp build-vpp_debug-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-ioamtrace-17.10.jar io.fd.vpp.jvpp.ioamtrace.test.[test-name]

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.nat.test;
import io.fd.vpp.jvpp.AbstractCallbackApiTest;
import io.fd.vpp.jvpp.nat.JVppNatImpl;
import java.util.logging.Logger;
public class CallbackApiTest extends AbstractCallbackApiTest {
private static Logger LOG = Logger.getLogger(CallbackApiTest.class.getName());
public static void main(String[] args) throws Exception {
LOG.info("Testing ControlPing using Java callback API for core plugin");
testControlPing(args[0], new JVppNatImpl());
}
}

View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp.nat.test;
import io.fd.vpp.jvpp.JVppRegistry;
import io.fd.vpp.jvpp.JVppRegistryImpl;
import io.fd.vpp.jvpp.nat.JVppNatImpl;
import io.fd.vpp.jvpp.nat.dto.SnatAddressDetailsReplyDump;
import io.fd.vpp.jvpp.nat.dto.SnatAddressDump;
import io.fd.vpp.jvpp.nat.future.FutureJVppNatFacade;
import java.util.concurrent.Future;
import java.util.logging.Logger;
public class FutureApiTest {
private static final Logger LOG = Logger.getLogger(io.fd.vpp.jvpp.nat.test.FutureApiTest.class.getName());
public static void main(String[] args) throws Exception {
testCallbackApi(args);
}
private static void testCallbackApi(String[] args) throws Exception {
LOG.info("Testing Java callback API for snat plugin");
try (final JVppRegistry registry = new JVppRegistryImpl("FutureApiTest", args[0]);
final FutureJVppNatFacade jvpp = new FutureJVppNatFacade(registry, new JVppNatImpl())) {
LOG.info("Successfully connected to VPP");
testAclDump(jvpp);
LOG.info("Disconnecting...");
}
}
private static void testAclDump(FutureJVppNatFacade jvpp) throws Exception {
LOG.info("Sending SnatAddressDump request...");
final SnatAddressDump request = new SnatAddressDump();
final Future<SnatAddressDetailsReplyDump> replyFuture = jvpp.snatAddressDump(request).toCompletableFuture();
final SnatAddressDetailsReplyDump reply = replyFuture.get();
if (reply == null || reply.snatAddressDetails == null) {
throw new IllegalStateException("Received null response for empty dump: " + reply);
} else {
LOG.info(
String.format(
"Received snat address dump reply with list of snat address: %s",
reply.snatAddressDetails));
}
}
}

View File

@ -0,0 +1,4 @@
release version:
sudo java -cp build-vpp-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-nat-17.10.jar io.fd.vpp.jvpp.nat.test.[test-name]
debug version:
sudo java -cp build-vpp_debug-native/vpp/vpp-api/java/jvpp-registry-17.10.jar:build-vpp_debug-native/vpp/vpp-api/java/jvpp-nat-17.10.jar io.fd.vpp.jvpp.nat.test.[test-name]

View File

@ -0,0 +1,63 @@
/*
* Copyright (c) 2017 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp;
import io.fd.vpp.jvpp.callback.ControlPingCallback;
import io.fd.vpp.jvpp.dto.ControlPing;
import io.fd.vpp.jvpp.dto.ControlPingReply;
public abstract class AbstractCallbackApiTest {
private static int receivedPingCount = 0;
private static int errorPingCount = 0;
public static void testControlPing(String shm_prefix, JVpp jvpp) throws Exception {
try (JVppRegistry registry = new JVppRegistryImpl("CallbackApiTest", shm_prefix)) {
registry.register(jvpp, new ControlPingCallback() {
@Override
public void onControlPingReply(final ControlPingReply reply) {
System.out.printf("Received ControlPingReply: %s%n", reply);
receivedPingCount++;
}
@Override
public void onError(VppCallbackException ex) {
System.out.printf("Received onError exception: call=%s, reply=%d, context=%d ", ex.getMethodName(),
ex.getErrorCode(), ex.getCtxId());
errorPingCount++;
}
});
System.out.println("Successfully connected to VPP");
Thread.sleep(1000);
System.out.println("Sending control ping using JVppRegistry");
registry.controlPing(jvpp.getClass());
Thread.sleep(2000);
System.out.println("Sending control ping using JVpp plugin");
jvpp.send(new ControlPing());
Thread.sleep(2000);
System.out.println("Disconnecting...");
Assertions.assertEquals(2, receivedPingCount);
Assertions.assertEquals(0, errorPingCount);
}
}
}

View File

@ -0,0 +1,32 @@
/*
* Copyright (c) 2017 Cisco and/or its affiliates.
*
* 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 io.fd.vpp.jvpp;
public class Assertions {
public static void assertEquals(final int expected, final int actual) {
if (expected != actual) {
throw new IllegalArgumentException(String.format("Expected[%s]/Actual[%s]", expected, actual));
}
}
public static void assertNotNull(final Object value) {
if (value == null) {
throw new IllegalArgumentException("Variable is null");
}
}
}

54
test/jvpp_connection.py Normal file
View File

@ -0,0 +1,54 @@
#!/usr/bin/env python
import os
import subprocess
from vpp_papi_provider import VppPapiProvider
from threading import Timer
from framework import VppTestCase
# Api files path
API_FILES_PATH = "vpp/vpp-api/java"
# Registry jar file name prefix
REGISTRY_JAR_PREFIX = "jvpp-registry"
class TestJVppConnection(VppTestCase):
def full_jar_name(self, install_dir, jar_name, version):
return os.path.join(install_dir, API_FILES_PATH,
"{0}-{1}.jar".format(jar_name, version))
def jvpp_connection_test(self, api_jar_name, test_class_name, timeout):
install_dir = os.getenv('VPP_TEST_BUILD_DIR')
print("Install directory : {0}".format(install_dir))
version_reply = self.vapi.show_version()
version = version_reply.version.split("-")[0]
registry_jar_path = self.full_jar_name(install_dir,
REGISTRY_JAR_PREFIX, version)
print("JVpp Registry jar path : {0}".format(registry_jar_path))
api_jar_path = self.full_jar_name(install_dir, api_jar_name, version)
print("Api jar path : {0}".format(api_jar_path))
# passes shm prefix as parameter to create connection with same value
command = ["java", "-cp",
"{0}:{1}".format(registry_jar_path, api_jar_path),
test_class_name, "/{0}-vpe-api".format(self.shm_prefix)]
print("Test Command : {0}, Timeout : {1}".format(command, timeout))
self.process = subprocess.Popen(command, shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE, bufsize=1,
universal_newlines=True)
out, err = self.process.communicate()
print("Process output : {0}{1}".format(os.linesep, out))
print("Process error output : {0}{1}".format(os.linesep, err))
self.assert_equal(self.process.returncode, 0, "process return code")
def tearDown(self):
print("Tearing down jvpp test")
if self.process.poll() is None:
self.process.kill()

82
test/test_jvpp.py Normal file
View File

@ -0,0 +1,82 @@
from jvpp_connection import TestJVppConnection
class TestJVpp(TestJVppConnection):
""" JVPP Core Test Case """
def invoke_for_jvpp_core(self, api_jar_name, test_class_name):
self.jvpp_connection_test(api_jar_name=api_jar_name,
test_class_name=test_class_name,
timeout=10)
def test_vpp_core_callback_api(self):
""" JVPP Core Callback Api Test Case """
self.invoke_for_jvpp_core(api_jar_name="jvpp-core",
test_class_name="io.fd.vpp.jvpp.core.test."
"CallbackApiTest")
def test_vpp_core_future_api(self):
"""JVPP Core Future Api Test Case"""
self.invoke_for_jvpp_core(api_jar_name="jvpp-core",
test_class_name="io.fd.vpp.jvpp.core.test."
"FutureApiTest")
def test_vpp_acl_callback_api(self):
""" JVPP Acl Callback Api Test Case """
self.invoke_for_jvpp_core(api_jar_name="jvpp-acl",
test_class_name="io.fd.vpp.jvpp.acl.test."
"CallbackApiTest")
def test_vpp_acl_future_api(self):
"""JVPP Acl Future Api Test Case"""
self.invoke_for_jvpp_core(api_jar_name="jvpp-acl",
test_class_name="io.fd.vpp.jvpp.acl.test."
"FutureApiTest")
def test_vpp_ioamexport_callback_api(self):
""" JVPP Ioamexport Callback Api Test Case """
self.invoke_for_jvpp_core(api_jar_name="jvpp-ioamexport",
test_class_name="io.fd.vpp.jvpp.ioamexport."
"test.CallbackApiTest")
def test_vpp_ioamexport_future_api(self):
"""JVPP Ioamexport Future Api Test Case"""
self.invoke_for_jvpp_core(api_jar_name="jvpp-ioamexport",
test_class_name="io.fd.vpp.jvpp.ioamexport."
"test.FutureApiTest")
def test_vpp_ioampot_callback_api(self):
""" JVPP Ioampot Callback Api Test Case """
self.invoke_for_jvpp_core(api_jar_name="jvpp-ioampot",
test_class_name="io.fd.vpp.jvpp.ioampot."
"test.CallbackApiTest")
def test_vpp_ioampot_future_api(self):
"""JVPP Ioampot Future Api Test Case"""
self.invoke_for_jvpp_core(api_jar_name="jvpp-ioampot",
test_class_name="io.fd.vpp.jvpp.ioampot."
"test.FutureApiTest")
def test_vpp_ioamtrace_callback_api(self):
""" JVPP Ioamtrace Callback Api Test Case """
self.invoke_for_jvpp_core(api_jar_name="jvpp-ioamtrace",
test_class_name="io.fd.vpp.jvpp.ioamtrace."
"test.CallbackApiTest")
def test_vpp_ioamtrace_future_api(self):
"""JVPP Ioamtrace Future Api Test Case"""
self.invoke_for_jvpp_core(api_jar_name="jvpp-ioamtrace",
test_class_name="io.fd.vpp.jvpp.ioamtrace."
"test.FutureApiTest")
def test_vpp_snat_callback_api(self):
""" JVPP Snat Callback Api Test Case """
self.invoke_for_jvpp_core(api_jar_name="jvpp-nat",
test_class_name="io.fd.vpp.jvpp.nat.test."
"CallbackApiTest")
def test_vpp_snat_future_api(self):
"""JVPP Snat Future Api Test Case"""
self.invoke_for_jvpp_core(api_jar_name="jvpp-nat",
test_class_name="io.fd.vpp.jvpp.nat.test."
"FutureApiTest")