Also, you can just listen on port 0 and the os will pick a random, unused port for you.

On Tue May  1 20:02:31 2012, Brian Anderson wrote:
----- Original Message -----
From: "Alexander Stavonin" <[email protected]>
To: "Brian Anderson" <[email protected]>
Cc: [email protected]
Sent: Tuesday, May 1, 2012 5:18:56 PM
Subject: Re: [rust-dev] Testing facility and shared data

Unfortunately, I didn't caught your idea with with_fixture :( I have
next situation, may be you have an idea how to fix it:

I need to allocate unique TCP ports numbers for each test. In case of
C/C++ solution is extreamly easy: create singleton or static
variable and just atomically increase last_used_port value for each
test. Do you have idea how to make it in case of Rust? I thought
about external C library for storing static data, but it is dirty
hack. May be would better to use singleton tasks ? Could you point
me into singleton tasks inside core library?

OK. Here are some short-term options. They are all bad.

1) If you only need the unique port numbers to avoid collisions when running in 
parallel then we can come up with a way to run the tests in serial, allowing 
you to reuse port numbers. A hack to do this is by setting the RUST_THREADS 
environment variable to 1. When there is only 1 scheduler thread the test 
runner will run tests serially. There may be other ways to achieve this kind 
without too much work.

2) If you just need to generate a unique integer in every test then write 
`unsafe::reinterpret_cast(task::get_task_id())`. This is a huge hack, but task 
id's are unique, pointer-sized, unsigned integers that start at 0 and increase 
monotonically. If you need many unique uints per task then do the same thing 
but use channels instead of tasks.

3) We can come up with a public API to create global, singleton tasks, possibly 
with the following signatures:

     unsafe fn register_named_service<T>(n: str, f: fn~(port<T>))
     unsafe fn get_named_service<T>(n: str) -> chan<T>

This would, if the named service doesn't exist, create a new task and execute 
the specified function. You would use this in each test to create or retrieve a 
global service to manage your state. The big reservation I have about this is 
that we can not currently make this interface type safe - we can't even check 
the types at runtime.

-Brian
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev


_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to