private void validateBasicOpsOnAccessor(final VM vm) {
    vm.invoke(() -> {
      Cache cache = getCache();
      Region<String, String> region = cache.getRegion(regionName);

      // populate region
      for (int i = putRange_2Start; i <= putRange_2End; i++) {
        String key = "" + i;
        String value = "" + i;

        String result = region.put(key, value);

        assertThat(result).isNull();
      }

      // create
      for (int i = createRange_2Start; i <= createRange_2End; i++) {
        String key = "" + i;
        String value = i % 2 == 0 ? "" + i : null;

        region.create(key, value);
      }

      // create throws EntryExistsException
      try (IgnoredException ignored1 = addIgnoredException(EntryExistsException.class.getName());
          IgnoredException ignored2 = addIgnoredException(ReplyException.class.getName())) {
        for (int i = createRange_2Start; i <= createRange_2End; i++) {
          String key = "" + i;
          String value = i % 2 == 0 ? "" + i : null;

          assertThatThrownBy(() -> region.create(key, value))
              .isInstanceOf(EntryExistsException.class);
        }
      }

      // invalidate throws EntryNotFoundException THEN repopulate region
      try (IgnoredException ignored1 = addIgnoredException(EntryNotFoundException.class.getName());
          IgnoredException ignored2 = addIgnoredException(ReplyException.class.getName())) {
        for (int i = invalidateRange_2Start; i <= invalidateRange_2End; i++) {
          String key = Integer.toString(i);
          String value = Integer.toString(i);

          assertThatThrownBy(() -> region.invalidate(key))
              .isInstanceOf(EntryNotFoundException.class);

          region.create(key, value);
        }
      }

      // invalidate
      for (int i = invalidateRange_2Start; i <= invalidateRange_2End; i++) {
        String key = Integer.toString(i);
        String value = Integer.toString(i);

        assertThat(region.containsKey(key)).isTrue();
        assertThat(region.containsValueForKey(key)).isTrue();
        assertThat(region.get(key)).isEqualTo(value);

        region.invalidate(key);

        assertThat(region.containsKey(key)).isTrue();
        assertThat(region.containsValueForKey(key)).isFalse();
        assertThat(region.get(key)).isNull();
      }

      // destroy
      for (int i = invalidateRange_2Start; i <= invalidateRange_2End; i++) {
        String key = Integer.toString(i);

        region.destroy(key);

        assertThat(region.containsKey(key)).isFalse();
        assertThat(region.containsValueForKey(key)).isFalse();
        assertThat(region.get(key)).isNull();
      }

      // invalidate throws EntryNotFoundException
      try (IgnoredException ignored1 = addIgnoredException(EntryNotFoundException.class.getName());
          IgnoredException ignored2 = addIgnoredException(ReplyException.class.getName())) {
        for (int i = invalidateRange_2Start; i <= invalidateRange_2End; i++) {
          String key = Integer.toString(i);

          assertThatThrownBy(() -> region.invalidate(key))
              .isInstanceOf(EntryNotFoundException.class);
        }
      }
    });
  }
This is a PartitionedRegion test for scope = D_ACK. 4 VMs are used to create the PR with and
without(Only Accessor) the DataStore.
geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionAPIDUnitTest.java