1 package com.atlassian.vcache.internal.core;
2
3 import com.atlassian.vcache.internal.RequestContext;
4 import org.junit.Rule;
5 import org.junit.Test;
6 import org.junit.rules.ExpectedException;
7
8 import java.util.Optional;
9
10 import static org.hamcrest.Matchers.is;
11 import static org.hamcrest.Matchers.notNullValue;
12 import static org.junit.Assert.assertThat;
13
14 public class ThreadLocalRequestContextSupplierTest {
15 @Rule
16 public ExpectedException thrown = ExpectedException.none();
17
18 @Test
19 public void normal_flow() {
20 final ThreadLocalRequestContextSupplier supplier = ThreadLocalRequestContextSupplier.strictSupplier();
21
22 supplier.initThread("abc");
23
24 final RequestContext context = supplier.get();
25
26 assertThat(context, notNullValue());
27 assertThat(context.partitionIdentifier(), is("abc"));
28
29 supplier.clearThread();
30 }
31
32 @Test
33 public void get_not_init() {
34 final ThreadLocalRequestContextSupplier supplier = ThreadLocalRequestContextSupplier.strictSupplier();
35
36 thrown.expect(IllegalStateException.class);
37 thrown.expectMessage("Thread has not been initialised.");
38
39 final RequestContext context = supplier.get();
40 }
41
42 @Test
43 public void get_not_init_lenient() {
44 final ThreadLocalRequestContextSupplier supplier = ThreadLocalRequestContextSupplier.lenientSupplier(() -> "lenient");
45
46 final RequestContext context = supplier.get();
47
48 assertThat(context.partitionIdentifier(), is("lenient"));
49
50 final String value = context.computeIfAbsent("lost", () -> "keys");
51
52 assertThat(value, is("keys"));
53
54 final Optional<String> again = context.get("lost");
55
56 assertThat(again, is(Optional.<String>empty()));
57 }
58
59 @Test
60 public void init_double() {
61 final ThreadLocalRequestContextSupplier supplier = ThreadLocalRequestContextSupplier.strictSupplier();
62 supplier.initThread("abc");
63
64 thrown.expect(IllegalStateException.class);
65 thrown.expectMessage("Thread '" + Thread.currentThread().getName() + "' has already been initialised.");
66
67 supplier.initThread("def");
68 }
69
70 @Test
71 public void init_bad_name() {
72 final ThreadLocalRequestContextSupplier supplier = ThreadLocalRequestContextSupplier.strictSupplier();
73
74 thrown.expect(IllegalArgumentException.class);
75 thrown.expectMessage("Invalid partition identifier: :Oliver:");
76
77 supplier.initThread(":Oliver:");
78 }
79
80 @Test
81 public void clear_no_init() {
82 final ThreadLocalRequestContextSupplier supplier = ThreadLocalRequestContextSupplier.strictSupplier();
83
84 supplier.clearThread();
85 }
86 }