summaryrefslogtreecommitdiffstats
path: root/it/api-coverage
diff options
context:
space:
mode:
authorMarek Gradzki <mgradzki@cisco.com>2017-03-06 10:42:47 +0100
committerMarek Gradzki <mgradzki@cisco.com>2017-05-10 12:42:56 +0000
commit9129ae7114c4215f5b61da4fd8360755127f815e (patch)
treefea6dd921274b8f6d0ca9cb0e407b87793fbc6ac /it/api-coverage
parentb663b44d862d366c722466ecfb7db1231ff01ccd (diff)
Adds integration test that measures VPP API coverage
Run using: mvn test -pl it/api-coverage -Papi-coverage Change-Id: I6d708ca867a83e49522947b571304c4666bf65b5 Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
Diffstat (limited to 'it/api-coverage')
-rw-r--r--it/api-coverage/asciidoc/Readme.adoc8
-rw-r--r--it/api-coverage/pom.xml85
-rw-r--r--it/api-coverage/src/test/java/io/fd/hc2vpp/it/JVppCoverageTest.java82
3 files changed, 175 insertions, 0 deletions
diff --git a/it/api-coverage/asciidoc/Readme.adoc b/it/api-coverage/asciidoc/Readme.adoc
new file mode 100644
index 000000000..51cb2c0b7
--- /dev/null
+++ b/it/api-coverage/asciidoc/Readme.adoc
@@ -0,0 +1,8 @@
+= api-coverage
+
+Provides integration test that measures VPP API coverage.
+To run the test, invoke:
+
+mvn test -pl it/api-coverage -Papi-coverage
+
+The test counts number of usages of each api method defined in jvpp jars. \ No newline at end of file
diff --git a/it/api-coverage/pom.xml b/it/api-coverage/pom.xml
new file mode 100644
index 000000000..4c939ffeb
--- /dev/null
+++ b/it/api-coverage/pom.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>io.fd.hc2vpp.common</groupId>
+ <artifactId>impl-parent</artifactId>
+ <version>1.17.07-SNAPSHOT</version>
+ <relativePath>../../common/impl-parent</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>io.fd.hc2vpp.it</groupId>
+ <artifactId>api-coverage</artifactId>
+ <version>1.17.07-SNAPSHOT</version>
+ <name>${project.artifactId}</name>
+
+ <properties>
+ <jvpp.version>17.07-SNAPSHOT</jvpp.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>io.fd.vpp</groupId>
+ <artifactId>jvpp-registry</artifactId>
+ <version>${jvpp.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.fd.vpp</groupId>
+ <artifactId>jvpp-core</artifactId>
+ <version>${jvpp.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.fd.vpp</groupId>
+ <artifactId>jvpp-acl</artifactId>
+ <version>${jvpp.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.fd.vpp</groupId>
+ <artifactId>jvpp-snat</artifactId>
+ <version>${jvpp.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.fd.vpp</groupId>
+ <artifactId>jvpp-ioamtrace</artifactId>
+ <version>${jvpp.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.fd.vpp</groupId>
+ <artifactId>jvpp-ioamexport</artifactId>
+ <version>${jvpp.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.fd.vpp</groupId>
+ <artifactId>jvpp-ioampot</artifactId>
+ <version>${jvpp.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.skinny-framework</groupId>
+ <artifactId>skinny-logback</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project> \ No newline at end of file
diff --git a/it/api-coverage/src/test/java/io/fd/hc2vpp/it/JVppCoverageTest.java b/it/api-coverage/src/test/java/io/fd/hc2vpp/it/JVppCoverageTest.java
new file mode 100644
index 000000000..406cd0189
--- /dev/null
+++ b/it/api-coverage/src/test/java/io/fd/hc2vpp/it/JVppCoverageTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.hc2vpp.it;
+
+import io.fd.vpp.jvpp.acl.JVppAcl;
+import io.fd.vpp.jvpp.core.JVppCore;
+import io.fd.vpp.jvpp.ioamexport.JVppIoamexport;
+import io.fd.vpp.jvpp.ioampot.JVppIoampot;
+import io.fd.vpp.jvpp.ioamtrace.JVppIoamtrace;
+import io.fd.vpp.jvpp.snat.JVppSnat;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.Scanner;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JVppCoverageTest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(JVppCoverageTest.class);
+
+ @Test
+ public void coverageTest() throws IOException {
+ final Class[] apis = new Class[] {
+ JVppCore.class,
+ JVppAcl.class,
+ JVppSnat.class,
+ JVppIoamtrace.class,
+ JVppIoamexport.class,
+ JVppIoampot.class
+ };
+ int covered = 0;
+ int methods = 0;
+ for (Class api : apis) {
+ final Method[] declaredMethods = api.getDeclaredMethods();
+ methods += declaredMethods.length - 1; // excluding send method
+ covered += coverage(api, declaredMethods);
+ }
+ LOG.info("#methods={} covered={} ({}%)", methods, covered, (100.0 * covered) / methods);
+ }
+
+ private static int coverage(final Class api, final Method[] methods) throws IOException {
+ int covered = 0;
+ int nMethods = methods.length - 1; // excluding send method
+ for (Method method : methods) {
+ LOG.info(method.getName());
+ if (isMethodCovered(method.getName())) {
+ covered++;
+ }
+ }
+ covered--; // excluding send
+ LOG.info("{}: #methods={} covered={} ({}%)", api, nMethods, covered, (100.0 * covered) / nMethods);
+ return covered;
+ }
+
+ private static boolean isMethodCovered(final String name) throws IOException {
+ final Runtime rt = Runtime.getRuntime();
+ // TODO (grep per api name is slow):
+ // scan all java files for jvpp invocations, make a set/map and use it for usage lookup
+ final String[] cmd =
+ {"/bin/sh", "-c", "grep -rn /home/m/hc2vpp --include *.java -rn . -e \"" + name + "\" | wc -l"};
+ final Process proc = rt.exec(cmd);
+ final Scanner sc = new Scanner(proc.getInputStream());
+ final int nRefs = sc.nextInt();
+ LOG.info("Method {} was referenced {}", name, nRefs);
+ return nRefs > 0;
+ }
+}