sgsn/test: Add VTY tests for the SGSN

This patch adds some basic SGSN tests to vty_test_runner.py:
- check for config tree nodes
- check specific show commands

Sponsored-by: On-Waves ehf
diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py
index 10e1ae4..82c0871 100644
--- a/openbsc/tests/vty_test_runner.py
+++ b/openbsc/tests/vty_test_runner.py
@@ -677,6 +677,51 @@
         self.assert_(res.find('Deleted 0 BVC') >= 0)
         self.assert_(res.find('Deleted 0 NS-VC') >= 0)
 
+class TestVTYSGSN(TestVTYGenericBSC):
+
+    def vty_command(self):
+        return ["./src/gprs/osmo-sgsn", "-c",
+                "doc/examples/osmo-sgsn/osmo-sgsn.cfg"]
+
+    def vty_app(self):
+        return (4245, "./src/gprs/osmo-sgsn", "OsmoSGSN", "sgsn")
+
+    def testVtyTree(self):
+        self.vty.enable()
+        self.assertTrue(self.vty.verify('configure terminal', ['']))
+        self.assertEquals(self.vty.node(), 'config')
+        self.checkForEndAndExit()
+        self.assertTrue(self.vty.verify('ns', ['']))
+        self.assertEquals(self.vty.node(), 'config-ns')
+        self.checkForEndAndExit()
+        self.assertTrue(self.vty.verify('exit', ['']))
+        self.assertEquals(self.vty.node(), 'config')
+        self.assertTrue(self.vty.verify('sgsn', ['']))
+        self.assertEquals(self.vty.node(), 'config-sgsn')
+        self.checkForEndAndExit()
+        self.assertTrue(self.vty.verify('exit', ['']))
+        self.assertEquals(self.vty.node(), 'config')
+
+    def testVtyShow(self):
+        res = self.vty.command("show ns")
+        self.assert_(res.find('Encapsulation NS-UDP-IP') >= 0)
+        self.assertTrue(self.vty.verify('show bssgp', ['']))
+        self.assertTrue(self.vty.verify('show bssgp stats', ['']))
+        # TODO: uncomment when the command does not segfault anymore
+        # self.assertTrue(self.vty.verify('show bssgp nsei 123', ['']))
+        # self.assertTrue(self.vty.verify('show bssgp nsei 123 stats', ['']))
+
+        self.assertTrue(self.vty.verify('show sgsn', ['']))
+        self.assertTrue(self.vty.verify('show mm-context all', ['']))
+        self.assertTrue(self.vty.verify('show mm-context imsi 000001234567', ['No MM context for IMSI 000001234567']))
+        self.assertTrue(self.vty.verify('show pdp-context all', ['']))
+
+        res = self.vty.command("show sndcp")
+        self.assert_(res.find('State of SNDCP Entities') >= 0)
+
+        res = self.vty.command("show llc")
+        self.assert_(res.find('State of LLC Entities') >= 0)
+
 def add_nat_test(suite, workdir):
     if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")):
         print("Skipping the NAT test")
@@ -698,6 +743,13 @@
     test = unittest.TestLoader().loadTestsFromTestCase(TestVTYGbproxy)
     suite.addTest(test)
 
+def add_sgsn_test(suite, workdir):
+    if not os.path.isfile(os.path.join(workdir, "src/gprs/osmo-sgsn")):
+        print("Skipping the SGSN test")
+        return
+    test = unittest.TestLoader().loadTestsFromTestCase(TestVTYSGSN)
+    suite.addTest(test)
+
 if __name__ == '__main__':
     import argparse
     import sys
@@ -732,5 +784,6 @@
     add_bsc_test(suite, workdir)
     add_nat_test(suite, workdir)
     add_gbproxy_test(suite, workdir)
+    add_sgsn_test(suite, workdir)
     res = unittest.TextTestRunner(verbosity=verbose_level).run(suite)
     sys.exit(len(res.errors) + len(res.failures))