numam-spdk/test/pmem/test_plan.md
Piotr Pelplinski c0ed81a72b bdev_pmem: documentation
This patch adds documentation adn test plan for PMEM functional tests

Signed-off-by: Piotr Pelplinski <piotr.pelplinski@intel.com>
Change-Id: Ia2e8bcb9901ab216c3e45d2db6d06a3a02fdd308
Reviewed-on: https://review.gerrithub.io/378618
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2017-10-17 16:28:16 -04:00

12 KiB

PMEM bdev feature test plan

Objective

The purpose of these tests is to verify possibility of using pmem bdev configuration in SPDK by running functional tests FIO traffic verification tests.

Configuration

Configuration in tests is to be done using example stub application (spdk/example/bdev/io/bdev_io). All possible management is done using RPC calls with the exception of use of split bdevs which have to be configured in .conf file.

Functional tests are executed as scenarios - sets of smaller test steps in which results and return codes of RPC calls are validated. Some configuration calls may also additionally be validated by use of "get" (e.g. get_bdevs) RPC calls, which provide additional information for veryfing results. In some steps additional write/read operations will be performed on PMEM bdevs in order to check IO path correct behavior.

FIO traffic verification tests will serve as integration tests and will be executed to config correct behavior of PMEM bdev when working with vhost, nvmf_tgt and iscsi_tgt applications.

Functional tests

pmem_pool_info

pmem_pool_info_tc1

Negative test for checking pmem pool file. Call with missing path argument. Steps & expected results:

  • Call pmem_pool_info with missing path argument
  • Check that return code != 0 and error code =

pmem_pool_info_tc2

Negative test for checking pmem pool file. Call with non-existant path argument. Steps & expected results:

  • Call pmem_pool_info with path argument that points to not existing file.
  • Check that return code != 0 and error code = ENODEV

pmem_pool_info_tc3

Negative test for checking pmem pool file. Call with other type of pmem pool file. Steps & expected results:

  • Using pmem utility tools create pool of OBJ type instead of BLK (if needed utility tools are not available - create random file in filesystem)
  • Call pmem_pool_info and point to file created in previous step.
  • Check that return code != 0 and error code = ENODEV

pmem_pool_info_tc4

Positive test for checking pmem pool file. Call with existing pmem pool file. Steps & expected results:

  • Call pmem_pool_info with path argument that points to existing file.
  • Check that return code == 0

create_pmem_pool

From libpmemblk documentation:

  • PMEM block size has to be bigger than 512 internal blocks; if lower value is used then PMEM library will silently round it up to 512 which is defined in nvml/libpmemblk.h file as PMEMBLK_MIN_BLK.
  • Total pool size cannot be less than 16MB which is defined i nvml/libpmemblk.h file as PMEMBLK_MIN_POOL
  • Total number of segments in PMEP pool file cannot be less than 256

create_pmem_pool_tc1

Negative test case for creating a new pmem. Call create_pmem_pool with missing arguments. Steps & expected results:

  • call create_pmem_pool without path argument
  • call return code != 0
  • call pmem_pool_info and check that pmem pool file was not created
  • call return code != 0
  • call create_pmem_pool with path but without size and block size arguments
  • call return code != 0
  • call pmem_pool_info and check that pmem pool file was not created
  • call return code != 0
  • call create_pmem_pool with path and size but without block size arguments
  • call return code != 0
  • call pmem_pool_info and check that pmem pool file was not created
  • call return code != 0

create_pmem_pool_tc2

Negative test case for creating a new pmem. Call create_pmem_pool with non existing path argument. Steps & expected results:

  • call create_pmem_pool with path that does not exist
  • call return code != 0
  • call pmem_pool_info and check that pmem pool file was not created
  • call return code != 0

create_pmem_pool_tc3

