Repository: tokio-rs/tokio
File: tokio/src/sync/semaphore.rs (Rust)

Code before:
///    // Initialize a static semaphore with only one permit, which is used to
///    // prevent test_insert and test_update from running parallely.
///    static PERMIT: Semaphore = Semaphore::const_new(1);
///
///    // Initialize the database that will be used by the subsequent tests.
///    static DB: database = database::setup();
///
///    #[tokio::test]
///    async fn test_insert() {
///
///         // Acquire permit before proceeding. Since the semaphore has only one permit,
///         // the test will wait if the permit is already acquired by other tests.
///         let permit = PERMIT.acquire().await.unwrap();
///
///         // Do the actual test stuff with database
///
///         // Insert a key-value pair to database
///         let (key, value) = ("name", 0);
///         DB.insert((key, value)).await;
///
///         // Verify if the value has been inserted correctly.
///         assert_eq!(DB.get(key), value);
///
///         // Undo the insertation, make database status unchanged.
///         DB.delete(key).await;
///         // Permit automatically dropped here  
///     }
///     #[tokio::test]
///     async fn test_update() {
///         // Acquire permit first, wait until PERMIT can be acquired
///         let permit = PERMIT.acquire().await.unwrap();
///
///         // Do the same insert.
///         let (key, value) = ("name", 0);
///         DB.insert((key, value)).await;
///
///         // Update the existing value with a new one.
///         let new_value = 1;
///         DB.update((key, new_value)).await;
///
///         // Verify if the value has been updated correctly.
///         assert_eq!(DB.get(key).await, new_value);
///         
///         // Undo any modificattion.
///         DB.delete(key).await;
///         // Permit automatically dropped here.  
///    }
///     #[tokio::test]
///     async fn test_others() {
///         // these tests can run in parallel with test_insert and test_update.
///         // They have nothing to do with PERMIT.

Review comment (suggestion):
I think it's clearer to drop the permit explicitly.
```suggestion
///         // Permit automatically dropped here  
///         drop(permit);
```

Code after:
/// #   map: Mutex<BTreeMap<String, i32>>,
/// # }
/// # impl Database {
/// #    pub const fn setup() -> Database {
/// #        Database {
/// #            map: Mutex::const_new(BTreeMap::new()),
/// #        }
/// #    }
/// #    pub async fn insert(&self, key: &str, value: i32) {
/// #        self.map.lock().await.insert(key.to_string(), value);
/// #    }
/// #    pub async fn update(&self, key: &str, value: i32) {
/// #        self.map.lock().await
/// #            .entry(key.to_string())
/// #            .and_modify(|origin| *origin = value);
/// #    }
/// #    pub async fn delete(&self, key: &str) {
/// #        self.map.lock().await.remove(key);
/// #    }
/// #    pub async fn get(&self, key: &str) -> i32 {
/// #        *self.map.lock().await.get(key).unwrap()
/// #    }
/// # }
///
/// // Initialize a static semaphore with only one permit, which is used to
/// // prevent test_insert and test_update from running in parallel.
/// static PERMIT: Semaphore = Semaphore::const_new(1);
///
/// // Initialize the database that will be used by the subsequent tests.
/// static DB: Database = Database::setup();
///
/// #[tokio::test]
/// # async fn fake_test() {}
/// async fn test_insert() {
///     // Acquire permit before proceeding. Since the semaphore has only one permit,
///     // the test will wait if the permit is already acquired by other tests.
///     let permit = PERMIT.acquire().await.unwrap();
///
///     // Do the actual test stuff with database
///
///     // Insert a key-value pair to database
///     let (key, value) = ("name", 0);
///     DB.insert(key, value).await;
///
///     // Verify that the value has been inserted correctly.
///     assert_eq!(DB.get(key).await, value);
///
///     // Undo the insertion, so the database is empty at the end of the test.
///     DB.delete(key).await;
///
///     // Drop permit. This allows the other test to start running.