diff --git a/config/install/field_permissions.settings.yml b/config/install/field_permissions.settings.yml
new file mode 100644
index 0000000..6dbfafe
--- /dev/null
+++ b/config/install/field_permissions.settings.yml
@@ -0,0 +1 @@
+permission_type_body:0
diff --git a/config/schema/field_permissions.schema.yml b/config/schema/field_permissions.schema.yml
index fe9b3d0..f7494eb 100644
--- a/config/schema/field_permissions.schema.yml
+++ b/config/schema/field_permissions.schema.yml
@@ -1 +1,7 @@
 field_permissions.settings:
+  type: config_object
+  label: 'Field UI settings'
+  mapping:
+    permission_type_body:
+      type: integer
+      label: 'Value public private ciustom permission'
diff --git a/field_permissions.module b/field_permissions.module
index 2f8457d..91733da 100644
--- a/field_permissions.module
+++ b/field_permissions.module
@@ -10,7 +10,6 @@ use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Session\AccountInterface;
 use Drupal\field_permissions\FieldPermissionsService;
 
 /**
@@ -51,8 +50,9 @@ function field_permissions_help($route_name, RouteMatchInterface $route_match) {
 /**
  * Implements hook_entity_field_access().
  */
-function field_permissions_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) {
-  if (!$field_definition->isDisplayConfigurable() || empty($items)) {
+function field_permissions_entity_field_access($operation, FieldDefinitionInterface $field_definition, $account, FieldItemListInterface $items = NULL) {
+  $context = ($operation == "view") ? 'display' : 'edit';
+  if (!$field_definition->isDisplayConfigurable($context) || empty($items)) {
     return AccessResult::neutral();
   }
   $access_field = FieldPermissionsService::getFieldAccess($operation, $items, $account, $field_definition);
@@ -67,10 +67,10 @@ function field_permissions_entity_field_access($operation, FieldDefinitionInterf
  */
 function field_permissions_form_field_config_edit_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
   $account = \Drupal::currentUser();
-  // return $form;
   if (!FieldPermissionsService::GetAccessAdminFieldPermissions($account)) {
     return $form;
   }
+
   $field = $form_state->getBuildInfo()['callback_object']->getEntity();
   $default_type = FieldPermissionsService::fieldGetPermissionType($field);
   $form['fid'] = array('#type' => 'hidden', '#value' => $field->id());
@@ -87,17 +87,20 @@ function field_permissions_form_field_config_edit_form_alter(&$form, \Drupal\Cor
     ),
     '#default_value' => isset($form['#field']['field_permissions']['type']) ? $form['#field']['field_permissions']['type'] : $default_type,
   );
-  $form['field_permissions']['permissions'] = field_permissions_permissions_matrix($field);
-  $form['#attached']['library'] =  array(
+  field_permissions_permissions_matrix($field, $form, $form_state);
+  $form['#attached']['library'] = array(
     'field_permissions/field_permissions',
   );
   $form['actions']['submit']['#submit'][] = 'field_permission_field_config_edit_form_submit';
 }
 
 /**
- * Implements hook_form_alter().
+ * Return Matrix field permission.
+ *
+ * @param Drupal\field\Entity\FieldStorageConfig $field
+ *   Field to implement permissions.
  */
-function field_permissions_permissions_matrix(\Drupal\field\Entity\FieldStorageConfig $field) {
+function field_permissions_permissions_matrix($field, &$form, \Drupal\Core\Form\FormStateInterface $form_state) {
   $roles = user_roles();
   $role_names = array_keys($roles);
   $form['role_names'] = array(
@@ -105,7 +108,7 @@ function field_permissions_permissions_matrix(\Drupal\field\Entity\FieldStorageC
     '#value' => $role_names,
   );
   $label = $field->getName();
-  $permissions = \Drupal::service('field_permissions.permissions_service')->listFieldPermissionSupport($field, $label);
+  $permissions = FieldPermissionsService::listFieldPermissionSupport($field, $label);
   $options = array_keys($permissions);
   /*header theme table */
   $form['permissions'] = array(
@@ -132,70 +135,68 @@ function field_permissions_permissions_matrix(\Drupal\field\Entity\FieldStorageC
     );
     $options[$provider] = '';
     foreach ($role_names as $rid => $name) {
-      $form['permissions'][$provider][$rid] = array(
+      $form['permissions'][$provider][$name] = array(
         '#title' => $name . ': ' . $permission["title"],
         '#title_display' => 'invisible',
+        '#type' => 'checkbox',
+        '#attributes' => array('class' => array('rid-' . $rid, 'js-rid-' . $rid)),
         '#wrapper_attributes' => array(
           'class' => array('checkbox'),
         ),
-        '#type' => 'checkbox',
-        '#default_value' => in_array($provider, $test[$name]) ? 1 : 0,
-        '#attributes' => array('class' => array('rid-' . $rid, 'js-rid-' . $rid)),
       );
+      if (!empty($test[$name]) && in_array($provider, $test[$name])) {
+        $form['permissions'][$provider][$name]['#default_value'] = in_array($provider, $test[$name]);
+      }
     }
   }
-  return $form;
 }
 
 /**
  * Implements hook_form_submit().
  */
 function field_permission_field_config_edit_form_submit(array &$form, FormStateInterface $form_state) {
-  $config = \Drupal::service('config.factory')->getEditable('field_permissions.field.settings');
+  $config = \Drupal::service('config.factory')->getEditable('field_permissions.settings');
   $field = $form_state->getBuildInfo()['callback_object']->getEntity();
   $custum_permissions = $form_state->getValue("permissions");
   $roules = $form_state->getValue("role_names");
   $type_permission = $form_state->getValue("type");
   $field_name = $field->getName();
-
   $config->set('permission_type_' . $field_name, $type_permission);
   $config->save();
-
   $perm_settings = [];
   // Set all perm.
   if ($type_permission == FIELD_PERMISSIONS_CUSTOM) {
     foreach ($custum_permissions as $perm_name => $field_perm) {
-      foreach ($field_perm as $rid => $roule_perm) {
-        $roule_name = $roules[$rid];
-        $perm_settings[$roule_name][$perm_name] = $roule_perm;
+      foreach ($field_perm as $rname => $roule_perm) {
+        $perm_settings[$rname][$perm_name] = $roule_perm;
       }
     }
   }
   elseif ($type_permission == FIELD_PERMISSIONS_PUBLIC) {
+
     foreach ($custum_permissions as $perm_name => $field_perm) {
-      foreach ($field_perm as $rid => $roule_perm) {
+      foreach ($field_perm as $rname => $roule_perm) {
         if ($perm_name != 'view_' . $field_name) {
           $roule_perm = 0;
         }
         else {
           $roule_perm = 1;
         }
-        $roule_name = $roules[$rid];
-        $perm_settings[$roule_name][$perm_name] = $roule_perm;
+        $perm_settings[$rname][$perm_name] = $roule_perm;
       }
     }
   }
   elseif ($type_permission == FIELD_PERMISSIONS_PRIVATE) {
+    $no_role = array('anonymous', 'authenticated');
     foreach ($custum_permissions as $perm_name => $field_perm) {
-      foreach ($field_perm as $rid => $roule_perm) {
-        if ($perm_name != 'view_own_' . $field_name && $perm_name != 'edit_own_' . $field_name) {
+      foreach ($field_perm as $rname => $roule_perm) {
+        if (in_array($rname, $no_role) || $perm_name != 'view_own_' . $field_name && $perm_name != 'edit_own_' . $field_name) {
           $roule_perm = 0;
         }
         else {
           $roule_perm = 1;
         }
-        $roule_name = $roules[$rid];
-        $perm_settings[$roule_name][$perm_name] = $roule_perm;
+        $perm_settings[$rname][$perm_name] = $roule_perm;
       }
     }
   }
diff --git a/src/Controller/FieldPermissionsController.php b/src/Controller/FieldPermissionsController.php
index 9f3b325..eb7dae6 100644
--- a/src/Controller/FieldPermissionsController.php
+++ b/src/Controller/FieldPermissionsController.php
@@ -6,7 +6,6 @@
  */
 
 namespace Drupal\field_permissions\Controller;
-
 use Drupal\Core\Controller\ControllerBase;
 use \Drupal\field\Entity\FieldStorageConfig;
 use Drupal\field_permissions\FieldPermissionsService;
@@ -41,6 +40,9 @@ class FieldPermissionsController extends ControllerBase {
    * {@inheritdoc}
    */
   public function content() {
+    ///dpm(\Drupal::moduleHandler()->getImplementations('entity_base_field_info'));
+    // dpm($field_info = \Drupal::moduleHandler()->invoke("path", 'entity_base_field_info'));
+    //dpm(\Drupal::moduleHandler()->implementsHook('form', 'alter'));
     $build['table'] = array(
       '#type' => 'table',
       '#header' => $this->buildHeader(),
diff --git a/src/FieldPermissionsService.php b/src/FieldPermissionsService.php
index b864fad..6c94145 100644
--- a/src/FieldPermissionsService.php
+++ b/src/FieldPermissionsService.php
@@ -6,8 +6,6 @@
  */
 
 namespace Drupal\field_permissions;
-use Drupal\field\FieldStorageConfigInterface;
-
 
 class FieldPermissionsService implements FieldPermissionsServiceInterface {
 
@@ -46,8 +44,9 @@ class FieldPermissionsService implements FieldPermissionsServiceInterface {
 
   /**
    * {@inheritdoc}
+   * FieldStorageConfigInterface
    */
-  public function listFieldPermissionSupport(FieldStorageConfigInterface $field, $label = '') {
+  public static function listFieldPermissionSupport($field, $label = '') {
     $permissions = array();
     $permission_list = FieldPermissionsService::getList($label);
     foreach ($permission_list as $permission_type => $permission_info) {
@@ -63,11 +62,11 @@ class FieldPermissionsService implements FieldPermissionsServiceInterface {
   /**
    * {@inheritdoc}
    */
-  public function getPermissionValue(FieldStorageConfigInterface $field) {
+  public static function getPermissionValue(/*FieldStorageConfigInterface $field*/) {
     $roules = user_roles();
     $field_field_permissions = [];
     $field_permission_perm = FieldPermissionsService::permissions();
-    $permissions = user_role_permissions();
+    $permissions = user_role_permissions(array());
     foreach ($roules as $rule_name => $roule) {
       $roule_perms = $roule->getPermissions();
       $field_field_permissions[$rule_name] = [];
@@ -91,7 +90,7 @@ class FieldPermissionsService implements FieldPermissionsServiceInterface {
   /**
    * {@inheritdoc}
    */
-  public function permissions() {
+  public static function permissions() {
     $permissions = [];
     $instances = \Drupal::entityTypeManager()->getStorage('field_storage_config')->loadMultiple();
     foreach ($instances as $key => $instance) {
@@ -109,38 +108,40 @@ class FieldPermissionsService implements FieldPermissionsServiceInterface {
   /**
    * {@inheritdoc}
    */
-  public function fieldGetPermissionType(FieldStorageConfigInterface $field) {
-    $config = \Drupal::service('config.factory')->getEditable('field_permissions.field.settings');
+  public static function fieldGetPermissionType($field) {
+    $config = \Drupal::service('config.factory')->getEditable('field_permissions.settings');
     $field_settings_perm = $config->get('permission_type_' . $field->getName());
     return ($field_settings_perm) ? $field_settings_perm : FIELD_PERMISSIONS_PUBLIC;
   }
 
   /**
    * {@inheritdoc}
+   *  AccountInterface
    */
-  public function GetAccessAdminFieldPermissions(AccountInterface $account) {
+  public static function GetAccessAdminFieldPermissions($account) {
     return $account->hasPermission("admin_field_permissions");
   }
 
   /**
    * {@inheritdoc}
+   *  AccountInterface.
    */
-  public function GetAccessPrivateFieldPermissions(AccountInterface $account) {
+  public static function GetAccessPrivateFieldPermissions($account) {
     return $account->hasPermission("access_user_private_field");
   }
   /**
    * {@inheritdoc}
    */
-  public function getFieldAccess($operation, $items, AccountInterface $account, $field_definition) {
-
+  public static function getFieldAccess($operation, $items, $account, $field_definition) {
     $default_type = FieldPermissionsService::fieldGetPermissionType($field_definition);
     if (in_array("administrator", $account->getRoles()) || $default_type == FIELD_PERMISSIONS_PUBLIC) {
       return TRUE;
     }
+    $field_name = $field_definition->getName();
     if ($default_type == FIELD_PERMISSIONS_PRIVATE) {
       if ($operation === "view") {
         if ($items->getEntity()->getOwnerId() == $account->id()) {
-          return $account->hasPermission($operation . "_own_" . $field_name);
+          return FieldPermissionsService::GetAccessPrivateFieldPermissions($account) || $account->hasPermission($operation . "_own_" . $field_name);
         }
         else {
           return FieldPermissionsService::GetAccessPrivateFieldPermissions($account);
@@ -148,12 +149,11 @@ class FieldPermissionsService implements FieldPermissionsServiceInterface {
       }
       elseif ($operation === "edit") {
         if ($items->getEntity()->isNew()) {
+          // ??
           return TRUE;
-          //return $account->hasPermission("create_" . $field_name);
         }
         elseif ($items->getEntity()->getOwnerId() == $account->id()) {
           return TRUE;
-          //return $account->hasPermission($operation . "_own_" . $field_name);
         }
         else {
           return FieldPermissionsService::GetAccessPrivateFieldPermissions($account);;
diff --git a/src/FieldPermissionsServiceInterface.php b/src/FieldPermissionsServiceInterface.php
index 62fa0f6..e6ab3fd 100644
--- a/src/FieldPermissionsServiceInterface.php
+++ b/src/FieldPermissionsServiceInterface.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\field_permissions;
 
-use Drupal\field\FieldStorageConfigInterface;
-
 
 interface FieldPermissionsServiceInterface {
 
@@ -31,7 +29,7 @@ interface FieldPermissionsServiceInterface {
    * @return array
    *   An array of permission information,
    */
-  public function listFieldPermissionSupport(FieldStorageConfigInterface $field, $label = '');
+  public static function listFieldPermissionSupport($field, $label = '');
 
   /**
    * Get default value for checkbox  role permission.
@@ -39,21 +37,24 @@ interface FieldPermissionsServiceInterface {
    * @param \Drupal\field\FieldStorageConfigInterface $field
    *   The field to return permissions for.
    */
-  public function getPermissionValue(FieldStorageConfigInterface $field);
+ public static function getPermissionValue(/*FieldStorageConfigInterface $field*/);
 
   /**
    * Returns permissions.
    */
-  public function permissions();
+  public static function permissions();
 
   /**
-   * {@inheritdoc}
+   * Get default value for checkbox  role permission.
+   *
+   * @param \Drupal\field\FieldStorageConfigInterface $field
+   *   The field to return permissions for.
    */
-  public function fieldGetPermissionType(FieldStorageConfigInterface $field);
+  public static function fieldGetPermissionType($field);
 
   /**
    * {@inheritdoc}
    */
-  public function getFieldAccess($operation, $items, AccountInterface $account, $field_definition);
+  public static function getFieldAccess($operation, $items, $account, $field_definition);
 
 }
diff --git a/src/Tests/FieldPermissionsTest.php b/src/Tests/FieldPermissionsTest.php
new file mode 100644
index 0000000..db1622d
--- /dev/null
+++ b/src/Tests/FieldPermissionsTest.php
@@ -0,0 +1,392 @@
+<?php
+/**
+ * @file
+ *  Contains FieldPermissionsTest.php
+ */
+
+namespace Drupal\field_permissions\Tests;
+use Drupal\field_permissions\FieldPermissionsService;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Indicates that a field does not have any access control.
+ */
+define('FIELD_PERMISSIONS_PUBLIC', 0);
+/**
+ * Indicates that a field is private.
+ *
+ * Private fields are never displayed, and are only editable by the author (and
+ * by site administrators with the 'access private fields' permission).
+ */
+define('FIELD_PERMISSIONS_PRIVATE', 1);
+/**
+ * Indicates that a field has custom permissions.
+ */
+define('FIELD_PERMISSIONS_CUSTOM', 2);
+
+/**
+ * A generic field testing class.
+ *
+ * Subclass this one to test your specific field type
+ * and get some basic unit testing for free.
+ *
+ * Since Simpletest only looks through one class definition
+ * to find test functions, we define generic tests as
+ * 'code_testWhatever' or 'form_testWhatever'. Subclasses
+ * can then implement shim test methods that just call the
+ * generic tests.
+ *
+ * 'code_' and 'form_' prefixes denote the type of test:
+ * using code only, or through Drupal page forms.
+ *
+ * @group field_permission
+ */
+class FieldPermissionsTest extends WebTestBase {
+
+  // Our tests will generate some random field instance
+  // names. We store them here so many functions can act on them.
+  protected $instanceNames;
+
+  /**
+   * An administrative user with permission to configure comment settings.
+   *
+   * @var \Drupal\user\AccountInterface
+   */
+  protected $adminUser;
+  /**
+   * An limit user.
+   *
+   * @var \Drupal\user\AccountInterface
+   */
+  protected $limitedUser;
+  /**
+   * A normal user with permission.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $webUser;
+  protected $adminUserRole;
+  protected $limitUserRole;
+  protected $nodeTest;
+
+
+  /**
+   * Modules to install.
+   *
+   * @var array
+   */
+  public static $modules = ['node', 'field', 'field_ui', 'user', 'field_permissions'];
+
+  /**
+   * Simpletest's setUp().
+   *
+   * We want to be able to subclass this class, so we jump
+   * through a few hoops in order to get the modules from args
+   * and add our own.
+   */
+  public function setUp() {
+    parent::setUp();
+
+    // Create node type.
+    $this->drupalCreateContentType(array(
+      'type' => 'article',
+      'name' => 'Article',
+    ));
+    $this->checkPermissions(array("create article content"), TRUE);
+    $this->adminUser = $this->drupalCreateUser(array(
+      'administer content types',
+      'access user profiles',
+      'access content',
+      'administer permissions',
+      'administer node fields',
+      'bypass node access',
+      'administer nodes',
+      'create article content',
+    ));
+
+    $this->limitedUser = $this->drupalCreateUser(array(
+      'access content',
+      'create article content',
+      'edit any article content',
+    ));
+
+    $this->webUser = $this->drupalCreateUser(array(
+      'access content',
+      'create article content',
+      'edit any article content',
+    ));
+
+    $this->adminUserRole = \Drupal\user\Entity\Role::load($this->adminUser->getRoles(array('authenticated'))[0]);
+    $this->limitUserRole = \Drupal\user\Entity\Role::load($this->limitedUser->getRoles(array('authenticated'))[0]);
+    $this->webUserRole = \Drupal\user\Entity\Role::load($this->limitedUser->getRoles(array('authenticated'))[0]);
+
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getModule() {
+    return 'field_permission';
+  }
+
+  /**
+   * Test Send form permission page width enable permission by rules.
+   */
+  public function TestPremissionFormUi($rule, $perm) {
+    $edit = array();
+    $edit[$rule->id() . '[' . $perm . ']'] = TRUE;
+    $this->drupalGet('admin/people/permissions');
+    $this->drupalPostForm(NULL, $edit, t('Save permissions'));
+    drupal_static_reset('user_access');
+    drupal_static_reset('user_role_permissions');
+    $this->assertText(t('The changes have been saved.'), t('Successful save message displayed.'));
+  }
+
+  /**
+   * Test chanege parmission field enable perm by rule.
+   */
+  public function TestFieldChangePermissionField($perm = FIELD_PERMISSIONS_PUBLIC, $custom_permission = array()) {
+    $this->drupalGet('admin/structure/types/manage/article/fields/node.article.body');
+    if ($perm == FIELD_PERMISSIONS_PUBLIC || $perm == FIELD_PERMISSIONS_PRIVATE) {
+      $edit = array('type' => $perm);
+      $this->drupalPostForm(NULL, $edit, t('Save settings'));
+    }
+    elseif ($perm == FIELD_PERMISSIONS_CUSTOM && !empty($custom_permission)) {
+      $custom_permission['type'] = $perm;
+      $this->drupalPostForm(NULL, $custom_permission, t('Save settings'));
+    }
+    drupal_static_reset('user_access');
+    drupal_static_reset('user_role_permissions');
+  }
+
+
+  /**
+   * Support node add by api.
+   */
+  public function TestNodeAdd() {
+    $this->nodeTest = $this->drupalCreateNode(array('type' => 'article', 'uid' => $this->limitedUser->id()));
+    $this->drupalGet('node/' . $this->nodeTest->id());
+    $node_body = $this->nodeTest->getFields()['body']->getValue();
+    $this->assertText($node_body[0]['value']);
+  }
+
+  /**
+   * Test node add form..
+   */
+  public function TestNodeAddForm() {
+    $this->drupalGet('node/add/article');
+    $this->assertText('Body');
+    $edit = array();
+    $node_name = $this->randomMachineName();
+    $edit['body[0][value]'] = $this->randomString();
+    $edit['title[0][value]'] = $node_name;
+    $this->drupalPostForm(NULL, $edit, t('Save'));
+    $this->assertText(t('Article @name has been created.', array('@name' => $node_name)));
+  }
+
+  /**
+   * Test case view node.
+   */
+  public function TestViewNodeField($test = TRUE) {
+    $field_value = $this->nodeTest->getFields()['body']->getValue();
+    $this->drupalGet('node/' . $this->nodeTest->id());
+    if ($test == TRUE) {
+      $this->assertText($field_value[0]['value']);
+    }
+    else {
+      $this->assertNoText($field_value[0]['value']);
+    }
+  }
+
+  /**
+   * Test case edit field.
+   */
+  public function TestEditNodeField($test = TRUE) {
+    $this->drupalGet('node/' . $this->nodeTest->id() . '/edit');
+    $this->assertText('Title');
+    if ($test == TRUE) {
+      $this->assertText('Body');
+    }
+    else {
+      $this->assertNoText('Body');
+    }
+  }
+
+  /**
+   * Test case.
+   */
+  function TestGetCustomPemrission($role, $field_perm = array()) {
+    $custom_perm = array();
+    $permission_list = FieldPermissionsService::permissions();
+    $permission_list = array_keys($permission_list);
+    $permission_role = array_keys(user_roles());
+    $remove_perm = array();
+    // Set all check to false.
+    foreach ($permission_role as $rname) {
+      foreach ($permission_list as $perm) {
+        $key = 'permissions[' . $perm . '][' . $rname . ']';
+        $custom_perm[$key] = FALSE;
+      }
+    }
+    // Set perm check to true.
+    foreach ($field_perm as $perm) {
+      $key = 'permissions[' . $perm . '][' . $role->id() . ']';
+      $custom_perm[$key] = TRUE;
+    }
+    return $custom_perm;
+  }
+
+  /**
+   * Test case.
+   */
+  function TestCreateCustomPermission($role, $permissions = array(), $custom_permission = array()) {
+    return array_merge($custom_permission, $this->TestGetCustomPemrission($role, $permissions));
+  }
+
+  /**
+   * Test case.
+   */
+  function TestChangeCustomPermission($custom_permission) {
+    $this->drupalLogin($this->adminUser);
+    $this->TestFieldChangePermissionField(FIELD_PERMISSIONS_CUSTOM, $custom_permission);
+    $this->drupalLogout();
+  }
+
+  /**
+   * Test case.
+   */
+  public function TestFieldEdit() {
+    $this->drupalLogin($this->adminUser);
+    // Test page without permissin [admin_field_permissions].
+    $this->drupalGet('admin/structure/types/manage/article/fields/node.article.body');
+    $this->assertNoText('Field visibility and permissions');
+    $this->TestPremissionFormUi($this->adminUserRole, "admin_field_permissions");
+    // Test page width permissin [admin_field_permissions].
+    $this->drupalGet('admin/structure/types/manage/article/fields/node.article.body');
+    $this->assertText('Field visibility and permissions');
+    $this->drupalLogout();
+  }
+  /*
+   * Test permiossion page.
+   * nota : admin/people/permissions
+   */
+  public function TestPermissionPage() {
+    $this->drupalLogin($this->adminUser);
+    $this->drupalGet('admin/people/permissions');
+    $this->assertText('Access other users private fields');
+    $this->assertText('Administer field permissions');
+    $this->drupalLogout();
+  }
+  /**
+   * Test create content.
+   */
+  function TestInitAddNode() {
+    $this->drupalLogin($this->limitedUser);
+    $this->TestNodeAddForm();
+    $this->TestNodeAdd();
+    $this->drupalLogout();
+  }
+
+  /**
+   * Test PUBLIC - PRIVATE EDIT - VIEW.
+   */
+  function TestChengeToPrivateField() {
+    $this->drupalLogin($this->adminUser);
+
+    $this->TestViewNodeField(TRUE);
+
+    $this->TestPremissionFormUi($this->adminUserRole, "admin_field_permissions");
+    $this->TestFieldChangePermissionField(FIELD_PERMISSIONS_PRIVATE, NULL);
+    $this->TestViewNodeField(FALSE);
+
+    $this->TestPremissionFormUi($this->adminUserRole, "access_user_private_field");
+    $this->TestViewNodeField(TRUE);
+    $this->drupalLogout();
+  }
+  /**
+   * Test PUBLIC - view own field.
+   */
+  function TestViewOwnField() {
+    $permission = array();
+    $permission = $this->TestCreateCustomPermission($this->limitUserRole, array("view_own_body"), $permission);
+    $this->TestChangeCustomPermission($permission);
+
+    // Login width author node.
+    $this->drupalLogin($this->limitedUser);
+    $this->TestViewNodeField(TRUE);
+    $this->TestEditNodeField(FALSE);
+    $this->drupalLogout();
+
+    // Login webuser.
+    $this->drupalLogin($this->webUser);
+    $this->TestViewNodeField(FALSE);
+    $this->TestEditNodeField(FALSE);
+    $this->drupalLogout();
+  }
+
+  /**
+   * Test PUBLIC - view own field.
+   */
+  function TestViewEditOwnField() {
+    $permission = array();
+    $permission = $this->TestCreateCustomPermission($this->limitUserRole, array("view_own_body", "edit_own_body"), $permission);
+    $this->TestChangeCustomPermission($permission);
+
+    // Login width author node.
+    $this->drupalLogin($this->limitedUser);
+    $this->TestViewNodeField(TRUE);
+    $this->TestEditNodeField(TRUE);
+    $this->drupalLogout();
+
+    // Login webuser.
+    $this->drupalLogin($this->webUser);
+    $this->TestViewNodeField(FALSE);
+    $this->TestEditNodeField(FALSE);
+    $this->drupalLogout();
+
+  }
+
+  /**
+   * Test - view edit all field.
+   */
+  function TestViewEditAllField() {
+
+    $this->drupalLogin($this->adminUser);
+    $this->TestViewNodeField(FALSE);
+    $this->TestEditNodeField(FALSE);
+    $this->drupalLogout($this->adminUser);
+    $permission = array();
+    $permission = $this->TestCreateCustomPermission($this->adminUserRole, array("view_body", "edit_body"), $permission);
+    $this->TestChangeCustomPermission($permission);
+
+    $this->drupalLogin($this->adminUser);
+    $this->TestViewNodeField(TRUE);
+    $this->TestEditNodeField(TRUE);
+    $this->drupalLogout();
+  }
+
+  /**
+   * Test execute().
+   */
+  public function testTestPremissionUi() {
+
+    $this->TestPermissionPage();
+    $this->TestFieldEdit();
+    $this->TestInitAddNode();
+
+    debug("Test Private field");
+    $this->TestChengeToPrivateField();
+    debug("Test View own field");
+
+    $this->TestViewOwnField();
+
+    debug("Test View own and edit own field");
+    $this->TestViewEditOwnField();
+    debug("Test View any and edit any field");
+    $this->TestViewEditAllField();
+
+    $this->drupalLogin($this->adminUser);
+    $this->drupalGet('admin/people/permissions');
+  }
+
+}
