pytorch/test/cpp/jit
Zachary DeVito 0e3389dced Fix circular deps in loading (#26758)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/26758

This PR changes the order in which we import classes and functions so
that is is no longer necessary for them to defined in order in a file,
or for there to be proper import statements in the exported file.

Actually importing a function/class now is driven by the need to resolve
the entity during unpickling, type resolution, or value resolution.

While this should allow significant simplification to the code that
serializes classes, this work has not been done yet in order to avoid
inevitable forward compat issues in the transition period.

Notes:
* Individual functions have been replaced with a SourceImporter object
  that exposes a resolveType method. This method loads the type if
  it has not been loaded yet, potentially parsing  (but not loading)
  the file it exists in if that file hasn't been parsed yet.
* Some legacy functionality needed to be added as a method to this object
  since the old format still used some of this logic for class resolution.

Test Plan: Imported from OSS

Differential Revision: D17558989

Pulled By: zdevito

fbshipit-source-id: 7eae3470bcbd388c4de463e3462d527776ed46c6
2019-09-26 11:39:16 -07:00
..
__init__.py
CMakeLists.txt Enable jit fusion on ROCm (#22872) 2019-09-05 18:22:08 -07:00
gtest.cpp
README.md
test_alias_analysis.cpp Make schema part of RegisterOperators::Options (#26114) 2019-09-13 13:52:32 -07:00
test_argument_spec.cpp Merge ProfiledTensorType and TensorType (#24284) 2019-08-20 13:01:28 -07:00
test_autodiff.cpp Merge ProfiledTensorType and TensorType (#24284) 2019-08-20 13:01:28 -07:00
test_base.h
test_class_import.cpp Fix circular deps in loading (#26758) 2019-09-26 11:39:16 -07:00
test_class_parser.cpp
test_code_template.cpp
test_constant_pooling.cpp
test_constant_propagation.cpp Whenever possible, use function pointers rather than std::function to represent Operation's. (#26560) 2019-09-21 20:51:24 -07:00
test_create_autodiff_subgraphs.cpp
test_custom_operators.cpp
test_dce.cpp
test_fuser.cpp Remove unused DynamicDAG class. 2019-08-20 16:17:59 -07:00
test_graph_executor.cpp
test_inliner.cpp Use optimized graph in Inline (essentially, making Inline recursive now). (#26489) 2019-09-24 00:22:29 -07:00
test_interpreter.cpp
test_ir.cpp Removes SymbolicVariable from tests (#24007) 2019-08-19 20:49:37 -07:00
test_irparser.cpp
test_ivalue.cpp
test_lite_interpreter.cpp Bytecode export flow (#25187) 2019-09-25 16:35:45 -07:00
test_misc.cpp Whenever possible, use function pointers rather than std::function to represent Operation's. (#26560) 2019-09-21 20:51:24 -07:00
test_netdef_converter.cpp
test_peephole_optimize.cpp Removes SymbolicVariable (#25077) 2019-08-31 11:19:50 -07:00
test_qualified_name.cpp
test_save_load.cpp Fix circular deps in loading (#26758) 2019-09-26 11:39:16 -07:00
test_schema_matching.cpp Whenever possible, use function pointers rather than std::function to represent Operation's. (#26560) 2019-09-21 20:51:24 -07:00
test_subgraph_matcher.cpp Removes SymbolicVariable from tests (#24007) 2019-08-19 20:49:37 -07:00
test_subgraph_rewriter.cpp Add filter function to subgraph rewriter runGraph (#26223) 2019-09-18 16:34:50 -07:00
test_subgraph_utils.cpp
test_utils.cpp autodiff changes to enable profiling 2019-09-25 10:11:44 -07:00
test_utils.h Removes SymbolicVariable from tests (#24007) 2019-08-19 20:49:37 -07:00
tests.h Bytecode export flow (#25187) 2019-09-25 16:35:45 -07:00
tests_setup.py
torch_python_test.cpp

JIT C++ Tests

How to add a new test

First, create a new test file. Test files should have be placed in this directory, with a name that starts with test_, like test_foo.cpp.

Here is an example test file you can copy-paste.

#include <test/cpp/jit/test_base.h>

// Tests go in torch::jit
namespace torch {
namespace jit {

// 1. Test cases are void() functions.
// 2. They start with the prefix `test`
void testCaseOne() {
    // ...
}

void testCaseTwo() {
    // ...
}
}
}

Then, register your test in tests.h:

// Add to TH_FORALL_TESTS_CUDA instead for CUDA-requiring tests
#define TH_FORALL_TESTS(_)             \
  _(ADFormulas)                        \
  _(Attributes)                        \
  ...
  _(CaseOne)  // note that the `test` prefix is omitted.
  _(CaseTwo)

We glob all the test files together in CMakeLists.txt so that you don't have to edit it every time you add a test. Unfortunately, this means that in order to get the build to pick up your new test file, you need to re-run cmake:

python setup.py build --cmake

Why do we have two different test runners?

We have two different ways of running our cpp tests:

  1. With gtest, from a standalone binary.
  2. With Python, from TestJit.test_cpp and TestJit.test_cpp_cuda (in test/test_jit.py)

We want both because we need to test things from a pure-C++ environment and with all our various Python patch-points enabled.

How do I run the tests?

The following commands assume you are in PyTorch root.

  1. With gtest:
    # (re)build the test binary
    ninja build/bin/test_jit
    # run
    build/bin/test_jit --gtest_filter='glob_style_filter*'
    
  2. With Python:
    python test/test_jit.py TestJit.test_cpp TestJit.test_cpp_cuda