summaryrefslogtreecommitdiffstats
path: root/it/api-coverage/src
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/src
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/src')
-rw-r--r--it/api-coverage/src/test/java/io/fd/hc2vpp/it/JVppCoverageTest.java82
1 files changed, 82 insertions, 0 deletions
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;
+ }
+}