// Copyright (C) 2004-2007 MySQL AB
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as published by
// the Free Software Foundation
//
// There are special exceptions to the terms and conditions of the GPL
// as it is applied to this software. View the full text of the
// exception in file EXCEPTIONS in the directory of this software
// distribution.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using MySql.Data.MySqlClient;
using System.Data;
using NUnit.Framework;
using System.Threading;
using System.Collections;
using System.Diagnostics;
using System.Text;
using System.Collections.Specialized;
namespace MySql.Data.MySqlClient.Tests
{
class GenericListener : TraceListener
{
StringCollection strings;
StringBuilder partial;
public GenericListener()
{
strings = new StringCollection();
partial = new StringBuilder();
}
public StringCollection Strings
{
get { return strings; }
}
public int Find(string sToFind)
{
int count = 0;
foreach (string s in strings)
if (s.IndexOf(sToFind) != -1)
count++;
return count;
}
public void Clear()
{
partial.Remove(0, partial.Length);
strings.Clear();
}
public override void Write(string message)
{
partial.Append(message);
}
public override void WriteLine(string message)
{
Write(message);
strings.Add(partial.ToString());
partial.Remove(0, partial.Length);
}
}
///
/// Summary description for ConnectionTests.
///
[TestFixture]
public class ThreadingTests : BaseTest
{
private void MultipleThreadsWorker(object ev)
{
(ev as ManualResetEvent).WaitOne();
using (MySqlConnection c = new MySqlConnection(GetConnectionString(true)))
{
c.Open();
}
}
///
/// Bug #17106 MySql.Data.MySqlClient.CharSetMap.GetEncoding thread synchronization issue
///
[Test]
public void MultipleThreads()
{
GenericListener myListener = new GenericListener();
ManualResetEvent ev = new ManualResetEvent(false);
ArrayList threads = new ArrayList();
System.Diagnostics.Trace.Listeners.Add(myListener);
for (int i = 0; i < 20; i++)
{
ParameterizedThreadStart ts = new ParameterizedThreadStart(MultipleThreadsWorker);
Thread t = new Thread(ts);
threads.Add(t);
t.Start(ev);
}
// now let the threads go
ev.Set();
// wait for the threads to end
int x = 0;
while (x < threads.Count)
{
while ((threads[x] as Thread).IsAlive)
Thread.Sleep(50);
x++;
}
}
}
}