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