Browse Source

runtime: storage: Add some tests.

Shamil Gadelshin 3 years ago
parent
commit
9be8579ec0

+ 2 - 1
runtime-modules/storage/src/distribution_bucket_picker.rs

@@ -6,9 +6,10 @@ use sp_runtime::SaturatedConversion;
 use sp_std::cell::RefCell;
 use sp_std::collections::btree_set::BTreeSet;
 use sp_std::marker::PhantomData;
+use sp_std::rc::Rc;
+use sp_std::vec::Vec;
 
 use crate::{DynamicBagType, Module, Trait};
-use sp_std::rc::Rc;
 
 // Generates distribution bucket IDs to assign to a new dynamic bag.
 pub(crate) struct DistributionBucketPicker<T> {

+ 32 - 20
runtime-modules/storage/src/lib.rs

@@ -147,14 +147,6 @@ use bag_manager::BagManager;
 use distribution_bucket_picker::DistributionBucketPicker;
 use storage_bucket_picker::StorageBucketPicker;
 
-// TODO: mut in extrinsics
-
-// TODO:
-// How to be sure that we don't have already accepted invitation? We need to have it in the bucket
-// a separate map. DistributionOperatorId is not sustainable - verify that on Monday.
-// TODO: test invite_distribution_bucket_operator with accepted invitation.
-// TODO: test docs.
-
 /// Public interface for the storage module.
 pub trait DataObjectStorage<T: Trait> {
     /// Validates upload parameters and conditions (like global uploading block).
@@ -1335,7 +1327,7 @@ decl_error! {
         DistributionProviderOperatorAlreadyInvited,
 
         /// Distribution provider operator already set.
-        DistributionProviderOperatorAlreadySet,
+        DistributionProviderOperatorSet,
 
         /// No distribution bucket invitation.
         NoDistributionBucketInvitation,
@@ -1345,6 +1337,9 @@ decl_error! {
 
         /// Max number of pending invitations limit for a distribution bucket reached.
         MaxNumberOfPendingInvitationsLimitForDistributionBucketReached,
+
+        /// Distribution family bound to a bag creation policy.
+        DistributionFamilyBoundToBagCreationPolicy,
     }
 }
 
@@ -1962,7 +1957,14 @@ decl_module! {
 
             // TODO: check for emptiness
 
-            // TODO: check dynamic bag policy
+            Self::check_dynamic_bag_creation_policy_for_dependencies(
+                &family_id,
+                DynamicBagType::Member
+            )?;
+            Self::check_dynamic_bag_creation_policy_for_dependencies(
+                &family_id,
+                DynamicBagType::Channel
+            )?;
 
             //
             // == MUTATION SAFE ==
@@ -1981,7 +1983,6 @@ decl_module! {
             origin,
             family_id: T::DistributionBucketFamilyId,
             accepting_new_bags: bool,
-            // TODO: invited ?
         ) {
             T::ensure_distribution_working_group_leader_origin(origin)?;
 
@@ -2033,8 +2034,6 @@ decl_module! {
                 &distribution_bucket_id
             )?;
 
-            //TODO: Self::ensure_bucket_invitation_accepted(&bucket, worker_id)?;
-
             //
             // == MUTATION SAFE ==
             //
@@ -2063,11 +2062,11 @@ decl_module! {
             T::ensure_distribution_working_group_leader_origin(origin)?;
 
             let mut family = Self::ensure_distribution_bucket_family_exists(&family_id)?;
-            Self::ensure_distribution_bucket_exists(&family, &distribution_bucket_id)?;
+            let bucket = Self::ensure_distribution_bucket_exists(&family, &distribution_bucket_id)?;
 
             //TODO: check emptiness
 
-            //TODO: check invitation
+            ensure!(bucket.operators.is_empty(), Error::<T>::DistributionProviderOperatorSet);
 
             //
             // == MUTATION SAFE ==
@@ -2087,7 +2086,7 @@ decl_module! {
         pub fn update_distribution_buckets_for_bag(
             origin,
             bag_id: BagId<T>,
-            family_id: T::DistributionBucketFamilyId, //TODO: remove this constraint?
+            family_id: T::DistributionBucketFamilyId,
             add_buckets: BTreeSet<T::DistributionBucketId>,
             remove_buckets: BTreeSet<T::DistributionBucketId>,
         ) {
@@ -2158,8 +2157,6 @@ decl_module! {
                 &distribution_bucket_id
             )?;
 
-            //TODO: Self::ensure_bucket_invitation_accepted(&bucket, worker_id)?;
-
             //
             // == MUTATION SAFE ==
             //
@@ -3284,7 +3281,6 @@ impl<T: Trait> Module<T> {
     fn validate_update_families_in_dynamic_bag_creation_policy_params(
         families: &BTreeMap<T::DistributionBucketFamilyId, u32>,
     ) -> DispatchResult {
-        // TODO: check bucket number? also for storage buckets?
         for (family_id, _) in families.iter() {
             Self::ensure_distribution_bucket_family_exists(family_id)?;
         }
@@ -3332,7 +3328,7 @@ impl<T: Trait> Module<T> {
 
         ensure!(
             !bucket.operators.contains(worker_id),
-            Error::<T>::DistributionProviderOperatorAlreadySet
+            Error::<T>::DistributionProviderOperatorSet
         );
 
         ensure!(
@@ -3343,4 +3339,20 @@ impl<T: Trait> Module<T> {
 
         Ok(())
     }
+
+    // Verify that dynamic bag creation policies has no dependencies on given distribution bucket
+    // family for all bag types.
+    fn check_dynamic_bag_creation_policy_for_dependencies(
+        family_id: &T::DistributionBucketFamilyId,
+        dynamic_bag_type: DynamicBagType,
+    ) -> DispatchResult {
+        let creation_policy = Self::get_dynamic_bag_creation_policy(dynamic_bag_type);
+
+        ensure!(
+            !creation_policy.families.contains_key(family_id),
+            Error::<T>::DistributionFamilyBoundToBagCreationPolicy
+        );
+
+        Ok(())
+    }
 }

+ 129 - 0
runtime-modules/storage/src/tests/mod.rs

@@ -3550,6 +3550,60 @@ fn delete_distribution_bucket_family_succeeded() {
     });
 }
 
+#[test]
+fn delete_distribution_bucket_family_fails_with_bound_member_dynamic_bag_creation_policy() {
+    build_test_externalities().execute_with(|| {
+        let family_id = CreateDistributionBucketFamilyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        let new_bucket_number = 10;
+        let families = BTreeMap::from_iter(vec![(family_id, new_bucket_number)]);
+        let dynamic_bag_type = DynamicBagType::Member;
+
+        UpdateFamiliesInDynamicBagCreationPolicyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .with_families(families.clone())
+            .with_dynamic_bag_type(dynamic_bag_type)
+            .call_and_assert(Ok(()));
+
+        DeleteDistributionBucketFamilyFixture::default()
+            .with_family_id(family_id)
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Err(
+                Error::<Test>::DistributionFamilyBoundToBagCreationPolicy.into(),
+            ));
+    });
+}
+
+#[test]
+fn delete_distribution_bucket_family_fails_with_bound_channel_dynamic_bag_creation_policy() {
+    build_test_externalities().execute_with(|| {
+        let family_id = CreateDistributionBucketFamilyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        let new_bucket_number = 10;
+        let families = BTreeMap::from_iter(vec![(family_id, new_bucket_number)]);
+        let dynamic_bag_type = DynamicBagType::Channel;
+
+        UpdateFamiliesInDynamicBagCreationPolicyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .with_families(families.clone())
+            .with_dynamic_bag_type(dynamic_bag_type)
+            .call_and_assert(Ok(()));
+
+        DeleteDistributionBucketFamilyFixture::default()
+            .with_family_id(family_id)
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Err(
+                Error::<Test>::DistributionFamilyBoundToBagCreationPolicy.into(),
+            ));
+    });
+}
+
 #[test]
 fn delete_distribution_bucket_family_fails_with_non_signed_origin() {
     build_test_externalities().execute_with(|| {
@@ -3742,6 +3796,42 @@ fn delete_distribution_bucket_succeeded() {
     });
 }
 
+#[test]
+fn delete_distribution_bucket_failed_with_existing_operators() {
+    build_test_externalities().execute_with(|| {
+        let family_id = CreateDistributionBucketFamilyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        let bucket_id = CreateDistributionBucketFixture::default()
+            .with_family_id(family_id)
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        InviteDistributionBucketOperatorFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .with_bucket_id(bucket_id)
+            .with_family_id(family_id)
+            .with_operator_worker_id(DEFAULT_DISTRIBUTION_PROVIDER_ID)
+            .call_and_assert(Ok(()));
+
+        AcceptDistributionBucketInvitationFixture::default()
+            .with_origin(RawOrigin::Signed(DEFAULT_DISTRIBUTION_PROVIDER_ACCOUNT_ID))
+            .with_family_id(family_id)
+            .with_bucket_id(bucket_id)
+            .with_worker_id(DEFAULT_DISTRIBUTION_PROVIDER_ID)
+            .call_and_assert(Ok(()));
+
+        DeleteDistributionBucketFixture::default()
+            .with_bucket_id(bucket_id)
+            .with_family_id(family_id)
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Err(Error::<Test>::DistributionProviderOperatorSet.into()));
+    });
+}
+
 #[test]
 fn delete_distribution_bucket_fails_with_non_leader_origin() {
     build_test_externalities().execute_with(|| {
@@ -4338,6 +4428,45 @@ fn invite_distribution_bucket_operator_fails_with_exceeding_the_limit_of_pending
     });
 }
 
+#[test]
+fn invite_distribution_bucket_operator_fails_with_already_set_operator() {
+    build_test_externalities().execute_with(|| {
+        let invited_worker_id = DEFAULT_DISTRIBUTION_PROVIDER_ID;
+
+        let family_id = CreateDistributionBucketFamilyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        let bucket_id = CreateDistributionBucketFixture::default()
+            .with_family_id(family_id)
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        InviteDistributionBucketOperatorFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .with_bucket_id(bucket_id)
+            .with_family_id(family_id)
+            .with_operator_worker_id(invited_worker_id)
+            .call_and_assert(Ok(()));
+
+        AcceptDistributionBucketInvitationFixture::default()
+            .with_origin(RawOrigin::Signed(DEFAULT_DISTRIBUTION_PROVIDER_ACCOUNT_ID))
+            .with_bucket_id(bucket_id)
+            .with_family_id(family_id)
+            .with_worker_id(invited_worker_id)
+            .call_and_assert(Ok(()));
+
+        InviteDistributionBucketOperatorFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .with_bucket_id(bucket_id)
+            .with_family_id(family_id)
+            .with_operator_worker_id(invited_worker_id)
+            .call_and_assert(Err(Error::<Test>::DistributionProviderOperatorSet.into()));
+    });
+}
+
 #[test]
 fn invite_distribution_bucket_operator_fails_with_invalid_distribution_provider_id() {
     build_test_externalities().execute_with(|| {