add self_test function