http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Functional.Tests/Driver/DriverTestStartHandler.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Functional.Tests/Driver/DriverTestStartHandler.cs b/lang/cs/Tests/ReefTests/Functional.Tests/Driver/DriverTestStartHandler.cs new file mode 100644 index 0000000..4ab94dd --- /dev/null +++ b/lang/cs/Tests/ReefTests/Functional.Tests/Driver/DriverTestStartHandler.cs @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using Org.Apache.Reef.Driver; +using Org.Apache.Reef.Driver.bridge; +using Org.Apache.Reef.Utilities.Logging; +using Org.Apache.Reef.Tang.Annotations; +using Org.Apache.Reef.Wake.Time; + +namespace Org.Apache.Reef.Test +{ + public class DriverTestStartHandler : IStartHandler + { + private static readonly Logger LOGGER = Logger.GetLogger(typeof(DriverTestStartHandler)); + + private IClock _clock; + private HttpServerPort _httpServerPort; + + [Inject] + public DriverTestStartHandler(IClock clock, HttpServerPort httpServerPort) + { + _clock = clock; + _httpServerPort = httpServerPort; + Identifier = "DriverTestStartHandler"; + LOGGER.Log(Level.Info, "Http Server port number: " + httpServerPort.PortNumber); + } + + public string Identifier { get; set; } + } +} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Functional.Tests/Driver/TestDriver.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Functional.Tests/Driver/TestDriver.cs b/lang/cs/Tests/ReefTests/Functional.Tests/Driver/TestDriver.cs new file mode 100644 index 0000000..8f7b36a --- /dev/null +++ b/lang/cs/Tests/ReefTests/Functional.Tests/Driver/TestDriver.cs @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System.Collections.Generic; +using Org.Apache.Reef.Driver.Bridge; +using Org.Apache.Reef.Driver.Defaults; +using Org.Apache.Reef.Utilities.Logging; +using Org.Apache.Reef.Tang.Interface; +using Org.Apache.Reef.Tang.Util; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Org.Apache.Reef.Test +{ + [TestClass] + public class TestDriver : ReefFunctionalTest + { + [TestInitialize()] + public void TestSetup() + { + CleanUp(); + } + + [TestCleanup] + public void TestCleanup() + { + CleanUp(); + } + + /// <summary> + /// This is to test DriverTestStartHandler. No evaluator and tasks are involked. + /// </summary> + [TestMethod, Priority(1), TestCategory("FunctionalGated")] + [Description("Test DriverTestStartHandler. No evaluator and tasks are involked")] + [DeploymentItem(@".")] + [Timeout(180 * 1000)] + public void TestDriverStart() + { + IConfiguration driverConfig = DriverBridgeConfiguration.ConfigurationModule + .Set(DriverBridgeConfiguration.OnDriverStarted, GenericType<DriverTestStartHandler>.Class) + .Set(DriverBridgeConfiguration.CustomTraceListeners, GenericType<DefaultCustomTraceListener>.Class) + .Set(DriverBridgeConfiguration.CustomTraceLevel, Level.Info.ToString()) + .Build(); + + HashSet<string> appDlls = new HashSet<string>(); + appDlls.Add(typeof(DriverTestStartHandler).Assembly.GetName().Name); + + TestRun(appDlls, driverConfig); + + ValidateSuccessForLocalRuntime(0); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/MessageDriver.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/MessageDriver.cs b/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/MessageDriver.cs new file mode 100644 index 0000000..c86c7ae --- /dev/null +++ b/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/MessageDriver.cs @@ -0,0 +1,122 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Net; +using System.Text; +using Org.Apache.Reef.Driver; +using Org.Apache.Reef.Driver.Bridge; +using Org.Apache.Reef.Driver.Context; +using Org.Apache.Reef.Driver.Evaluator; +using Org.Apache.Reef.Driver.Task; +using Org.Apache.Reef.IO.Network.Naming; +using Org.Apache.Reef.Services; +using Org.Apache.Reef.Tasks; +using Org.Apache.Reef.Utilities; +using Org.Apache.Reef.Utilities.Diagnostics; +using Org.Apache.Reef.Utilities.Logging; +using Org.Apache.Reef.Tang.Annotations; +using Org.Apache.Reef.Tang.Implementations.Configuration; +using Org.Apache.Reef.Tang.Interface; +using Org.Apache.Reef.Tang.Util; + +namespace Org.Apache.Reef.Test +{ + public class MessageDriver : IStartHandler, IObserver<IAllocatedEvaluator>, IObserver<IEvaluatorRequestor>, IObserver<ITaskMessage>, IObserver<IRunningTask> + { + public const int NumerOfEvaluator = 1; + + public const string Message = "MESSAGE::DRIVER"; + + private static readonly Logger LOGGER = Logger.GetLogger(typeof(MessageDriver)); + + [Inject] + public MessageDriver() + { + CreateClassHierarchy(); + Identifier = "TaskMessagingStartHandler"; + } + + public string Identifier { get; set; } + + public void OnNext(IAllocatedEvaluator eval) + { + string taskId = "Task_" + eval.Id; + + IConfiguration contextConfiguration = ContextConfiguration.ConfigurationModule + .Set(ContextConfiguration.Identifier, taskId) + .Build(); + + IConfiguration taskConfiguration = TaskConfiguration.ConfigurationModule + .Set(TaskConfiguration.Identifier, taskId) + .Set(TaskConfiguration.Task, GenericType<MessageTask>.Class) + .Set(TaskConfiguration.OnMessage, GenericType<MessageTask.MessagingDriverMessageHandler>.Class) + .Set(TaskConfiguration.OnSendMessage, GenericType<MessageTask>.Class) + .Build(); + + eval.SubmitContextAndTask(contextConfiguration, taskConfiguration); + } + + public void OnNext(IEvaluatorRequestor evalutorRequestor) + { + EvaluatorRequest request = new EvaluatorRequest(NumerOfEvaluator, 512, 2, "WonderlandRack", "TaskMessagingEvaluator"); + evalutorRequestor.Submit(request); + } + + public void OnNext(ITaskMessage taskMessage) + { + string msgReceived = ByteUtilities.ByteArrarysToString(taskMessage.Message); + + LOGGER.Log(Level.Info, string.Format(CultureInfo.InvariantCulture, "CLR TaskMessagingTaskMessageHandler received following message from Task: {0}, Message: {1}.", taskMessage.TaskId, msgReceived)); + + if (!msgReceived.StartsWith(MessageTask.MessageSend, true, CultureInfo.CurrentCulture)) + { + Exceptions.Throw(new Exception("Unexpected message: " + msgReceived), "Unexpected task message received: " + msgReceived, LOGGER); + } + } + + public void OnNext(IRunningTask runningTask) + { + LOGGER.Log(Level.Info, string.Format(CultureInfo.InvariantCulture, "TaskMessegingRunningTaskHandler: {0} is to send message {1}.", runningTask.Id, Message)); + runningTask.Send(ByteUtilities.StringToByteArrays(Message)); + } + + public void OnCompleted() + { + throw new NotImplementedException(); + } + + public void OnError(Exception error) + { + throw new NotImplementedException(); + } + + private void CreateClassHierarchy() + { + HashSet<string> clrDlls = new HashSet<string>(); + clrDlls.Add(typeof(IDriver).Assembly.GetName().Name); + clrDlls.Add(typeof(ITask).Assembly.GetName().Name); + clrDlls.Add(typeof(MessageTask).Assembly.GetName().Name); + + ClrHandlerHelper.GenerateClassHierarchy(clrDlls); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/MessageTask.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/MessageTask.cs b/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/MessageTask.cs new file mode 100644 index 0000000..164724f --- /dev/null +++ b/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/MessageTask.cs @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Threading; +using Org.Apache.Reef.IO.Network.Naming; +using Org.Apache.Reef.Tasks; +using Org.Apache.Reef.Tasks.Events; +using Org.Apache.Reef.Utilities; +using Org.Apache.Reef.Utilities.Diagnostics; +using Org.Apache.Reef.Utilities.Logging; +using Org.Apache.Reef.Tang.Annotations; + +namespace Org.Apache.Reef.Test +{ + public class MessageTask : ITask, ITaskMessageSource + { + public const string MessageSend = "MESSAGE:TASK"; + + private static readonly Logger LOGGER = Logger.GetLogger(typeof(MessageTask)); + + [Inject] + public MessageTask() + { + } + + public HelloService Service { get; set; } + + public Optional<TaskMessage> Message + { + get + { + TaskMessage defaultTaskMessage = TaskMessage.From( + "messagingSourceId", + ByteUtilities.StringToByteArrays(MessageSend + " generated at " + DateTime.Now.ToString(CultureInfo.InvariantCulture))); + return Optional<TaskMessage>.Of(defaultTaskMessage); + } + + set + { + } + } + + public byte[] Call(byte[] memento) + { + Console.WriteLine("Hello, CLR TaskMsg!"); + Thread.Sleep(5 * 1000); + return null; + } + + public void Dispose() + { + LOGGER.Log(Level.Info, "TaskMsg disposed."); + } + + private void DriverMessage(string message) + { + LOGGER.Log(Level.Info, "Receieved DriverMessage in TaskMsg: " + message); + if (!message.Equals(MessageDriver.Message)) + { + Exceptions.Throw(new Exception("Unexpected driver message: " + message), "Unexpected driver message received: " + message, LOGGER); + } + } + + public class MessagingDriverMessageHandler : IDriverMessageHandler + { + private MessageTask _parentTask; + + [Inject] + public MessagingDriverMessageHandler(MessageTask task) + { + _parentTask = task; + } + + public void Handle(IDriverMessage value) + { + string message = string.Empty; + LOGGER.Log(Level.Verbose, "Receieved a message from driver, handling it with MessagingDriverMessageHandler"); + if (value.Message.IsPresent()) + { + message = ByteUtilities.ByteArrarysToString(value.Message.Value); + } + _parentTask.DriverMessage(message); + } + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/TestTaskMessage.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/TestTaskMessage.cs b/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/TestTaskMessage.cs new file mode 100644 index 0000000..89c6fc3 --- /dev/null +++ b/lang/cs/Tests/ReefTests/Functional.Tests/Messaging/TestTaskMessage.cs @@ -0,0 +1,75 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System.Collections.Generic; +using Org.Apache.Reef.Driver.Bridge; +using Org.Apache.Reef.Driver.Defaults; +using Org.Apache.Reef.Tasks; +using Org.Apache.Reef.Utilities.Logging; +using Org.Apache.Reef.Tang.Interface; +using Org.Apache.Reef.Tang.Util; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Org.Apache.Reef.Test +{ + [TestClass] + public class TestTaskMessage : ReefFunctionalTest + { + [TestInitialize()] + public void TestSetup() + { + CleanUp(); + Init(); + } + + [TestCleanup] + public void TestCleanup() + { + CleanUp(); + } + + /// <summary> + /// This test is to test both task message and driver message. The messages are sent + /// from one side and received in the corresponding handlers and verified in the test + /// </summary> + [TestMethod, Priority(1), TestCategory("FunctionalGated")] + [Description("Test task message and driver message")] + [DeploymentItem(@".")] + [Timeout(180 * 1000)] + public void TestSendTaskMessage() + { + IConfiguration driverConfig = DriverBridgeConfiguration.ConfigurationModule + .Set(DriverBridgeConfiguration.OnDriverStarted, GenericType<MessageDriver>.Class) + .Set(DriverBridgeConfiguration.OnEvaluatorAllocated, GenericType<MessageDriver>.Class) + .Set(DriverBridgeConfiguration.OnTaskMessage, GenericType<MessageDriver>.Class) + .Set(DriverBridgeConfiguration.OnTaskRunning, GenericType<MessageDriver>.Class) + .Set(DriverBridgeConfiguration.OnEvaluatorRequested, GenericType<MessageDriver>.Class) + .Set(DriverBridgeConfiguration.CustomTraceListeners, GenericType<DefaultCustomTraceListener>.Class) + .Set(DriverBridgeConfiguration.CustomTraceLevel, Level.Info.ToString()) + .Build(); + + HashSet<string> appDlls = new HashSet<string>(); + appDlls.Add(typeof(MessageDriver).Assembly.GetName().Name); + appDlls.Add(typeof(MessageTask).Assembly.GetName().Name); + + TestRun(appDlls, driverConfig); + ValidateSuccessForLocalRuntime(MessageDriver.NumerOfEvaluator); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Functional.Tests/ReefFunctionalTest.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Functional.Tests/ReefFunctionalTest.cs b/lang/cs/Tests/ReefTests/Functional.Tests/ReefFunctionalTest.cs new file mode 100644 index 0000000..0dd2b46 --- /dev/null +++ b/lang/cs/Tests/ReefTests/Functional.Tests/ReefFunctionalTest.cs @@ -0,0 +1,200 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Timers; +using Org.Apache.Reef.Driver; +using Org.Apache.Reef.Driver.bridge; +using Org.Apache.Reef.Utilities; +using Org.Apache.Reef.Utilities.Logging; +using Org.Apache.Reef.Tang.Interface; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.WindowsAzure.Storage; +using Microsoft.WindowsAzure.Storage.Blob; +using Timer = System.Timers.Timer; + +namespace Org.Apache.Reef.Test +{ + public class ReefFunctionalTest + { + protected const string _stdout = "driver.stdout"; + protected const string _stderr = "driver.stderr"; + protected const string _cmdFile = "run.cmd"; + protected const string _binFolder = "bin"; + // TODO: we will need a proper way to hide this when we are OSS'ed + protected const string _blobStorageConnectionString = + @"DefaultEndpointsProtocol=https;AccountName=reeftestlog;AccountKey=cuUmPRF9DiG56bciNc37O/SfHAoh1jFfJW6AsXAtWLPnjlOzXJGWgXhkyDFOGEHIMscqDU41ElUKnjcsJjWD9w=="; + + private bool _testSuccess = false; + private bool _onLocalRuntime = false; + private string _className = Constants.BridgeLaunchClass; + private string _clrFolder = "."; + private string _reefJar = Path.Combine(_binFolder, Constants.BridgeJarFileName); + private string _runCommand = Path.Combine(_binFolder, _cmdFile); + + // TODO: once things stablize, we would like to toggle this to be false and only enable when needed for debugging test failures. + private bool _enableRealtimeLogUpload = true; + + protected string TestId { get; set; } + + protected Timer TestTimer { get; set; } + + protected Task TimerTask { get; set; } + + protected bool TestSuccess + { + get { return _testSuccess; } + set { _testSuccess = value; } + } + + protected bool IsOnLocalRuntiime + { + get { return _onLocalRuntime; } + set { _onLocalRuntime = value; } + } + + public void Init() + { + TestId = Guid.NewGuid().ToString("N").Substring(0, 8); + Console.WriteLine("Running test " + TestId + ". If failed AND log uploaded is enabled, log can be find in " + Path.Combine(DateTime.Now.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture), TestId)); + if (_enableRealtimeLogUpload) + { + TimerTask = new Task(() => + { + TestTimer = new Timer() + { + Interval = 1000, + Enabled = true, + AutoReset = true + }; + TestTimer.Elapsed += PeriodicUploadLog; + TestTimer.Start(); + }); + TimerTask.Start(); + } + + ValidationUtilities.ValidateEnvVariable("JAVA_HOME"); + + if (!Directory.Exists(_binFolder)) + { + throw new InvalidOperationException(_binFolder + " not found in current directory, cannot init test"); + } + } + + protected void TestRun(HashSet<string> appDlls, IConfiguration driverBridgeConfig, bool runOnYarn = false, JavaLoggingSetting javaLogSettings = JavaLoggingSetting.INFO) + { + ClrClientHelper.Run(appDlls, driverBridgeConfig, new DriverSubmissionSettings() { RunOnYarn = runOnYarn, JavaLogLevel = javaLogSettings }, _reefJar, _runCommand, _clrFolder, _className); + } + + protected void CleanUp() + { + Console.WriteLine("Cleaning up test."); + + if (TimerTask != null) + { + TestTimer.Stop(); + TimerTask.Dispose(); + TimerTask = null; + } + + // Wait for file upload task to complete + Thread.Sleep(500); + + string dir = Path.Combine(Directory.GetCurrentDirectory(), "REEF_LOCAL_RUNTIME"); + try + { + if (Directory.Exists(dir)) + { + Directory.Delete(dir, true); + } + } + catch (IOException) + { + // do not fail if clean up is unsuccessful + } + } + + protected void ValidateSuccessForLocalRuntime(int numberOfEvaluatorsToClose) + { + const string successIndication = "EXIT: ActiveContextClr2Java::Close"; + const string failedTaskIndication = "Java_com_microsoft_reef_javabridge_NativeInterop_ClrSystemFailedTaskHandlerOnNext"; + const string failedEvaluatorIndication = "Java_com_microsoft_reef_javabridge_NativeInterop_ClrSystemFailedEvaluatorHandlerOnNext"; + string[] lines = File.ReadAllLines(GetLogFile(_stdout)); + string[] successIndicators = lines.Where(s => s.Contains(successIndication)).ToArray(); + string[] failedTaskIndicators = lines.Where(s => s.Contains(failedTaskIndication)).ToArray(); + string[] failedIndicators = lines.Where(s => s.Contains(failedEvaluatorIndication)).ToArray(); + Assert.IsTrue(successIndicators.Count() == numberOfEvaluatorsToClose); + Assert.IsFalse(failedTaskIndicators.Any()); + Assert.IsFalse(failedIndicators.Any()); + } + + protected void PeriodicUploadLog(object source, ElapsedEventArgs e) + { + try + { + UploadDriverLog(); + } + catch (Exception) + { + // log not available yet, ignore it + } + } + + protected string GetLogFile(string logFileName) + { + string driverContainerDirectory = Directory.GetDirectories(Path.Combine(Directory.GetCurrentDirectory(), "REEF_LOCAL_RUNTIME"), "driver", SearchOption.AllDirectories).SingleOrDefault(); + if (string.IsNullOrWhiteSpace(driverContainerDirectory)) + { + throw new InvalidOperationException("Cannot find driver container directory"); + } + string logFile = Path.Combine(driverContainerDirectory, logFileName); + if (!File.Exists(logFile)) + { + throw new InvalidOperationException("Driver stdout file not found"); + } + return logFile; + } + + private void UploadDriverLog() + { + string driverStdout = GetLogFile(_stdout); + string driverStderr = GetLogFile(_stderr); + CloudStorageAccount storageAccount = CloudStorageAccount.Parse(_blobStorageConnectionString); + CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); + CloudBlobContainer container = blobClient.GetContainerReference(DateTime.Now.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); + container.CreateIfNotExists(); + + CloudBlockBlob blob = container.GetBlockBlobReference(Path.Combine(TestId, "driverStdOut")); + FileStream fs = new FileStream(driverStdout, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + blob.UploadFromStream(fs); + fs.Close(); + + blob = container.GetBlockBlobReference(Path.Combine(TestId, "driverStdErr")); + fs = new FileStream(driverStderr, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + blob.UploadFromStream(fs); + fs.Close(); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/IO.Tests/BlockingCollectionExtensionTests.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/IO.Tests/BlockingCollectionExtensionTests.cs b/lang/cs/Tests/ReefTests/IO.Tests/BlockingCollectionExtensionTests.cs new file mode 100644 index 0000000..3ccd3e9 --- /dev/null +++ b/lang/cs/Tests/ReefTests/IO.Tests/BlockingCollectionExtensionTests.cs @@ -0,0 +1,78 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using Org.Apache.Reef.IO.Network.Utilities; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Org.Apache.Reef.Test.IO.Tests +{ + [TestClass] + public class BlockingCollectionExtensionTests + { + [TestMethod] + public void TestCollectionContainsElement() + { + string item = "abc"; + BlockingCollection<string> collection = new BlockingCollection<string>(); + collection.Add(item); + + Assert.AreEqual(item, collection.Take(item)); + + // Check that item is no longer in collection + Assert.AreEqual(0, collection.Count); + } + + [TestMethod] + public void TestCollectionContainsElement2() + { + string item = "abc"; + BlockingCollection<string> collection = new BlockingCollection<string>(); + collection.Add("cat"); + collection.Add(item); + collection.Add("dog"); + + Assert.AreEqual(item, collection.Take(item)); + + // Remove remaining items, check that item is not there + Assert.AreNotEqual(item, collection.Take()); + Assert.AreNotEqual(item, collection.Take()); + Assert.AreEqual(0, collection.Count); + } + + [TestMethod] + [ExpectedException(typeof(InvalidOperationException))] + public void TestCollectionDoesNotContainsElement() + { + string item1 = "abc"; + string item2 = "def"; + + BlockingCollection<string> collection = new BlockingCollection<string>(); + collection.Add(item2); + + // Should throw InvalidOperationException since item1 is not in collection + collection.Take(item1); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/IO.Tests/NameServerTests.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/IO.Tests/NameServerTests.cs b/lang/cs/Tests/ReefTests/IO.Tests/NameServerTests.cs new file mode 100644 index 0000000..ee118da --- /dev/null +++ b/lang/cs/Tests/ReefTests/IO.Tests/NameServerTests.cs @@ -0,0 +1,274 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Org.Apache.Reef.Common.io; +using Org.Apache.Reef.IO.Network.Naming; +using Org.Apache.Reef.IO.Network.Naming.Events; +using Org.Apache.Reef.Tang.Annotations; +using Org.Apache.Reef.Tang.Implementations; +using Org.Apache.Reef.Tang.Interface; +using Org.Apache.Reef.Tang.Util; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.Apache.Reef.Wake.Util; + +namespace Org.Apache.Reef.Test +{ + [TestClass] + public class NameServerTests + { + [TestMethod] + public void TestNameServerNoRequests() + { + using (var server = new NameServer(0)) + { + } + } + + [TestMethod] + public void TestNameServerNoRequestsTwoClients() + { + using (var server = new NameServer(0)) + { + var nameClient = new NameClient(server.LocalEndpoint); + var nameClient2 = new NameClient(server.LocalEndpoint); + nameClient2.Register("1", new IPEndPoint(IPAddress.Any, 8080)); + nameClient.Lookup("1"); + } + } + + [TestMethod] + public void TestNameServerNoRequestsTwoClients2() + { + using (var server = new NameServer(0)) + { + var nameClient = new NameClient(server.LocalEndpoint); + var nameClient2 = new NameClient(server.LocalEndpoint); + nameClient2.Register("1", new IPEndPoint(IPAddress.Any, 8080)); + nameClient.Lookup("1"); + } + } + + [TestMethod] + public void TestNameServerMultipleRequestsTwoClients() + { + using (var server = new NameServer(0)) + { + var nameClient = new NameClient(server.LocalEndpoint); + var nameClient2 = new NameClient(server.LocalEndpoint); + nameClient.Register("1", new IPEndPoint(IPAddress.Any, 8080)); + nameClient2.Lookup("1"); + } + } + + [TestMethod] + public void TestRegister() + { + using (INameServer server = BuildNameServer()) + { + using (INameClient client = BuildNameClient(server.LocalEndpoint)) + { + IPEndPoint endpoint1 = new IPEndPoint(IPAddress.Parse("100.0.0.1"), 100); + IPEndPoint endpoint2 = new IPEndPoint(IPAddress.Parse("100.0.0.2"), 200); + IPEndPoint endpoint3 = new IPEndPoint(IPAddress.Parse("100.0.0.3"), 300); + + // Check that no endpoints have been registered + Assert.IsNull(client.Lookup("a")); + Assert.IsNull(client.Lookup("b")); + Assert.IsNull(client.Lookup("c")); + + // Register endpoints + client.Register("a", endpoint1); + client.Register("b", endpoint2); + client.Register("c", endpoint3); + + // Check that they can be looked up correctly + Assert.AreEqual(endpoint1, client.Lookup("a")); + Assert.AreEqual(endpoint2, client.Lookup("b")); + Assert.AreEqual(endpoint3, client.Lookup("c")); + } + } + } + + [TestMethod] + public void TestUnregister() + { + using (INameServer server = BuildNameServer()) + { + using (INameClient client = BuildNameClient(server.LocalEndpoint)) + { + IPEndPoint endpoint1 = new IPEndPoint(IPAddress.Parse("100.0.0.1"), 100); + + // Register endpoint + client.Register("a", endpoint1); + + // Check that it can be looked up correctly + Assert.AreEqual(endpoint1, client.Lookup("a")); + + // Unregister endpoints + client.Unregister("a"); + Thread.Sleep(1000); + + // Make sure they were unregistered correctly + Assert.IsNull(client.Lookup("a")); + } + } + } + + [TestMethod] + public void TestLookup() + { + using (INameServer server = BuildNameServer()) + { + using (INameClient client = BuildNameClient(server.LocalEndpoint)) + { + IPEndPoint endpoint1 = new IPEndPoint(IPAddress.Parse("100.0.0.1"), 100); + IPEndPoint endpoint2 = new IPEndPoint(IPAddress.Parse("100.0.0.2"), 200); + + // Register endpoint1 + client.Register("a", endpoint1); + Assert.AreEqual(endpoint1, client.Lookup("a")); + + // Reregister identifer a + client.Register("a", endpoint2); + Assert.AreEqual(endpoint2, client.Lookup("a")); + } + } + } + + [TestMethod] + public void TestLookupList() + { + using (INameServer server = BuildNameServer()) + { + using (INameClient client = BuildNameClient(server.LocalEndpoint)) + { + IPEndPoint endpoint1 = new IPEndPoint(IPAddress.Parse("100.0.0.1"), 100); + IPEndPoint endpoint2 = new IPEndPoint(IPAddress.Parse("100.0.0.2"), 200); + IPEndPoint endpoint3 = new IPEndPoint(IPAddress.Parse("100.0.0.3"), 300); + + // Register endpoints + client.Register("a", endpoint1); + client.Register("b", endpoint2); + client.Register("c", endpoint3); + + // Look up both at the same time + List<string> ids = new List<string> { "a", "b", "c", "d" }; + List<NameAssignment> assignments = client.Lookup(ids); + + // Check that a, b, and c are registered + Assert.AreEqual("a", assignments[0].Identifier); + Assert.AreEqual(endpoint1, assignments[0].Endpoint); + Assert.AreEqual("b", assignments[1].Identifier); + Assert.AreEqual(endpoint2, assignments[1].Endpoint); + Assert.AreEqual("c", assignments[2].Identifier); + Assert.AreEqual(endpoint3, assignments[2].Endpoint); + + // Check that d is not registered + Assert.AreEqual(3, assignments.Count); + } + } + } + + [TestMethod] + public void TestNameClientRestart() + { + int oldPort = 6666; + int newPort = 6662; + INameServer server = new NameServer(oldPort); + + using (INameClient client = BuildNameClient(server.LocalEndpoint)) + { + IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("100.0.0.1"), 100); + + client.Register("a", endpoint); + Assert.AreEqual(endpoint, client.Lookup("a")); + + server.Dispose(); + + server = new NameServer(newPort); + client.Restart(server.LocalEndpoint); + + client.Register("b", endpoint); + Assert.AreEqual(endpoint, client.Lookup("b")); + + server.Dispose(); + } + } + + [TestMethod] + public void TestConstructorInjection() + { + int port = 6666; + using (INameServer server = new NameServer(port)) + { + IConfiguration nameClientConfiguration = NamingConfiguration.ConfigurationModule + .Set(NamingConfiguration.NameServerAddress, server.LocalEndpoint.Address.ToString()) + .Set(NamingConfiguration.NameServerPort, port + string.Empty) + .Build(); + + ConstructorInjection c = TangFactory.GetTang() + .NewInjector(nameClientConfiguration) + .GetInstance<ConstructorInjection>(); + + Assert.IsNotNull(c); + } + } + + private INameServer BuildNameServer() + { + var builder = TangFactory.GetTang() + .NewConfigurationBuilder() + .BindNamedParameter<NamingConfigurationOptions.NameServerPort, int>( + GenericType<NamingConfigurationOptions.NameServerPort>.Class, "0"); + + return TangFactory.GetTang().NewInjector(builder.Build()).GetInstance<INameServer>(); + } + + private INameClient BuildNameClient(IPEndPoint remoteEndpoint) + { + string nameServerAddr = remoteEndpoint.Address.ToString(); + int nameServerPort = remoteEndpoint.Port; + IConfiguration nameClientConfiguration = NamingConfiguration.ConfigurationModule + .Set(NamingConfiguration.NameServerAddress, nameServerAddr) + .Set(NamingConfiguration.NameServerPort, nameServerPort + string.Empty) + .Build(); + + return TangFactory.GetTang().NewInjector(nameClientConfiguration).GetInstance<NameClient>(); + } + + private class ConstructorInjection + { + [Inject] + public ConstructorInjection(NameClient client) + { + if (client == null) + { + throw new ArgumentNullException("client"); + } + } + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/IO.Tests/NetworkServiceTests.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/IO.Tests/NetworkServiceTests.cs b/lang/cs/Tests/ReefTests/IO.Tests/NetworkServiceTests.cs new file mode 100644 index 0000000..46dce1b --- /dev/null +++ b/lang/cs/Tests/ReefTests/IO.Tests/NetworkServiceTests.cs @@ -0,0 +1,202 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using Org.Apache.Reef.Common.io; +using Org.Apache.Reef.IO.Network.Naming; +using Org.Apache.Reef.IO.Network.NetworkService; +using Org.Apache.Reef.Tang.Annotations; +using Org.Apache.Reef.Tang.Implementations; +using Org.Apache.Reef.Tang.Interface; +using Org.Apache.Reef.Tang.Util; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.Apache.Reef.Wake; +using Org.Apache.Reef.Wake.Remote; +using Org.Apache.Reef.Wake.Remote.Impl; +using Org.Apache.Reef.Wake.Util; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace Org.Apache.Reef.Test.IO.Tests +{ + [TestClass] + public class NetworkServiceTests + { + [TestMethod] + public void TestNetworkServiceOneWayCommunication() + { + int networkServicePort1 = NetworkUtils.GenerateRandomPort(6000, 7000); + int networkServicePort2 = NetworkUtils.GenerateRandomPort(7001, 8000); + + BlockingCollection<string> queue = new BlockingCollection<string>(); + + using (INameServer nameServer = new NameServer(0)) + { + IPEndPoint endpoint = nameServer.LocalEndpoint; + int nameServerPort = endpoint.Port; + string nameServerAddr = endpoint.Address.ToString(); + using (INetworkService<string> networkService1 = BuildNetworkService(networkServicePort1, nameServerPort, nameServerAddr, null)) + using (INetworkService<string> networkService2 = BuildNetworkService(networkServicePort2, nameServerPort, nameServerAddr, new MessageHandler(queue))) + { + IIdentifier id1 = new StringIdentifier("service1"); + IIdentifier id2 = new StringIdentifier("service2"); + networkService1.Register(id1); + networkService2.Register(id2); + + using (IConnection<string> connection = networkService1.NewConnection(id2)) + { + connection.Open(); + connection.Write("abc"); + connection.Write("def"); + connection.Write("ghi"); + + Assert.AreEqual("abc", queue.Take()); + Assert.AreEqual("def", queue.Take()); + Assert.AreEqual("ghi", queue.Take()); + } + } + } + } + + [TestMethod] + public void TestNetworkServiceTwoWayCommunication() + { + int networkServicePort1 = NetworkUtils.GenerateRandomPort(6000, 7000); + int networkServicePort2 = NetworkUtils.GenerateRandomPort(7001, 8000); + + BlockingCollection<string> queue1 = new BlockingCollection<string>(); + BlockingCollection<string> queue2 = new BlockingCollection<string>(); + + using (INameServer nameServer = new NameServer(0)) + { + IPEndPoint endpoint = nameServer.LocalEndpoint; + int nameServerPort = endpoint.Port; + string nameServerAddr = endpoint.Address.ToString(); + using (INetworkService<string> networkService1 = BuildNetworkService(networkServicePort1, nameServerPort, nameServerAddr, new MessageHandler(queue1))) + using (INetworkService<string> networkService2 = BuildNetworkService(networkServicePort2, nameServerPort, nameServerAddr, new MessageHandler(queue2))) + { + IIdentifier id1 = new StringIdentifier("service1"); + IIdentifier id2 = new StringIdentifier("service2"); + networkService1.Register(id1); + networkService2.Register(id2); + + using (IConnection<string> connection1 = networkService1.NewConnection(id2)) + using (IConnection<string> connection2 = networkService2.NewConnection(id1)) + { + connection1.Open(); + connection1.Write("abc"); + connection1.Write("def"); + connection1.Write("ghi"); + + connection2.Open(); + connection2.Write("jkl"); + connection2.Write("mno"); + + Assert.AreEqual("abc", queue2.Take()); + Assert.AreEqual("def", queue2.Take()); + Assert.AreEqual("ghi", queue2.Take()); + + Assert.AreEqual("jkl", queue1.Take()); + Assert.AreEqual("mno", queue1.Take()); + } + } + } + } + + private INetworkService<string> BuildNetworkService( + int networkServicePort, + int nameServicePort, + string nameServiceAddr, + IObserver<NsMessage<string>> handler) + { + // Test injection + if (handler == null) + { + var networkServiceConf = TangFactory.GetTang().NewConfigurationBuilder() + .BindNamedParameter<NetworkServiceOptions.NetworkServicePort, int>( + GenericType<NetworkServiceOptions.NetworkServicePort>.Class, + networkServicePort.ToString(CultureInfo.CurrentCulture)) + .BindNamedParameter<NamingConfigurationOptions.NameServerPort, int>( + GenericType<NamingConfigurationOptions.NameServerPort>.Class, + nameServicePort.ToString(CultureInfo.CurrentCulture)) + .BindNamedParameter<NamingConfigurationOptions.NameServerAddress, string>( + GenericType<NamingConfigurationOptions.NameServerAddress>.Class, + nameServiceAddr) + .BindImplementation(GenericType<ICodec<string>>.Class, GenericType<StringCodec>.Class) + .BindImplementation(GenericType<IObserver<NsMessage<string>>>.Class, GenericType<NetworkMessageHandler>.Class) + .Build(); + + return TangFactory.GetTang().NewInjector(networkServiceConf).GetInstance<NetworkService<string>>(); + } + + return new NetworkService<string>(networkServicePort, nameServiceAddr, nameServicePort, + handler, new StringIdentifierFactory(), new StringCodec()); + } + + private class MessageHandler : IObserver<NsMessage<string>> + { + private BlockingCollection<string> _queue; + + public MessageHandler(BlockingCollection<string> queue) + { + _queue = queue; + } + + public void OnNext(NsMessage<string> value) + { + _queue.Add(value.Data.First()); + } + + public void OnError(Exception error) + { + throw new NotImplementedException(); + } + + public void OnCompleted() + { + throw new NotImplementedException(); + } + } + + private class NetworkMessageHandler : IObserver<NsMessage<string>> + { + [Inject] + public NetworkMessageHandler() + { + } + + public void OnNext(NsMessage<string> value) + { + } + + public void OnError(Exception error) + { + } + + public void OnCompleted() + { + } + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Properties/AssemblyInfo.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Properties/AssemblyInfo.cs b/lang/cs/Tests/ReefTests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9d92b89 --- /dev/null +++ b/lang/cs/Tests/ReefTests/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ReefTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ReefTests")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("19ebceb4-3b1f-466b-9127-aa14e636d723")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/ReefTests.csproj ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/ReefTests.csproj b/lang/cs/Tests/ReefTests/ReefTests.csproj new file mode 100644 index 0000000..221dd0b --- /dev/null +++ b/lang/cs/Tests/ReefTests/ReefTests.csproj @@ -0,0 +1,192 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{988F90CF-A48D-4938-A4D2-FA3B758FB5A7}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>Org.Apache.Reef.Test</RootNamespace> + <AssemblyName>Org.Apache.Reef.Test</AssemblyName> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir> + <RestorePackages>true</RestorePackages> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>..\..\bin\Debug\Org.Apache.Reef.Test\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>..\..\bin\Release\Microsoft.Reef.Tests\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="Microsoft.Data.Edm, Version=5.6.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\packages\Microsoft.Data.Edm.5.6.3\lib\net40\Microsoft.Data.Edm.dll</HintPath> + </Reference> + <Reference Include="Microsoft.Data.OData, Version=5.6.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\packages\Microsoft.Data.OData.5.6.3\lib\net40\Microsoft.Data.OData.dll</HintPath> + </Reference> + <Reference Include="Microsoft.Data.Services.Client, Version=5.6.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\packages\Microsoft.Data.Services.Client.5.6.3\lib\net40\Microsoft.Data.Services.Client.dll</HintPath> + </Reference> + <Reference Include="Microsoft.Hadoop.Avro"> + <HintPath>..\..\packages\Microsoft.Hadoop.Avro.1.4.0.0\lib\net40\Microsoft.Hadoop.Avro.dll</HintPath> + </Reference> + <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> + <Reference Include="Microsoft.WindowsAzure.Configuration"> + <HintPath>..\..\packages\Microsoft.WindowsAzure.ConfigurationManager.2.0.3\lib\net40\Microsoft.WindowsAzure.Configuration.dll</HintPath> + </Reference> + <Reference Include="Microsoft.WindowsAzure.Storage"> + <HintPath>..\..\packages\WindowsAzure.Storage.4.3.0\lib\net40\Microsoft.WindowsAzure.Storage.dll</HintPath> + </Reference> + <Reference Include="Newtonsoft.Json"> + <HintPath>..\..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath> + </Reference> + <Reference Include="protobuf-net"> + <HintPath>..\..\packages\protobuf-net.2.0.0.668\lib\net40\protobuf-net.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.Core" /> + <Reference Include="System.Reactive.Core"> + <HintPath>..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath> + </Reference> + <Reference Include="System.Reactive.Interfaces"> + <HintPath>..\..\packages\Rx-Interfaces.2.2.5\lib\net45\System.Reactive.Interfaces.dll</HintPath> + </Reference> + <Reference Include="System.Spatial, Version=5.6.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\packages\System.Spatial.5.6.3\lib\net40\System.Spatial.dll</HintPath> + </Reference> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Evaluator.Tests\EvaluatorConfigurationsTests.cs" /> + <Compile Include="Evaluator.Tests\EvaluatorTests.cs" /> + <Compile Include="Functional.Tests\Bridge\TestBridgeClient.cs" /> + <Compile Include="Functional.Tests\Bridge\TestHelloBridgeHandlers.cs" /> + <Compile Include="Functional.Tests\Bridge\TestSimpleEventHandlers.cs" /> + <Compile Include="Functional.Tests\Driver\DriverTestStartHandler.cs" /> + <Compile Include="Functional.Tests\Driver\TestDriver.cs" /> + <Compile Include="Functional.Tests\Messaging\MessageDriver.cs" /> + <Compile Include="Functional.Tests\Messaging\MessageTask.cs" /> + <Compile Include="Functional.Tests\Messaging\TestTaskMessage.cs" /> + <Compile Include="Functional.Tests\ReefFunctionalTest.cs" /> + <Compile Include="IO.Tests\BlockingCollectionExtensionTests.cs" /> + <Compile Include="IO.Tests\NameServerTests.cs" /> + <Compile Include="IO.Tests\NetworkServiceTests.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="Utility.Test\TestDriverConfigGenerator.cs" /> + <Compile Include="Utility.Test\TestExceptions.cs" /> + </ItemGroup> + <ItemGroup> + <None Include="bin\run.cmd"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Include="ConfigFiles\evaluator.conf"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> + <None Include="packages.config" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\Source\REEF\reef-applications\CLRBridgeClient\CLRBridgeClient.csproj"> + <Project>{5094c35b-4fdb-4322-ac05-45d684501cbf}</Project> + <Name>CLRBridgeClient</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\REEF\reef-applications\Evaluator\Evaluator.csproj"> + <Project>{1b983182-9c30-464c-948d-f87eb93a8240}</Project> + <Name>Evaluator</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\REEF\reef-common\ReefCommon\ReefCommon.csproj"> + <Project>{545a0582-4105-44ce-b99c-b1379514a630}</Project> + <Name>ReefCommon</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\REEF\reef-common\ReefDriver\ReefDriver.csproj"> + <Project>{a6baa2a7-f52f-4329-884e-1bcf711d6805}</Project> + <Name>ReefDriver</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\REEF\reef-examples\HelloCLRBridge\HelloCLRBridge.csproj"> + <Project>{a78dd8e8-31d0-4506-8738-daa9da86d55b}</Project> + <Name>HelloCLRBridge</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\REEF\reef-io\NetWork\NetWork.csproj"> + <Project>{883ce800-6a6a-4e0a-b7fe-c054f4f2c1dc}</Project> + <Name>NetWork</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\REEF\reef-tasks\Tasks\Tasks.csproj"> + <Project>{75503f90-7b82-4762-9997-94b5c68f15db}</Project> + <Name>Tasks</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\TANG\Tang\Tang.csproj"> + <Project>{97dbb573-3994-417a-9f69-ffa25f00d2a6}</Project> + <Name>Tang</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\Utilities\Utilities.csproj"> + <Project>{79e7f89a-1dfb-45e1-8d43-d71a954aeb98}</Project> + <Name>Utilities</Name> + </ProjectReference> + <ProjectReference Include="..\..\Source\WAKE\Wake\Wake.csproj"> + <Project>{cdfb3464-4041-42b1-9271-83af24cd5008}</Project> + <Name>Wake</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <Content Include="bin\reef-bridge-0.11.0-incubating-SNAPSHOT-shaded.jar"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + </ItemGroup> + <ItemGroup> + <Folder Include="bin\Debug\" /> + <Folder Include="bin\Release\" /> + </ItemGroup> + <ItemGroup> + <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Utility.Test/TestDriverConfigGenerator.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Utility.Test/TestDriverConfigGenerator.cs b/lang/cs/Tests/ReefTests/Utility.Test/TestDriverConfigGenerator.cs new file mode 100644 index 0000000..214188a --- /dev/null +++ b/lang/cs/Tests/ReefTests/Utility.Test/TestDriverConfigGenerator.cs @@ -0,0 +1,101 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System; +using Org.Apache.Reef.Driver; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Org.Apache.Reef.Test.Utility.Test +{ + [TestClass] + public class TestDriverConfigGenerator + { + [TestMethod] + public void TestGeneratingFullDriverConfigFile() + { + DriverConfigurationSettings driverSubmissionSettings = new DriverConfigurationSettings() + { + DriverMemory = 1024, + DriverIdentifier = "juliaDriverId", + SubmissionDirectory = "reefClrBridgeTmp/job_" + Guid.NewGuid().ToString("N").Substring(0, 8), + IncludingHttpServer = true, + IncludingNameServer = true, + //ClrFolder = "C:\\Reef\\ReefApache\\incubator-reef\\reef-bridge-project\\reef-bridge\\dotnetHello", + ClrFolder = ".", + JarFileFolder = ".\\bin\\" + }; + + DriverConfigGenerator.DriverConfigurationBuilder(driverSubmissionSettings); + } + + [TestMethod] + public void TestGeneratingDriverConfigFileWithoutHttp() + { + DriverConfigurationSettings driverSubmissionSettings = new DriverConfigurationSettings() + { + DriverMemory = 1024, + DriverIdentifier = "juliaDriverId", + SubmissionDirectory = "reefClrBridgeTmp/job_" + Guid.NewGuid().ToString("N").Substring(0, 8), + IncludingHttpServer = false, + IncludingNameServer = true, +// ClrFolder = "C:\\Reef\\ReefApache\\incubator-reef\\reef-bridge-project\\reef-bridge\\dotnetHello", + ClrFolder = ".", + JarFileFolder = ".\\bin\\" + }; + + DriverConfigGenerator.DriverConfigurationBuilder(driverSubmissionSettings); + } + + [TestMethod] + public void TestGeneratingDriverConfigFileWithoutNameServer() + { + DriverConfigurationSettings driverSubmissionSettings = new DriverConfigurationSettings() + { + DriverMemory = 1024, + DriverIdentifier = "juliaDriverId", + SubmissionDirectory = "reefClrBridgeTmp/job_" + Guid.NewGuid().ToString("N").Substring(0, 8), + IncludingHttpServer = true, + IncludingNameServer = false, + //ClrFolder = "C:\\Reef\\ReefApache\\incubator-reef\\reef-bridge-project\\reef-bridge\\dotnetHello", + ClrFolder = ".", + JarFileFolder = ".\\bin\\" + }; + + DriverConfigGenerator.DriverConfigurationBuilder(driverSubmissionSettings); + } + + [TestMethod] + public void TestGeneratingDriverConfigFileDriverOnly() + { + DriverConfigurationSettings driverSubmissionSettings = new DriverConfigurationSettings() + { + DriverMemory = 1024, + DriverIdentifier = "juliaDriverId", + SubmissionDirectory = "reefClrBridgeTmp/job_" + Guid.NewGuid().ToString("N").Substring(0, 8), + IncludingHttpServer = false, + IncludingNameServer = false, + //ClrFolder = "C:\\Reef\\ReefApache\\incubator-reef\\reef-bridge-project\\reef-bridge\\dotnetHello", + ClrFolder = ".", + JarFileFolder = ".\\bin\\" + }; + + DriverConfigGenerator.DriverConfigurationBuilder(driverSubmissionSettings); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/Utility.Test/TestExceptions.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/Utility.Test/TestExceptions.cs b/lang/cs/Tests/ReefTests/Utility.Test/TestExceptions.cs new file mode 100644 index 0000000..16bde92 --- /dev/null +++ b/lang/cs/Tests/ReefTests/Utility.Test/TestExceptions.cs @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System; +using Org.Apache.Reef.Utilities.Diagnostics; +using Org.Apache.Reef.Utilities.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Org.Apache.Reef.Test.Utility.Test +{ + [TestClass] + public class TestExceptions + { + private static readonly Logger LOGGER = Logger.GetLogger(typeof(TestExceptions)); + + [TestMethod] + public void TestThrowCaught() + { + string msg = null; + try + { + Exceptions.Throw(new ApplicationException("test"), LOGGER); + msg = "not supposed to reach here"; + Assert.Fail(msg); + } + catch (ApplicationException e) + { + Exceptions.Caught(e, Level.Info, LOGGER); + } + Assert.IsNull(msg); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/bin/reef-bridge-0.11.0-incubating-SNAPSHOT-shaded.jar ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/bin/reef-bridge-0.11.0-incubating-SNAPSHOT-shaded.jar b/lang/cs/Tests/ReefTests/bin/reef-bridge-0.11.0-incubating-SNAPSHOT-shaded.jar new file mode 100644 index 0000000..e43d8bf Binary files /dev/null and b/lang/cs/Tests/ReefTests/bin/reef-bridge-0.11.0-incubating-SNAPSHOT-shaded.jar differ http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/bin/run.cmd ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/bin/run.cmd b/lang/cs/Tests/ReefTests/bin/run.cmd new file mode 100644 index 0000000..ddff8a7 --- /dev/null +++ b/lang/cs/Tests/ReefTests/bin/run.cmd @@ -0,0 +1,45 @@ +@REM +@REM Copyright (C) 2013 Microsoft Corporation +@REM +@REM Licensed under the Apache License, Version 2.0 (the "License"); +@REM you may not use this file except in compliance with the License. +@REM You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, software +@REM distributed under the License is distributed on an "AS IS" BASIS, +@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@REM See the License for the specific language governing permissions and +@REM limitations under the License. +@REM + +@echo off +:: +:: Copyright (C) 2013 Microsoft Corporation +:: +:: Licensed under the Apache License, Version 2.0 (the "License"); +:: you may not use this file except in compliance with the License. +:: You may obtain a copy of the License at +:: +:: http:\\www.apache.org\licenses\LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, software +:: distributed under the License is distributed on an "AS IS" BASIS, +:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +:: See the License for the specific language governing permissions and +:: limitations under the License. +:: + + +:: RUNTIME +set SHADED_JAR=bin\reef-bridge-0.11.0-incubating-SNAPSHOT-shaded.jar + +set LOGGING_CONFIG=-Djava.util.logging.config.class=org.apache.reef.util.logging.Config + +set CLASSPATH=%HADOOP_HOME%\share\hadoop\hdfs\lib\*;%HADOOP_HOME%\share\hadoop\hdfs\*;%HADOOP_HOME%\share\hadoop\common\*;%HADOOP_HOME%\share\hadoop\common\lib\*;%HADOOP_HOME%\share\hadoop\mapreduce\lib\*;%HADOOP_HOME%\share\hadoop\mapreduce\*;%HADOOP_HOME%\share\hadoop\yarn\*;%HADOOP_HOME%\share\hadoop\yarn\lib\* + +set CMD=%JAVA_HOME%\bin\java.exe -cp %HADOOP_HOME%\etc\hadoop;%SHADED_JAR%;%CLASSPATH% %* +::%LOGGING_CONFIG% +echo %CMD% +%CMD% http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/ReefTests/packages.config ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/ReefTests/packages.config b/lang/cs/Tests/ReefTests/packages.config new file mode 100644 index 0000000..ef4860c --- /dev/null +++ b/lang/cs/Tests/ReefTests/packages.config @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<packages> + <package id="Microsoft.Data.Edm" version="5.6.3" targetFramework="net45" /> + <package id="Microsoft.Data.OData" version="5.6.3" targetFramework="net45" /> + <package id="Microsoft.Data.Services.Client" version="5.6.3" targetFramework="net45" /> + <package id="Microsoft.Hadoop.Avro" version="1.4.0.0" targetFramework="net45" /> + <package id="Microsoft.WindowsAzure.ConfigurationManager" version="2.0.3" targetFramework="net45" /> + <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" /> + <package id="protobuf-net" version="2.0.0.668" targetFramework="net45" /> + <package id="Rx-Core" version="2.2.5" targetFramework="net45" /> + <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" /> + <package id="System.Spatial" version="5.6.3" targetFramework="net45" /> + <package id="WindowsAzure.Storage" version="4.3.0" targetFramework="net45" /> +</packages> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ClassHierarchy/TestAnonymousType.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Tests/TangTests/ClassHierarchy/TestAnonymousType.cs b/lang/cs/Tests/TangTests/ClassHierarchy/TestAnonymousType.cs new file mode 100644 index 0000000..262ea7a --- /dev/null +++ b/lang/cs/Tests/TangTests/ClassHierarchy/TestAnonymousType.cs @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +using System; +using System.Collections.Generic; +using System.IO; +using Org.Apache.Reef.Tang.Examples; +using Org.Apache.Reef.Tang.Implementations; +using Org.Apache.Reef.Tang.Interface; +using Org.Apache.Reef.Tang.Protobuf; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Org.Apache.Reef.Tang.Test.ClassHierarchy +{ + [TestClass] + public class TestAnonymousType + { + const string ClassHierarchyBinFileName = "example.bin"; + + [ClassInitialize] + public static void ClassSetup(TestContext context) + { + TangImpl.Reset(); + } + + [TestMethod] + public void TestAnonymousTypeWithDictionary() + { + List<string> appDlls = new List<string>(); + appDlls.Add(typeof(AnonymousType).Assembly.GetName().Name); + var c = TangFactory.GetTang().GetClassHierarchy(appDlls.ToArray()); + c.GetNode(typeof(AnonymousType).AssemblyQualifiedName); + + IConfiguration conf = TangFactory.GetTang().NewConfigurationBuilder(c).Build(); + IInjector injector = TangFactory.GetTang().NewInjector(conf); + var obj = injector.GetInstance<AnonymousType>(); + Assert.IsNotNull(obj); + + var cd = Directory.GetCurrentDirectory(); + Console.WriteLine(cd); + + ProtocolBufferClassHierarchy.Serialize(ClassHierarchyBinFileName, c); + IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize(ClassHierarchyBinFileName); + ch.GetNode(typeof(AnonymousType).AssemblyQualifiedName); + } + } +}
