blob: 12b22c5a7f6cf0040502858a0cafd9d33ab1fc79 [file] [log] [blame]
Jiri Simsad7616c92015-03-24 23:44:30 -07001// Copyright 2015 The Vanadium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Jiri Simsa5293dcb2014-05-10 09:56:38 -07005package concurrency
6
7import (
Jiri Simsa5293dcb2014-05-10 09:56:38 -07008 "testing"
Jiri Simsa870ddd62014-06-27 14:56:58 -07009
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070010 "v.io/x/ref/test/testutil"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070011)
12
Suharsh Sivakumard19c95d2015-02-19 14:44:50 -080013//go:generate v23 test generate
Asim Shankarc920db32014-10-16 19:18:21 -070014
Jiri Simsa5293dcb2014-05-10 09:56:38 -070015// TestClone checks the clone() method of a clock.
16func TestClone(t *testing.T) {
Jiri Simsa95ab2972015-07-01 12:35:57 -070017 testutil.InitRandGenerator(t.Logf)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070018 c1 := newClock()
Cosmos Nicolaouc818b802015-06-05 15:52:45 -070019 c1[0] = testutil.RandomIntn(100)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070020 c2 := c1.clone()
21 c1[0]++
22 if c2[0] != c1[0]-1 {
23 t.Errorf("Unexpected clock value: expected %v, got %v", c1[0]-1, c2[0])
24 }
25}
26
27// TestEquality checks the equals() method of a clock.
28func TestEquality(t *testing.T) {
29 c1, c2 := newClock(), newClock()
30 for i := TID(0); i < TID(10); i++ {
Cosmos Nicolaouc818b802015-06-05 15:52:45 -070031 c1[i] = testutil.RandomIntn(100)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070032 c2[i] = c1[i]
33 }
34 if !c1.equals(c2) {
35 t.Errorf("Unexpected inequality between %v and %v", c1, c2)
36 }
37}
38
39// TestHappensBefore checks the happensBefore() method of a clock.
40func TestHappensBefore(t *testing.T) {
41 c1, c2, c3 := newClock(), newClock(), newClock()
42 for i := TID(0); i < TID(10); i++ {
Cosmos Nicolaouc818b802015-06-05 15:52:45 -070043 c1[i] = testutil.RandomIntn(100)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070044 if i%2 == 0 {
45 c2[i] = c1[i] + 1
46 c3[i] = c1[i] + 1
47 } else {
48 c2[i] = c1[i]
49 c3[i] = c2[i] - 1
50 }
51 }
52 if !c1.happensBefore(c1) {
53 t.Errorf("Unexpected outcome of %v.happensBefore(%v): expected %v, got %v", c1, c1, true, false)
54 }
55 if !c1.happensBefore(c2) {
56 t.Errorf("Unexpected outcome of %v.happensBefore(%v): expected %v, got %v", c1, c2, true, false)
57 }
58 if c2.happensBefore(c1) {
59 t.Errorf("Unexpected outcome of %v.happensBefore(%v): expected %v, got %v", c2, c1, false, true)
60 }
61 if c1.happensBefore(c3) {
62 t.Errorf("Unexpected outcome of %v.happensBefore(%v): expected %v, got %v", c1, c3, false, true)
63 }
64 if c3.happensBefore(c1) {
65 t.Errorf("Unexpected outcome of %v.happensBefore(%v): expected %v, got %v", c3, c1, false, true)
66 }
67}
68
69// TestMerge checks the merge() method of a clock.
70func TestMerge(t *testing.T) {
71 c1, c2 := newClock(), newClock()
72 for i := TID(0); i < TID(10); i++ {
Cosmos Nicolaouc818b802015-06-05 15:52:45 -070073 c1[i] = testutil.RandomIntn(100)
74 c2[i] = testutil.RandomIntn(100)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070075 }
76 c1.merge(c2)
77 for i := TID(0); i < TID(10); i++ {
78 if c1[i] < c2[i] {
79 t.Errorf("Unexpected order between %v and %v: expected '>=', got '<'", c1[i], c2[i])
80 }
81 }
82}