Positive test case for creating a new pmem pool on disk space. Steps & expected results:

  • call create_pmem_pool with correct path argument, blocksize=512 and total size=256MB
  • call return code = 0
  • call pmem_pool_info and check that pmem file was created
  • call return code = 0
  • call delete_pmem_pool on previously created pmem
  • return code = 0 and no error code

create_pmem_pool_tc4

Positive test case for creating a new pmem pool in RAM space.

TODO: Research test steps for creating a pool in RAM!!!

Steps & expected results:

  • call create_pmem_pool with correct path argument, blocksize=512 and total size=256MB
  • call return code = 0
  • call pmem_pool_info and check that pmem file was created
  • call return code = 0
  • call delete_pmem_pool on previously created pmem
  • return code = 0 and no error code

create_pmem_pool_tc5

Negative test case for creating two pmems with same path. Steps & expected results:

  • call create_pmem_pool with correct path argument, blocksize=512 and total size=256MB
  • call return code = 0
  • call pmem_pool_info and check that pmem file was created
  • call return code = 0
  • call create_pmem_pool with the same path argument as before, blocksize=4096 and total size=512MB
  • call return code != 0, error code = EEXIST
  • call create_pmem_pool and check that first pmem pool file is still available and not modified (block size and total size stay the same)
  • call return code = 0
  • call delete_pmem_pool on first created pmem pool
  • return code =0 and no error code

create_pmem_pool_tc6

Positive test case for creating pmem pool file with various block sizes. Steps & expected results:

  • call create_pmem_pool with correct path argument, total size=256MB with different block size arguments - 1, 511, 512, 513, 1024, 4096, 128k and 256k
  • call pmem_pool_info on each of created pmem pool and check if it was created; For pool files created with block size <512 their block size should be rounded up to 512; other pool files should have the same block size as specified in create command
  • call return code = 0; block sizes as expected
  • call delete_pmem_pool on all created pool files

create_pmem_pool_tc7

Negative test case for creating pmem pool file with total size of less than 16MB. Steps & expected results:

  • call create_pmem_pool with correct path argument, block size=512 and total size less than 16MB
  • return code !=0 and error code !=0
  • call pmem_pool_info to verify pmem pool file was not created
  • return code = 0

create_pmem_pool_tc8

Negative test case for creating pmem pool file with less than 256 blocks. Steps & expected results:

  • call create_pmem_pool with correct path argument, block size=128k and total size=30MB
  • return code !=0 and error code !=0
  • call pmem_pool_info to verify pmem pool file was not created
  • return code = 0

delete_pmem_pool

delete_pmem_pool_tc1

Negative test case for deleting a pmem. Call delete_pmem_pool on non-exisiting pmem. Steps & expected results:

  • call delete_pmem_pool on non-existing pmem.
  • return code !=0 and error code = ENOENT

delete_pmem_pool_tc2

Negative test case for deleting a pmem. Call delete_pmem_pool on a file of wrong type Steps & expected results:

  • Using pmem utility tools create pool of OBJ type instead of BLK (if needed utility tools are not available - create random file in filesystem)
  • Call delete_pmem_pool and point to file created in previous step.
  • return code !=0 and error code = ENOTBLK

delete_pmem_pool_tc3

Positive test case for creating and deleting a pemem. Steps & expected results:

  • call create_pmem_pool with correct arguments
  • return code = 0 and no error code
  • using pmem_pool_info check that pmem was created
  • return code = 0 and no error code
  • call delete_pmem_pool on previously created pmem
  • return code = 0 and no error code
  • using pmem_pool_info check that pmem no longer exists
  • return code !=0 and error code = ENODEV

delete_pmem_pool_tc4

Negative test case for creating and deleting a pemem. Steps & expected results:

  • run scenario from test case 3
  • call delete_pmem_pool on already deleted pmem pool
  • return code !=0 and error code = ENODEV

construct_pmem_bdev

construct_pmem_bdev_tc1

Negative test for constructing new pmem bdev. Call create_pmem_bdev with missing argument. Steps & expected results:

  • Call construct_pmem_bdev with missing path argument.
  • Check that return code != 0

