# Inter-operatbility

This directory contains some tests for verifying inter-operability
between Prolog protobufs and other languages. The initial version of
this uses Python, but it is anticipated that other languages will be
added in the future (e.g., C++, JavaScript).

The tests are *not* part of the standard release process because they
require having the protobuf compiler (`protoc`) installed and also a
version of Python 3. There are tests in `CMakeList.txt` to not run the
tests (and emit a warning) if the prerequisite files aren't available.

To run the tests:
```
make test
make clean
```
You can specify these additional variables (see also `../bootstrap/common.mk`):
```
make PROTOC=/path/to/protoc PYTHON=/path/to/python3 \
     BUILD_BIN_DIR=/path/to/build/src SWIPL=/path/to/build/src/swipl \
    test
```

The tests require the Python protobuf support. One way of installing it is:
```
python3 -mpip install protobuf
```
But you should check the version: it should be at least 3.18.1 (which you can check
by: `python3 -mpip show protobuf`), although it's possible that anything after
3.8.0  will work.
Alternatively, `sudo apt install python3-protobuf`, version 3.21.12-3 or later.

You will also need the protobuf compiler. This can be installed on
Debian (Ubuntu) by:
```
sudo apt install protobuf-compiler
```
Any version 3.6.1 or later should work, although it's best to get the
latest one (3.18.1, as of 2021-10-12).

If you install protoc other than in `/usr/bin` (which is where the Debian/Ubuntu
package puts it), you might need to modify the tests that have C++ code (currently
rules `test_read` and `test_write`, plus `foo` in `../demo/Makefile`).
There are comments in the Makefiles.

To trun these tests under the top-level SWI-Prolog `ctest` (assuming your
sources are in `$HOME/src` and you install a local version to
`$HOME/.local`). Note `-DTEST_PROTOBUFS_PROTOC=ON`, which adds
the tests in this directory (and also the tests in `../demo` and `../bootstrap`).
```
cd $HOME/src/swipl-devel
rm -rf build
mkdir -p build
cd build
# Ensure all the targets get rebuilt:
rm -rf packages/protobufs \
       home/library/protobufs \
       home/doc/packages/examples/protobufs
# Optional: -DCMAKE_BUILD_TYPE=PGO
cmake -DCMAKE_INSTALL_PREFIX=$HOME/.local -DTEST_PROTOBUFS_PROTOC=ON -G Ninja ..
ninja
ctest -j4 -R protobufs  # or: ctest -V -R protobufs:interop
# Optional:
# ninja install
```

## .proto Sources

When the protobuf compiler is installed, the following additional
files are also installed:

```
include/google/protobuf/any.proto
include/google/protobuf/api.proto
include/google/protobuf/compiler/plugin.proto
include/google/protobuf/descriptor.proto
include/google/protobuf/duration.proto
include/google/protobuf/empty.proto
include/google/protobuf/field_mask.proto
include/google/protobuf/source_context.proto
include/google/protobuf/struct.proto
include/google/protobuf/timestamp.proto
include/google/protobuf/type.proto
include/google/protobuf/wrappers.proto
```

Missing from this is (where `$SRC` is the top-level source directory, into which
`git@github.com:protocolbuffers/protobuf.git` is cloned):
```
$SRC/protobuf/src/google/protobuf/unittest.proto
$SRC/protobuf/src/google/protobuf/unittest_import.proto
$SRC/protobuf/src/google/protobuf/unittest_import_public.proto
```

So, a copy of these files hav been made here.
They related to the "golden_message" test in `../test_protobufs.pl`.

## addressbook.proto, addressbook2.proto

These are from the [Google protobuf
tutorial](https://developers.google.com/protocol-buffers/docs/tutorials),
mainly from the [Python
tutorial](https://developers.google.com/protocol-buffers/docs/pythontutorial).

They have been slightly modified to put the `TimeStamps` message into
a second `.proto` file, in order to test a few things.

## Future work

These tests write into the current directory. This prevents using a
read-only source tree, amongst other things. The tests should be
modified to use a separate "build" directory.
