# Notes for NFD developers

If you are new to the NDN software community, please read the
[Contributor's Guide](https://github.com/named-data/.github/blob/master/CONTRIBUTING.md).

## Code style

NFD code is subject to [NFD code style](https://redmine.named-data.net/projects/nfd/wiki/CodeStyle).

## Licensing

Contributions to NFD must be licensed under the GPL 3.0 or compatible license.  If you
are choosing GPL 3.0, please use the following license boilerplate in all `.hpp` and
`.cpp` files:

Include the following license boilerplate into all `.hpp` and `.cpp` files:

    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    /*
     * Copyright (c) [Year(s)], [Copyright Holder(s)].
     *
     * This file is part of NFD (Named Data Networking Forwarding Daemon).
     * See AUTHORS.md for complete list of NFD authors and contributors.
     *
     * NFD is free software: you can redistribute it and/or modify it under the terms
     * of the GNU General Public License as published by the Free Software Foundation,
     * either version 3 of the License, or (at your option) any later version.
     *
     * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
     * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     * PURPOSE.  See the GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License along with
     * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
     */

If you are affiliated to an NSF-supported NDN project institution, please use the [NDN Team License
Boilerplate](https://redmine.named-data.net/projects/nfd/wiki/NDN_Team_License_Boilerplate_(NFD)).

## Logging

Fine-grained per-module logging can be configured via the `NDN_LOG` environment variable.
This is especially useful when running unit tests or tools such as `nfdc` that do not
have a configuration file.  See `ndn-log(7)` manual page for syntax and examples.

## Unit tests

To run unit tests, NFD needs to be configured and build with unit test support:

    ./waf configure --with-tests # --debug is also strongly recommended while developing
    ./waf

The simplest way to run the tests is to launch the compiled binary without any parameters:

    # Run core tests
    ./build/unit-tests-core

    # Run NFD daemon tests
    ./build/unit-tests-daemon

    # Run NFD RIB management tests
    ./build/unit-tests-rib

The [Boost.Test framework](https://www.boost.org/doc/libs/1_65_1/libs/test/doc/html/index.html)
is very flexible and allows a number of run-time customization of what tests should be run.
For example, it is possible to choose to run only a specific test suite, only a specific
test case within a suite, or specific test cases within specific test suites:

    # Run only the TCP Face test suite of NFD daemon tests
    ./build/unit-tests-daemon -t FaceTcp

    # Run only test case EndToEnd4 from the same test suite
    ./build/unit-tests-daemon -t FaceTcp/EndToEnd4

    # Run Basic test case from all core test suites
    ./build/unit-tests-core -t */Basic

By default, Boost.Test framework will produce verbose output only when a test case fails.
If it is desired to see verbose output (result of each test assertion), add `-l all`
option to `./build/unit-tests` command.  To see test progress, you can use `-l test_suite`,
or `-p` to show a progress bar:

    # Show report all log messages including the passed test notification
    ./build/unit-tests-daemon -l all

    # Show test suite messages
    ./build/unit-tests-daemon -l test_suite

    # Show nothing
    ./build/unit-tests-daemon -l nothing

    # Show progress bar
    ./build/unit-tests-core -p

There are many more command line options available, information about which can be obtained
either from the command line using the `--help` switch, or online on the
[Boost.Test website](https://www.boost.org/doc/libs/1_65_1/libs/test/doc/html/index.html).