construct_pmem_bdev_tc2

Negative test for constructing new pmem bdev. Call construct_pmem_bdev with not existing path argument. Steps & expected results:

  • call construct_pmem_bdev with incorrect (not existing) path
  • call return code != 0 and error code = ENODEV
  • using get_bdevs check that no pmem bdev was created

construct_pmem_bdev_tc3

Negative test for constructing pmem bdevs with random file instead of pmemblk pool. Steps & expected results:

  • using a system tool (like dd) create a random file
  • call construct_pmem_bdev with path pointing to that file
  • return code != 0, error code = ENOTBLK

construct_pmem_bdev_tc4

Negative test for constructing pmem bdevs with pmemobj instead of pmemblk pool. Steps & expected results:

  • Using pmem utility tools create pool of OBJ type instead of BLK (if needed utility tools are not available - create random file in filesystem)
  • call construct_pmem_bdev with path pointing to that pool
  • return code != 0, error code = ENOTBLK

construct_pmem_bdev_tc5

Positive test for constructing pmem bdev. Steps & expected results:

  • call create_pmem_pool with correct arguments
  • return code = 0, no errors
  • call pmem_pool_info and check if pmem files exists
  • return code = 0, no errors
  • call construct_pmem_bdev with with correct arguments to create a pmem bdev
  • return code = 0, no errors
  • using get_bdevs check that pmem bdev was created
  • delete pmem bdev using delete_bdev
  • return code = 0, no error code
  • delete previously created pmem pool
  • return code = 0, no error code

construct_pmem_bdev_tc6

Negative test for constructing pmem bdevs twice on the same pmem. Steps & expected results:

  • call create_pmem_pool with correct arguments
  • return code = 0, no errors
  • call pmem_pool_info and check if pmem files exists
  • return code = 0, no errors
  • call construct_pmem_bdev with with correct arguments to create a pmem bdev
  • return code = 0, no errors
  • using get_bdevs check that pmem bdev was created
  • call construct_pmem_bdev again on the same pmem file
  • return code != 0, error code = EEXIST
  • delete pmem bdev using delete_bdev
  • return code = 0, no error code
  • delete previously created pmem pool
  • return code = 0, no error code

delete_bdev

delete_bdev_tc1

Positive test for deleting pmem bdevs using common delete_bdev call. Steps & expected results:

  • construct malloc and aio bdevs (also NVMe if possible)
  • all calls - return code = 0, no errors; bdevs created
  • call create_pmem_pool with correct path argument, block size=512, total size=256M
  • return code = 0, no errors
  • call pmem_pool_info and check if pmem file exists
  • return code = 0, no errors
  • call construct_pmem_bdev and create a pmem bdev
  • return code = 0, no errors
  • using get_bdevs check that pmem bdev was created
  • delete pmem bdev using delete_bdev
  • return code = 0, no errors
  • using get_bdevs confirm that pmem bdev was deleted and other bdevs were unaffected.

delete_bdev_tc2

Negative test for deleting pmem bdev twice. Steps & expected results:

  • call create_pmem_pool with correct path argument, block size=512, total size=256M
  • return code = 0, no errors
  • call pmem_pool_info and check if pmem file exists
  • return code = 0, no errors
  • call construct_pmem_bdev and create a pmem bdev
  • return code = 0, no errors
  • using get_bdevs check that pmem bdev was created
  • delete pmem bdev using delete_bdev
  • return code = 0, no errors
  • using get_bdevs confirm that pmem bdev was deleted
  • delete pmem bdev using delete_bdev second time
  • return code != 0, error code = ENODEV

Integration tests

Description of integration tests which run FIO verification traffic against pmem_bdevs used in vhost, iscsi_tgt and nvmf_tgt applications can be found in test directories for these components:

  • spdk/test/vhost
  • spdk/test/nvmf
  • spdk/test/iscsi_tgt