1 // 2 // Copyright (c) 2021 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // Full license text is available in 'licenses/MIT.txt'. 6 // 7 using NUnit.Framework; 8 using System; 9 using System.Collections.Generic; 10 using Antmicro.Renode.Core; 11 using Antmicro.Renode.Peripherals; 12 using Antmicro.Renode.Peripherals.Utilities; 13 14 namespace Antmicro.Renode.UnitTests 15 { 16 [TestFixture] 17 public class ByteArrayWithAccessTrackingTests 18 { 19 [SetUp] Setup()20 public void Setup() 21 { 22 testArray = new ByteArrayWithAccessTracking(new StubPeripheral(), 4, 4, "TestArray"); 23 } 24 25 [Test] ShouldAllowOnlyAccessWithWidthEqual4()26 public void ShouldAllowOnlyAccessWithWidthEqual4() 27 { 28 Assert.Throws<ArgumentException>(() => new ByteArrayWithAccessTracking(new StubPeripheral(), 4, 3, "WrongAccesWdithArray")); 29 Assert.Throws<ArgumentException>(() => new ByteArrayWithAccessTracking(new StubPeripheral(), 4, 2, "WrongAccesWdithArray")); 30 Assert.Throws<ArgumentException>(() => new ByteArrayWithAccessTracking(new StubPeripheral(), 4, 1, "WrongAccesWdithArray")); 31 } 32 33 [Test] HandleAccessingInputDataThroughRegisters()34 public void HandleAccessingInputDataThroughRegisters() 35 { 36 var firstWrite = new byte[] { 0x11, 0x22, 0x44, 0x88, 0x10, 0x20, 0x40, 0x80, 0x81, 0x42, 0x24, 0x18, 0x01, 0x02, 0x04, 0x08 }; 37 var secondWrite = new byte[] { 0x11, 0x22, 0x44, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0x42, 0x24, 0x18 }; 38 39 // Assert data are written with correct endianness (it should be reverted) 40 testArray.SetPart(0, 0x88442211); 41 testArray.SetPart(1, 0x80402010); 42 testArray.SetPart(2, 0x18244281); 43 testArray.SetPart(3, 0x08040201); 44 Assert.AreEqual(testArray.RetriveData(), firstWrite); 45 46 testArray.SetPart(0, 0x88442211); 47 testArray.SetPart(1, 0x0); 48 testArray.SetPart(2, 0x0); 49 testArray.SetPart(3, 0x18244281); 50 Assert.AreEqual(testArray.RetriveData(), secondWrite); 51 52 } 53 54 [Test] ShouldKnowIfNotAllPartsWritten()55 public void ShouldKnowIfNotAllPartsWritten() 56 { 57 Assert.AreEqual(false, testArray.AllDataWritten); 58 testArray.SetPart(0, 0x0); 59 Assert.AreEqual(false, testArray.AllDataWritten); 60 testArray.SetPart(1, 0x0); 61 Assert.AreEqual(false, testArray.AllDataWritten); 62 testArray.SetPart(2, 0x0); 63 Assert.AreEqual(false, testArray.AllDataWritten); 64 } 65 66 [Test] ShouldNotRetriveDataUntilAllPartsWritten()67 public void ShouldNotRetriveDataUntilAllPartsWritten() 68 { 69 testArray.SetPart(0, 0x0); 70 testArray.SetPart(1, 0x0); 71 testArray.SetPart(2, 0x0); 72 Assert.AreEqual(new byte[0], testArray.RetriveData()); 73 } 74 75 [Test] ShouldKnowIfAllPartsWritten()76 public void ShouldKnowIfAllPartsWritten() 77 { 78 testArray.SetPart(0, 0x0); 79 testArray.SetPart(1, 0x0); 80 testArray.SetPart(2, 0x0); 81 testArray.SetPart(3, 0x0); 82 83 Assert.AreEqual(true, testArray.AllDataWritten); 84 } 85 86 [Test] ShouldRetriveDataWhenAllWritten()87 public void ShouldRetriveDataWhenAllWritten() 88 { 89 testArray.SetPart(0, 0x0); 90 testArray.SetPart(1, 0x0); 91 testArray.SetPart(2, 0x0); 92 testArray.SetPart(3, 0x0); 93 Assert.AreNotEqual(new byte[0], testArray.RetriveData()); 94 } 95 96 [Test] ShouldBeAbleToPreserveTrackingWhenRetrivingData()97 public void ShouldBeAbleToPreserveTrackingWhenRetrivingData() 98 { 99 testArray.SetPart(0, 0x0); 100 testArray.SetPart(1, 0x0); 101 testArray.SetPart(2, 0x0); 102 testArray.SetPart(3, 0x0); 103 testArray.RetriveData(trackAccess: false); 104 Assert.AreEqual(true, testArray.AllDataWritten); 105 } 106 107 [Test] ShouldClearAccessTrackingAfterGettingNewData()108 public void ShouldClearAccessTrackingAfterGettingNewData() 109 { 110 testArray.SetPart(0, 0x0); 111 testArray.SetPart(1, 0x0); 112 testArray.SetPart(2, 0x0); 113 testArray.SetPart(3, 0x0); 114 // New data coming after all parts have been written 115 testArray.SetPart(3, 0x0); 116 Assert.AreEqual(false, testArray.AllDataWritten); 117 } 118 119 [Test] HandleAccessingOutputDataThroughRegisters()120 public void HandleAccessingOutputDataThroughRegisters() 121 { 122 var data = new byte[] { 0x1, 0x2, 0x4, 0x8, 0x11, 0x22, 0x44, 0x88, 0x10, 0x20, 0x40, 0x80, 0x81, 0x42, 0x24, 0x18 }; 123 124 testArray.SetArrayTo(data); 125 126 Assert.AreEqual(0x08040201, testArray.GetPartAsDoubleWord(0)); 127 Assert.AreEqual(0x88442211, testArray.GetPartAsDoubleWord(1)); 128 Assert.AreEqual(0x80402010, testArray.GetPartAsDoubleWord(2)); 129 Assert.AreEqual(0x18244281, testArray.GetPartAsDoubleWord(3)); 130 } 131 132 [Test] ShouldThrowWhenSettingArrayWithWrongLength()133 public void ShouldThrowWhenSettingArrayWithWrongLength() 134 { 135 var data = new byte[6]; 136 Assert.Throws<ArgumentException>(() => testArray.SetArrayTo(data)); 137 } 138 139 [Test] ShouldThrowWhenTryingToGetUnexistingPart()140 public void ShouldThrowWhenTryingToGetUnexistingPart() 141 { 142 Assert.Throws<ArgumentOutOfRangeException>(() => testArray.SetPart(17, 0x0)); 143 } 144 145 private ByteArrayWithAccessTracking testArray; 146 147 private class StubPeripheral : IPeripheral 148 { StubPeripheral()149 public StubPeripheral() 150 { 151 } 152 Reset()153 public void Reset() 154 { 155 } 156 } 157 } 158 } 159 160